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

如何使用Java中的X.509证书对HTTP请求进行签名?,java,http,https,x509certificate,client-certificates,Java,Http,Https,X509certificate,Client Certificates,如何使用Java执行HTTP请求并使用X.509证书对其进行签名 我通常用C语言编程。现在,我想做的是与以下类似的事情,仅在Java中: private HttpWebRequest CreateRequest(Uri uri, X509Certificate2 cert) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); request.ClientCertificates.A

如何使用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是否合适)。

我建议使用Apache Commons的开源库。介绍此用例和其他许多用例。

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

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


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

看起来您正在尝试使用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());
其他库允许您稍微不同地设置
SSLContext
KeyStore
,但原则应该相同


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

这些建议中的任何一个有效吗?已修复。希望有帮助!