[英]Mutual Authentication with x509 Certificates using HttpClient 4.0.1
[英]HTTP SSL Mutual Authentication Code worked in Apache HTTPClient 4.0.1 but fails in 4.1
我正在為服務器的客戶端執行相互身份驗證。
我有一台帶有自簽名證書的服務器。 我創建了一個Java密鑰庫(trustStore),該服務器在信任庫中包括該服務器。 我有一個密鑰庫,其中包含我的證書和私鑰。 我的證書已由服務器簽名(與我自己的證書相同,並且位於我的信任庫中)。 我已經使用API創建了一個SSLSocketFactory來注冊我的密鑰庫和信任庫(類似於本文使用HttpClient 4.0.1與x509證書進行相互身份驗證 )。
使用Apache HTTPClient 4.0.1,一切正常。 我升級到4.1,除了不必對Scheme構造函數中的參數重新排序之外,代碼是相同的。 但是,現在我得到了javax.net.ssl.SSLPeerUnverifiedException:對等方未通過身份驗證
請幫助?
我看到在4.1中有一個org.apache.http.conn.ssl.TrustSelfSignedStrategy,但是沒有找到任何使用它的示例。 我什至不確定我是否要使用它。 我必須做出用戶選擇,這似乎對於他們來說,最好給我他們的服務器證書以添加到我的信任庫中會更好。 ( http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/conn/ssl/TrustSelfSignedStrategy.html )
下面是代碼:
String doGet(URI uri, String acceptType) throws Exception
{
// To be replaced by common module.
String result = null;
DefaultHttpClient httpclient = new DefaultHttpClient();
try
{
SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore, String.valueOf(keyStorePassword), trustStore);
Scheme sch = new Scheme("https", 443, socketFactory);
httpclient.getConnectionManager().getSchemeRegistry().register(sch);
HttpGet httpget = new HttpGet(uri.toASCIIString());
httpget.addHeader("Accept", acceptType);
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
result = IOUtils.getContent(entity.getContent());
} finally
{
httpclient.getConnectionManager().shutdown();
}
return result;
}
以下是我在4.1中得到的例外:
Exception in thread "main" javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:390)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:562)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
我將此內容發布在HTTPClient用戶列表上,在與開發人員進行交互之后,發現了4.1中的一個錯誤,該錯誤將在4.1.1中修復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.