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

Posted

技术标签:

【中文标题】如何将 Windows 密钥库 (MCS) 与 JDBC 一起使用?【英文标题】:How to use the Windows Keystore (MCS) with JDBC? 【发布时间】:2012-03-24 08:49:01 【问题描述】:

我正在尝试创建一个使用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);

此代码失败并出现异常:

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

【问题讨论】:

不要对非代码文本使用代码格式。 【参考方案1】:

This article 应该提供更多详细信息。虽然它不使用系统属性,但Windows-MY 显然是一种存储类型,它不是基于文件的。因此,javax.net.ssl.keyStoreType 应为 Windows-MYjavax.net.ssl.keyStore 应设置为 NONE(大写可能很重要),请参阅 JSSE Ref Guide (Customization):

javax.net.ssl.keyStore系统属性

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

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

【讨论】:

感谢您的快速回复。我已经阅读了这两篇文章,但仍然没有任何运气。我已经使用我尝试过的代码和当前的错误消息修改了我的原始帖子。 如果驱动程序在 JDBC 驱动程序实现中没有遵循 JSSE 参考指南,我不会感到惊讶。如果可以(并且如果它不会干扰应用程序的其余部分),我会尝试将 javax.net.ssl 属性设置为全局系统属性,并将这些 JDBC 属性留空:JDBC 驱动程序可能会使用默认值SSLSocketFactory 在这种情况下。 我试过了,还是不行。我注意到我没有从System.setProperty("javax.net.debug", "SSL"); 得到任何调试输出,所以在握手过程中似乎并没有走得太远。

以上是关于如何将 Windows 密钥库 (MCS) 与 JDBC 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

在VSTS上使用多个SSH密钥

如何将 git 子模块与 Bitbucket 管道一起使用?

如何不使用 Javascript OAuth 库公开您的密钥?

如何不使用 Javascript OAuth 库公开您的密钥?

Azure 密钥保管库加密

Tomcat HTTPS 密钥库证书