2010-05-26 90 views
6

如何执行HTTP请求并使用Java X.509证书签名呢?如何在Java中使用X.509证书签署HTTP请求?

我通常用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是偶数为宜)。

+0

你俩的这些建议的工作? – jasonmp85 2010-06-02 11:21:10

回答

1

我会推荐Apache Commons的开源HttpClient库。涵盖了这个用例以及其他许多内容。

+0

404未找到...... – Tomas 2014-01-29 15:44:15

+1

固定。希望能帮助到你! – 2014-01-29 17:52:57

2

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

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

在这一点上,看看我已经链接的问题:你需要指定一整个JVM参数。最后,再次尝试拨打电话(使用标准Java对象或httpclient)。如果您的信任库正确且服务器应请求客户端证书,则客户端应接受服务器证书。如果您的密钥库设置正确,则客户端使用X.509客户端证书进行身份验证,您将可以轻松前往。

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系统属性,如果它是适当的。)