如何通过 JDBC 使用 Windows 密钥库 (MCS)?

问题描述 投票:0回答:1

我正在尝试创建一个使用

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
java ssl jdbc oracle11g jsse
1个回答
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 信任存储区的信任,您可能还需要以类似的方式配置信任存储区。

© www.soinside.com 2019 - 2024. All rights reserved.