簡體   English   中英

如何使用Java中的X.509證書簽署HTTP請求?

[英]How do I sign a HTTP request with a X.509 certificate in Java?

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

我不是C#程序員,但我假設代碼使用HTTPS / TLS進行調用並提供客戶端證書進行身份驗證? Aka,你不是在問如何使用WS-Security,對嗎?

在這種情況下,我認為這里這里的答案對你有用。 您需要使用openssl實用程序將證書導入p12客戶端密鑰庫。 如果您的服務器使用的是非標准CA或自簽名證書,則還需要使用這些證書設置客戶端信任庫。

在這一點上,看看我鏈接的問題:你需要指定一大堆JVM參數。 最后,嘗試再次進行調用(使用標准Java對象或httpclient)。 如果您的信任庫是正確的,並且服務器應該要求客戶端證書,則客戶端應該接受服務器證書。 如果您的密鑰庫設置正確,則客戶端使用X.509客戶端證書進行身份驗證,您將很高興。

我會推薦Apache Commons的開源HttpClient庫。 涵蓋此用例和許多其他用例。

看起來您正在嘗試將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系統屬性。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM