我正在使用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的代码:
"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