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 是否合适)。

4

3 回答 3

2

我不是 C# 程序员,但我假设代码使用 HTTPS/TLS 进行调用并提供客户端证书进行身份验证?Aka,您不是在问如何使用 WS-Security,对吧?

在那种情况下,我认为这里这里的答案对你有用。您需要使用 openssl 实用程序将您的证书导入 p12 客户端密钥库。如果您的服务器使用非标准 CA 或自签名证书,您还需要使用这些证书设置客户端信任库。

在这一点上,看看我已经链接的问题:您需要指定一大堆 JVM 参数。最后,尝试再次调用(使用标准 Java 对象或 httpclient)。如果您的信任库正确,客户端应该接受服务器证书,并且服务器应该请求客户端证书。如果您的密钥库设置正确,则客户端使用 X.509 客户端证书进行身份验证,您就可以开始使用了。

于 2010-05-26T21:22:43.203 回答
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系统属性。)

于 2010-07-06T02:59:02.320 回答
1

我会推荐 Apache Commons 的开源HttpClient库。涵盖此用例和许多其他用例。

于 2010-05-26T20:57:36.237 回答