JAVA - SSL - 客户端证书

use*_*538 4 java ssl https web-services client-certificates

我一直在使用JAVA开发一个WS客户端,我遇到了SSL身份验证问题.WS是在WCF上创建的,我无法访问服务器,它们通过HTTPS工作并使用需要首先在客户端上安装的客户端证书.服务器人员发给我一个PFX证书,我成功安装在操作系统上(我正在使用OS X)然后我可以通过浏览器访问WS(Safari或FF都是我尝试过的,以前无法访问WSs ).我认为操作系统中的任何应用程序都会使用此证书,但是当我尝试使用我的JAVA应用程序时,它不起作用; 首先抛出以下错误:

"javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到所请求目标的有效证书路径"

我通过将证书导出到CER文件并使用keytool命令行工具将证书添加到JAVA使用的"cacerts"keyStore中来解决了这个问题.但是在这个错误消失后,下面开始出现:"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
Run Code Online (Sandbox Code Playgroud)

Bru*_*uno 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,使用nullTrustManager[]的参数SSLContext.init()(它会拿起默认值).

此外,由于您使用的是OSX,因此可以KeychainStore直接使用.要做到这一点,使用....keyStore=NONE,keyStoreType=KeychainStorekeyStorePassword=-(任何密码都会做,因为当你从操作系统需要访问密钥将被授予).不过,我不确定它是否适用于Lion.请注意,如果商店中有多个证书+私钥,则可能会失败(请参阅此问题).

  • 谢谢,我实际上已经尝试过,但我错过了keyStoreType = PKCS12. (2认同)