2016-12-22 4 views
1

Я настроил сервер базы данных Oracle 11g для работы с SSL с использованием кошелька и самоподписанного сертификата. Протестировал его локальным клиентом (sqlplus), и он работает без каких-либо проблем. Теперь я пытаюсь подключить базу данных с помощью Java JDBC. В настоящее время я получаю сообщение об ошибке:Java JDBC не может подключиться к базе данных Oracle с помощью SSL

Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to 
find valid certification path to requested target 

Вот мой код:

public static void main(String[] args) 
{ 
    Connection connection = null; 

    String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=192.168.200.191)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=VDB)))"; 

    Properties props = new Properties(); 
    props.setProperty("user", "dbuser"); 
    props.setProperty("password", "dbpass"); 
    props.setProperty("oracle.net.ssl_cipher_suites","(SSL_RSA_WITH_3DES_EDE_CBC_SHA)"); 

    /* Load the database driver */ 
    try 
    { 
     DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); 
     connection = DriverManager.getConnection(url,props); 
     if (connection != null) { 
      System.out.println("You made it, take control your database now!"); 
     } else { 
      System.out.println("Failed to make connection!"); 
     } 
    } 
    catch (SQLException ex) { 
     ex.printStackTrace(); 
    } 
} 

Я сделал некоторые дополнительные исследования, и обнаружил, что если кошелек выполнен в виде «auto_login», я могу попробовать следующее:

Connection connection = null; 

    String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=192.168.200.191)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=VDB)))"; 

    Properties props = new Properties(); 
    props.setProperty("user", "dbuser"); 
    props.setProperty("password", "dbpass"); 
    props.setProperty("javax.net.ssl.trustStore", "C:\\oracle\\wallet\\cwallet.sso"); 
    props.setProperty("javax.net.ssl.trustStoreType","SSO"); 

    /* Load the database driver */ 
    try 
    { 
     DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); 
     connection = DriverManager.getConnection(url,props); 
     if (connection != null) { 
      System.out.println("You made it, take control your database now!"); 
     } else { 
      System.out.println("Failed to make connection!"); 
     } 
    } 
    catch (SQLException ex) { 
    ex.printStackTrace(); 
} 

В этом случае, я получаю:

java.security.NoSuchAlgorithmException: SSO KeyStore not available 

Я добавил 3 Баночки: oraclepki.jar, osdt_cert.jar, osdt_core.jar Попытались запустить последнюю версию кода, получить исключение:

java.lang.ClassNotFoundException: com.phaos.crypto.AuthenticationException 

Возможно, я должен указать местоположение бумажника? как я это сделал в файле tnsnames.ora? или указать сертификат CN?

Пожалуйста, сообщите, спасибо.

ответ

0

Найдено решение, так как я использую SSO необходимо указать как хранилище ключей и доверенных сертификатов.

 Connection connection = null; 
    String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=192.168.200.191)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=NNVSDB)))"; 

    Properties props = new Properties(); 
    props.setProperty("user", "dbuser"); 
    props.setProperty("password", "dbpass"); 

    //Single sign on 
    props.setProperty("javax.net.ssl.trustStore", "C:\\oracle\\wallet\\cwallet.sso"); 
    props.setProperty("javax.net.ssl.trustStoreType","SSO"); 
    props.setProperty("javax.net.ssl.keyStore","C:\\oracle\\wallet\\cwallet.sso"); 
    props.setProperty("javax.net.ssl.keyStoreType","SSO"); 
    props.setProperty("oracle.net.authentication_services","(TCPS)"); 

    /* Load the database driver */ 
    try 
    { 
     Security.addProvider(new oracle.security.pki.OraclePKIProvider()); 
     DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); 
     connection = DriverManager.getConnection(url,props); 
     if (connection != null) { 
      System.out.println("You made it, take control your database now!"); 
     } else { 
      System.out.println("Failed to make connection!"); 
     } 
    } 
    catch (SQLException ex) { 
    ex.printStackTrace(); 
} 
0

