2010-05-26 121 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系統屬性,如果它是適當的。)