java - HTTP SSL 相互身份验证代码在 Apache HTTPClient 4.0.1 中有效,但在 4.1 中失败

标签 java ssl apache-httpclient-4.x

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

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

使用 Apache HTTPClient 4.0.1 一切正常。我升级到 4.1,除了必须重新排序 Scheme 构造函数中的参数之外,代码是相同的。但是,现在我得到一个 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

请帮忙?

我看到 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

关于java - HTTP SSL 相互身份验证代码在 Apache HTTPClient 4.0.1 中有效,但在 4.1 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5226753/

相关文章:

java - 按顺序制作测试用例,以便我可以删除 TestNG 中的多个登录调用

java - 如何将以下递归函数转换为 for 循环迭代

java - 使用java列出cloudant中存储的所有附件

iis - 许多自托管 SSL owin 服务器

使用 java.security.Keystore 对象的 SSL KafkaAdminClient 对象

Java httppost文件post打印上传速度

java - Swing if else 语句

image - HTTPS 和图像

java - 使用 Apache HttpClient 的 Facade 是否可以同时获取状态码和正文内容?

java - SSLHandshakeException 致命警报 : handshake_failure