Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将Windows密钥库(MCS)与JDBC一起使用?_Java_Ssl_Jdbc_Oracle11g_Jsse - Fatal编程技术网

Java 如何将Windows密钥库(MCS)与JDBC一起使用?

Java 如何将Windows密钥库(MCS)与JDBC一起使用?,java,ssl,jdbc,oracle11g,jsse,Java,Ssl,Jdbc,Oracle11g,Jsse,我正在尝试创建一个使用PKI进行身份验证的java应用程序。我需要能够从MicrosoftCertificateStore(MCS)检索证书并将其传递到Oracle数据库(11.2) 我使用jdbc:oracle:thin驱动程序进行连接。在谷歌上花了相当长的时间后,我发现自己一无所获。 我发现不同的属性需要更改(取决于文章): 设置属性javax.net.ssl.keyStoreType=“Windows MY” 设置javax.net.ssl.keyStore=“Windows MY” j

我正在尝试创建一个使用
PKI
进行身份验证的java应用程序。我需要能够从MicrosoftCertificateStore(MCS)检索证书并将其传递到Oracle数据库(11.2)

我使用
jdbc:oracle:thin
驱动程序进行连接。在谷歌上花了相当长的时间后,我发现自己一无所获。 我发现不同的属性需要更改(取决于文章):

  • 设置属性javax.net.ssl.keyStoreType=“Windows MY”
  • 设置
    javax.net.ssl.keyStore=“Windows MY”
  • javax.net.ssl.keyStore应设置为“None”
    (如果使用自定义KeyManager,我不相信它会起作用,因为当它进入我的自定义KeyManager时,我已经从连接属性中指定的密钥库获得了证书)
当然,所有这些人都声称自己成功了,但对我来说没有任何效果。我尝试了所有我能找到的例子,但都没有运气。当我使用Oracle Wallet时,我能够成功地进行身份验证,因此我知道我的证书没有问题。如果有人曾经这样做过,并且愿意发布一些代码,那就太好了

我知道大多数人都在网站上使用Windows密钥库,因此都在创建自己的SSLContext,但我无法想象我是唯一一个想使用JDBC来实现这一点的人(据我所知,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
应该给你更多的细节。虽然它不使用系统属性,
Windows MY
显然是一种存储类型,它不是基于文件的。因此,
javax.net.ssl.keyStoreType
应该是
Windows MY
,而
javax.net.ssl.keyStore
应该设置为
NONE
(大写可能很重要),请参见:

javax.net.ssl.keyStore
系统属性

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


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

感谢您的快速响应。我读了这两篇文章,但仍然没有任何运气。我已经用我尝试过的代码和当前的错误消息修改了我的原始帖子。如果驱动程序没有在JDBC驱动程序实现中遵循JSSE Ref指南,我不会感到惊讶。如果可以(并且不影响应用程序的其余部分),我会尝试将
javax.net.ssl
属性设置为全局系统属性,并将这些JDBC属性保留为空:在这种情况下,JDBC驱动程序可能会使用默认的
SSLSocketFactory
。我尝试了,但仍然不起作用。我注意到我没有从
System.setProperty(“javax.net.debug”、“SSL”)获得任何调试输出
因此在握手过程中似乎没有太大进展。不要对非代码的文本使用代码格式。