2013-10-03 177 views
1

我對我們的Ruby on Rails團隊有些嫉妒,他們需要使用需要使用證書籤名的HTTPS請求的相同Web服務。他們抓住一個寶石,用一行代碼簽名請求,盤子就完成了...具有HTTPS證書的HttpClient

但是,Java要求我們將密鑰導入到我們的密鑰庫(試圖避免這種情況),或者在內存中創建一個...沒關係。但是,一旦我這樣做,似乎實際簽署請求的唯一選擇是使用HttpUrlConnection類。 HttpUrlConnection example

我希望能夠使用我現有的代碼簽署請求,該代碼使用apache的DefaultHttpClient client = new DefaultHttpClient(); - 但我沒有看到讓Http客戶端使用內存密鑰庫對請求進行簽名的方法。

有人遇到過這個嗎?

+0

'您需要信任服務器證書頒發者','需要使用證書籤名的Web服務需要HTTPS請求'? – gerrytan

+0

@gerrytan不,這是服務器信任請求的機制,而不是其他方式。如果請求沒有正確簽名,服務器會拒絕請求。 – tpow

回答

1

看一看AuthSSLProtocolSocketFactory.java。您應該可以像這樣執行SSL客戶端身份驗證(未經測試的代碼);

Protocol.registerProtocol("https", 
new Protocol("https", new AuthSSLProtocolSocketFactory(keystoreUrl, keystorePassword, truststoreUrl, truststorePassword), 443)); 
HttpClient httpclient = new HttpClient(); 
GetMethod httpget = new GetMethod("https://www.whatever.com/"); 
try { 
    httpclient.executeMethod(httpget); 
    System.out.println(httpget.getStatusLine()); 
} finally { 
    httpget.releaseConnection(); 
} 

您的客戶端證書進入keystoreUrl指向的密鑰存儲區。在HttpClient SSL Guide閱讀更多關於此。

+0

嗯,這使用org.apache.commons.httpclient * - 我認爲這個apache命名空間更「最新」 - > org.apache.http。*? – tpow