如何使用Java对HTTP请求进行X.509证书签名?

7

我该如何使用Java执行HTTP请求并用X.509证书签名?

我通常使用C#进行编程。现在,我想要做的是类似于以下内容的事情,只不过是在Java中实现:

 private HttpWebRequest CreateRequest(Uri uri, X509Certificate2 cert) 
 {
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
     request.ClientCertificates.Add(cert);
     /* ... */
     return request;
 }

在Java中,我创建了一个java.security.cert.X509Certificate实例,但我不知道如何将其与HTTP请求相关联。我可以使用java.net.URL实例创建HTTP请求,但似乎无法将我的证书与该实例关联(而且我不确定是否适用于使用java.net.URL)。


这些建议中的任何一个起作用了吗? - jasonmp85
3个回答

2
我不是C#程序员,但我认为这段代码使用HTTPS/TLS进行调用并提供客户端证书进行身份验证?也就是说,您不是在询问如何使用WS-Security,对吗?
在这种情况下,我认为这里这里的答案会对您有所帮助。您需要使用openssl实用程序将您的证书导入p12客户端密钥库。如果您的服务器使用非标准CA或自签名证书,则还需要设置客户端信任库并添加这些证书。
此时,请查看我链接的问题:您需要指定一整套JVM参数。最后,尝试再次调用(使用标准Java对象或httpclient)。如果您的信任库正确且服务器接受了客户端证书,客户端应该接受服务器证书,您就可以开始了。

1

看起来你正在尝试使用客户端证书认证的HTTPS。我假设你的服务器已经配置了这个请求(因为客户端证书只能由服务器请求)。

在Java中,java.security.cert.X509Certificate实际上只是证书(公钥证书,没有私钥)。在客户端,你需要将私钥与其配置在一起。 假设你的私钥和证书在一个密钥库中(为了简化,我假设在该密钥库中只有一个适当的证书及其私钥,可能还有其他证书链),并且你正在使用默认的信任库:

KeyStore ks = ...
/* load the keystore */

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, password);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), null, null);

URL url = new URL("https://example/");
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();

connection.setSSLSocketFactory(sslContext.getSSLSocketFactory());

其他的库可能会允许您略微不同地设置SSLContextKeyStore,但原则应该是相同的。

(如果适用的话,您也可以使用javax.net.ssl.keyStore系统属性。)


1
我建议使用Apache Commons的开源HttpClient库。它涵盖了这种用例和许多其他用例。

1
已修复。希望能对您有所帮助! - Peter Bratton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接