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)
您可以创建一个特定的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
,使用null
了TrustManager[]
的参数SSLContext.init()
(它会拿起默认值).
此外,由于您使用的是OSX,因此可以KeychainStore
直接使用.要做到这一点,使用....keyStore=NONE
,keyStoreType=KeychainStore
和keyStorePassword=-
(任何密码都会做,因为当你从操作系统需要访问密钥将被授予).不过,我不确定它是否适用于Lion.请注意,如果商店中有多个证书+私钥,则可能会失败(请参阅此问题).
归档时间: |
|
查看次数: |
10787 次 |
最近记录: |