Я настроил сервер базы данных 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?
Пожалуйста, сообщите, спасибо.
Должен ли я генерировать TrustStore только для сертификата сервера? или сертификат клиента и сервера? Кроме того, мне нужна еще одна банка, кроме ojdbc6.jar? –
Если ваш клиент должен пройти аутентификацию с использованием клиентского сертификата, который вы поместили бы в KeyStore (это файл того же типа, но он служит другой цели). В вашем TrustStore вам понадобится только сертификат (ы), необходимый для установления цепочки доверия для сертификата сервера (который похож на идентификационную карту, которую сервер представляет вашему клиенту). Таким образом, в вашем случае требуемым сертификатом для установления указанной цепи доверия является сертификат CA, используемый для подписи сертификата вашего сервера. – oschlueter
Мой сертификат сервера самоподписан, поэтому мне просто нужно импортировать его в TrustStore? –