Как использовать Windows Keystore (MCS) с JDBC? - PullRequest
5 голосов
/ 07 марта 2012

Я пытаюсь создать приложение Java, которое использует PKI для аутентификации.Мне нужно иметь возможность получить сертификат из хранилища сертификатов Microsoft (MCS) и передать его в базу данных Oracle (11.2).

Я подключаюсь с помощью драйвера jdbc:oracle:thin.Потратив довольно много времени на Google, я пришел пустой.Я нашел разные свойства для изменения (в зависимости от статьи):

  • установить свойство javax.net.ssl.keyStoreType = "Windows-MY"
  • установить javax.net.ssl.keyStore = "Windows-MY"
  • javax.net.ssl.keyStore should be set to "None"(если использовать пользовательский KeyManager, который, я не верю, будет работать, так как к тому времени, когда он попадет в мой пользовательский KeyManager, мне уже будут выданы сертификаты из хранилища ключей, указанного в свойствах соединения).

Конечно, все эти люди претендуют на успех, но ничего не помогло мне.Я испробовал каждый пример, который мне удалось найти без удачи.Мне удалось успешно пройти аутентификацию, когда я использовал кошельки Oracle, поэтому я знаю, что мои сертификаты в порядке.Если кто-то делал это раньше и готов опубликовать какой-то код, это было бы здорово.

Я знаю, что большинство людей используют хранилище ключей Windows с веб-сайтом и поэтому создают свой собственный SSLContext, но я не могу себе представить, что я единственный, кто хотел сделать это с помощью JDBC (который, насколько я знаю,не позволяет мне предоставить ему SSLContext).

Это код, который, по моему мнению, должен работать, но не работает.

DriverManager.registerDriver)new OracleDriver());
String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=host)(PORT=2484))(CONNECT_DATA=(SERVICE_NAME=someName))(SECURITY= (SSL_SERVER_CERT_DN=\"CN=TESTSERVER\")))";

java.util.Properties props = new java.util.Properties();
props.setProperty("javax.net.ssl.keyStoreType", "Windows-MY");
props.setProperty("javax.net.ssl.keyStore", "NONE");
props.setProperty("javax.net.ssl.trustStoreType", "Windows-ROOT");
props.setProperty("javax.net.ssl.trustStore", "NONE");

props.setProperty("oracle.net.ssl_server_dn_match", "true");
props.setProperty("oracle.net.authentication_services", "(TCPS)");
Connection conn = DriverManager.getConnection(url, props);

Этот код не выполняется, за исключением:

java.sql.SQLRecoverableException: IOException: The Network Adapter could not establish the connection

1 Ответ

2 голосов
/ 07 марта 2012

Эта статья должна дать вам более подробную информацию.Хотя он не использует системные свойства, Windows-MY явно относится к типу магазина и не основан на файлах.Поэтому javax.net.ssl.keyStoreType должно быть Windows-MY, а javax.net.ssl.keyStore должно быть установлено на NONE (может иметь значение верхний регистр), см. Руководство по справке JSSE (настройка) :

javax.net.ssl.keyStore системное свойство

Обратите внимание, что может быть указано значение NONE.Этот параметр подходит, если хранилище ключей не основано на файле (например, оно находится в аппаратном токене).

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

...