如何将Windows Keystore(MCS)与JDBC一起使用?

Ben*_*Ben 5 java ssl jdbc jsse oracle11g

我正在尝试创建一个PKI用于身份验证的Java应用程序.我需要能够从Microsoft证书存储(MCS)检索证书并将其传递到Oracle数据库(11.2).

我正在使用jdbc:oracle:thin驱动程序进行连接.在谷歌上花了相当长的一段时间后,我已经空了.我发现要更改不同的属性(取决于文章):

  • 设置属性 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);
Run Code Online (Sandbox Code Playgroud)

此代码失败,但有异常:

java.sql.SQLRecoverableException: IOException: The Network Adapter could not establish the connection
Run Code Online (Sandbox Code Playgroud)

Bru*_*uno 3

这篇文章(“使用 Java SE 6 技术在本机平台中利用安全性”,作者:Valerie Peng,2006 年 10 月)应该会提供更多详细信息。尽管它不使用系统属性,但Windows-MY显然是一种存储类型并且不是基于文件的。因此,javax.net.ssl.keyStoreType应该Windows-MY并且javax.net.ssl.keyStore应该设置为NONE(大写可能很重要),请参阅JSSE 参考指南(自定义)

javax.net.ssl.keyStore系统属性

请注意,可以指定值 NONE。如果密钥库不是基于文件的(例如,它驻留在硬件令牌中),则此设置是合适的。

如果默认 Java 信任存储区不信任您的服务器证书,您可能还需要以类似的方式配置信任存储区。