我正在为服务器的客户端执行相互身份验证。

我有一台带有自签名证书的服务器。我创建了一个Java密钥库(trustStore),该服务器在信任库中包括该服务器。我有一个密钥库,其中包含我的证书和私钥。我的证书已由服务器签名(与我自己的证书相同,并且位于我的信任库中)。我已经使用API​​创建了一个SSLSocketFactory来注册我的密钥库和信任库(类似于本文Mutual Authentication with x509 Certificates using HttpClient 4.0.1)。

使用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中修复。

http://old.nabble.com/SSL-Mutual-Authentication-Code-worked-in-4.0.1-but-fails-in-4.1-tt31092864.html

10-05 20:32