JAVA - SSL - 客户端证书

4
我正在使用JAVA开发WS客户端,但在SSL身份验证方面遇到了问题。WS是在WCF上创建的,我无法访问服务器,它们通过HTTPS工作并使用需要先安装在客户端上的客户端证书。服务器人员向我发送了一个PFX证书,我成功地将其安装在操作系统上(我正在使用OS X),然后我可以通过浏览器(Safari或FF)访问WS(之前无法访问WS)。我以为操作系统中的任何应用程序都会使用这些证书,但当我尝试我的JAVA应用程序时,它却不起作用;首先抛出以下错误:
"javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"
我通过将证书导出为CER文件,并使用keytool命令行工具将证书添加到JAVA使用的“cacerts”密钥库中来解决了这个问题。但在此错误消失后,以下错误开始出现:“403,禁止访问”。显然,这是因为它没有使用站点的SSL客户端证书,但我一直没有找到一种方法将其发送给它。如果有帮助,请告知。
以下是我用于发布到WS的代码:
URL url = new URL(p_url);

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setDoOutput(true);

conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", contentType);

OutputStream out = conn.getOutputStream(); // on this line it shows the error
3个回答

5
您可以创建一个特定的 SSLContext (使用一个初始化了包含客户端证书+私钥的密钥库的 KeyManager),从中派生出一个 SSLSocketFactory,然后将其设置到您的 HttpsURLConnection 中,或者使用全局设置。
您可以设置以下系统属性(用于全局设置):
  • javax.net.ssl.keyStore=path/to/keystore.pfx
  • javax.net.ssl.keyStoreType=PKCS12
  • javax.net.ssl.keyStorePassword=xxxxxxxxx
另外,您可以根据这个答案中所述的方法创建自己的 KeyManagerFactory/KeyManager
由于您已经在您的 cacerts 中导入了服务器证书,请在 SSLContext.init()TrustManager[] 参数中使用 null(它会选择默认值)。
此外,由于您在使用 OSX,您可以直接使用 KeychainStore。为此,请使用 ....keyStore=NONEkeyStoreType=KeychainStorekeyStorePassword=-(任何密码都可以,因为当您需要从操作系统访问密钥时,将授予对其的访问权限)。但是,如果您的存储中有超过一个证书+私钥,则可能会失败(请参阅此问题)。

1
如果您对密钥库/信任库感到困惑,您可能需要阅读这个:https://dev59.com/eWw15IYBdhLWcg3w4_tL#6341566 - Bruno
2
谢谢,实际上我已经尝试过了,但是我漏掉了keyStoreType=PKCS12这个关键参数。 - user1161538

0

你需要在你的Java应用程序中加载他们发送给你的密钥库。
你可以将它作为文件从文件系统中加载到一个Keystore对象中并使用它。阅读这个example,特别是关于KeyManagercreateKeyManagers方法的部分。

另一个选择是从Windows中加载密钥库。请阅读有关Windows-MY提供程序的内容。


看起来OP已经做到了。请阅读他问题中的第二段。 - kosa

0

看起来你可能需要设置自己的SSL SocketFactory。

http://vafer.org/blog/20061010073725/

我认为自2006年以来情况已经变得更好了,所以您可能只需要在命令行上指定一堆属性:

https://dev59.com/0HNA5IYBdhLWcg3wpvtg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接