Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HTTP SSL相互身份验证代码在Apache HTTPClient 4.0.1中工作,但在4.1中失败_Java_Ssl_Apache Httpclient 4.x - Fatal编程技术网

Java HTTP SSL相互身份验证代码在Apache HTTPClient 4.0.1中工作,但在4.1中失败

Java HTTP SSL相互身份验证代码在Apache HTTPClient 4.0.1中工作,但在4.1中失败,java,ssl,apache-httpclient-4.x,Java,Ssl,Apache Httpclient 4.x,我正在执行客户端到服务器的相互身份验证 我有一个具有自签名证书的服务器。我创建了一个java密钥存储(trustStore),它将该服务器包含在信任存储中。我有一个密钥库,其中包括我的证书和私钥。我的证书由服务器签名(与自签名的证书相同,并且在我的信任库中)。我已经使用API创建了一个SSLSocketFactory,用于注册我的密钥库和信任库(类似于本文) 使用ApacheHttpClient 4.0.1,一切都正常。我升级到4.1,除了必须在Scheme构造函数中重新排序参数之外,代码是相同

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

我有一个具有自签名证书的服务器。我创建了一个java密钥存储(trustStore),它将该服务器包含在信任存储中。我有一个密钥库,其中包括我的证书和私钥。我的证书由服务器签名(与自签名的证书相同,并且在我的信任库中)。我已经使用API创建了一个SSLSocketFactory,用于注册我的密钥库和信任库(类似于本文)

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

请帮忙

我看到4.1中有一个org.apache.http.conn.ssl.TrustSelfSignedStrategy,但还没有找到如何使用它的示例。我甚至不确定我是否会使用它。我必须让这成为一个用户的选择,这似乎对他们来说最好是只给我他们的服务器证书来添加到我的信任存储中。()

代码如下:

    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中的一个bug,将在4.1.1中修复


我在HTTPClient用户列表上发布了这条消息,在与开发人员交互后,发现了4.1中的一个bug,将在4.1.1中修复