编程语言
首页 > 编程语言> > JAVA – SSL – 客户端证书

JAVA – SSL – 客户端证书

作者:互联网

我一直在使用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

解决方法:

您可以创建特定的SSLContext(使用通过包含客户端证书私钥的密钥库初始化的KeyManager),从中派生SSLSocketFactory,您可以将其设置到HttpsURLConnection中,或使用全局设置.

您可以设置以下系统属性(对于全局设置):

> javax.net.ssl.keyStore = path / to / keystore.pfx
> javax.net.ssl.keyStoreType = PKCS12
> javax.net.ssl.keyStorePassword = xxxxxxxxx

或者,您可以创建自己的KeyManagerFactory / KeyManager,如this answer中所述.

由于您已在cacerts中导入服务器证书,因此对SSLContext.init()的TrustManager []参数使用null(它将获取默认值).

此外,由于您使用的是OSX,因此可以直接使用KeychainStore.为此,请使用…. keyStore = NONE,keyStoreType = KeychainStore和keyStorePassword = – (任何密码都可以,因为当您从操作系统需要时,将授予对密钥的访问权限).不过,我不确定它是否适用于Lion.请注意,如果商店中有多个证书私钥,则可能会失败(请参阅this issue).

标签:java,https,ssl,web-services,client-certificates
来源: https://codeday.me/bug/20190621/1251469.html