JVM пытается установить цепочку доверия сертификата сервера к любым известным доверенным ЦС. Вы можете получить сертификат от центра сертификации, которому доверяет ваш TrustStore по умолчанию Java, или вы можете предоставить свой собственный сертификат CA (тот, который вы подписали самозаверяющий сертификат), на вашу JVM на generating your own TrustStore. Затем вы должны передать TrustStore, например. используя аргумент командной строки -Djavax.net.ssl.trustStore= при запуске приложения.

Имейте в виду, что передача пользовательского TrustStore требует либо добавления всех центров сертификации, которые содержатся в вашем TrustStore по умолчанию JRE, либо вы живете с тем фактом, что цепочки доверия не могут быть установлены ни в одном сертификате, не выпущенном вашим собственным центром сертификации ,

Третий вариант добавляет ваш собственный сертификат ЦС в глобальный TrustStore вашей системы, который приводит к любому приложению Java, принимающему сертификаты от вашего центра сертификации. Это ярлык, но может быть не в ваших интересах, если вам требуется строгое разделение центров сертификации.

+0

Должен ли я генерировать TrustStore только для сертификата сервера? или сертификат клиента и сервера? Кроме того, мне нужна еще одна банка, кроме ojdbc6.jar? –

+0

Если ваш клиент должен пройти аутентификацию с использованием клиентского сертификата, который вы поместили бы в KeyStore (это файл того же типа, но он служит другой цели). В вашем TrustStore вам понадобится только сертификат (ы), необходимый для установления цепочки доверия для сертификата сервера (который похож на идентификационную карту, которую сервер представляет вашему клиенту). Таким образом, в вашем случае требуемым сертификатом для установления указанной цепи доверия является сертификат CA, используемый для подписи сертификата вашего сервера. – oschlueter

+0

Мой сертификат сервера самоподписан, поэтому мне просто нужно импортировать его в TrustStore? –

1

Использование служб или ресурсов, требующих сертификатов в вашем приложении, требует, чтобы вы каким-то образом доверяли сертификату или самому сертификату. В этом случае, я думаю, вам придется доверять самому сертификату, поскольку он самоподписан и не выпущен известным CA (уже доверенным магазином доверия в комплекте с JRE, который вы используете).

Чтобы сделать это, экспортируйте сертификат, который вы используете вместе с вашей базой данных, и найдите файл под названием «cacerts». Файл существует в папке установки jdk. Пример:

/path/to/jdk/jre/lib/security/cacerts 

Проще всего сделать, это просто импортировать сертификат на этот файл (вы можете использовать некоторые команды, чтобы сделать это, или если вы ленивы, как я - скачать KSE и нажмите Import- кнопка: http://keystore-explorer.org/).Вы также можете задать свой собственный трастовый-магазин, используя свойства, упомянутые здесь:

https://docs.oracle.com/cd/E19830-01/819-4712/ablqw/index.html

Если вы решили использовать собственный трастовый-магазин, у вас есть больше контроля в отношении к cacerts - как будто вы выбираете для обновления к новой установке jdk, эта установка будет использовать cacerts, выпущенную с помощью jdk :-).

В любом случае. Надеюсь, это немного помогло.

0

Я думаю, что ссылка ниже может быть полезна для вас.

http://docs.oracle.com/cd/B19306_01/java.102/b14355/sslthin.htm#BABHFBJD

+0

Я добавил следующий props.setProperty ("oracle.net.wallet_location", "(SOURCE = (METHOD = файл) (METHOD_DATA = (DIRECTORY = c: \\ oracle \\ кошелек)))); А теперь я получаю: «java.sql.SQLException:. Классы ИПК не найдено Чтобы использовать 'соединение /' функциональность, oraclepki.jar должен быть в пути к классам: java.lang.NoClassDefFoundError: оракул/s ecurity/pki/OracleWallet « Возможно, мне нужна еще одна банка? –

+0

На самом деле, я не реализовал этот тип функции. Я только что нашел одну статью в Google, и я ее прочитал. Поэтому, я думаю, это может помочь вам. Итак, я даю тебе. – bugfix

+0

Хорошо, я вижу, спасибо. –

Смежные вопросы