4

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

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

我通过将证书导出到 CER 文件并使用 keytool 命令行工具将证书添加到“cacerts”keyStore JAVA 使用来解决这个问题。但在此错误消失后,以下开始出现:“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
4

3 回答 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使用参数 of (它将选择默认值)。nullTrustManager[]SSLContext.init()

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

于 2012-01-20T23:08:42.683 回答
0

看起来您可能需要设置自己的 SSL SocketFactory,

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

我认为自 2006 年以来情况有所好转,因此您可能只需要在命令行上指定一堆属性:

http://stackoverflow.com/questions/875467/java-client-certificates-over-https-ssl
于 2012-01-20T22:20:43.770 回答
0

您需要在您的 java 应用程序中加载他们发送给您的密钥库。
您可以将其作为文件从文件系统加载到Keystore对象中并使用它。阅读这个例子,尤其是关于KeyManageriecreateKeyManagers方法的部分。

另一种选择是从 Windows 加载密钥库。阅读有关Windows-MY提供程序的信息

于 2012-01-20T22:21:11.880 回答