【问题标题】:Exception : javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated异常:javax.net.ssl.SSLPeerUnverifiedException:对等体未通过身份验证
【发布时间】:2012-03-06 04:58:18
【问题描述】:
public HttpClientVM() {

    BasicHttpParams params = new BasicHttpParams();
    ConnManagerParams.setMaxTotalConnections(params, 10);
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpProtocolParams.setUseExpectContinue(params, false);
    HttpConnectionParams.setStaleCheckingEnabled(params, true);
    HttpConnectionParams.setConnectionTimeout(params, 30000);
    HostnameVerifier hostnameVerifier=
          org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
    HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
    SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
    socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
    SchemeRegistry schemeRegistry = new SchemeRegistry();
    schemeRegistry.register(new Scheme("http",socketFactory, 80));
    schemeRegistry.register(new Scheme("https",socketFactory, 443));
        ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, schemeRegistry);
        // Set verifier     
        client = new DefaultHttpClient(manager, params);    
    }

问题:

执行client.accessURL(url)时出现如下错误:

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:397)
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:495)
    at org.apache.http.conn.scheme.SchemeSocketFactoryAdaptor.connectSocket(SchemeSocketFactoryAdaptor.java:62)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:150)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:575)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
    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)

其他信息:

  • 窗口 7
  • HttpClient 4

【问题讨论】:

    标签: java apache-httpclient-4.x


    【解决方案1】:

    过期证书是我们“javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”的原因。

    keytool -list -v -keystore filetruststore.ts

        Enter keystore password:
        Keystore type: JKS
        Keystore provider: SUN
        Your keystore contains 1 entry
        Alias name: somealias
        Creation date: Jul 26, 2012
        Entry type: PrivateKeyEntry
        Certificate chain length: 1
        Certificate[1]:
        Owner: CN=Unknown, OU=SomeOU, O="Some Company, Inc.", L=SomeCity, ST=GA, C=US
        Issuer: CN=Unknown, OU=SomeOU, O=Some Company, Inc.", L=SomeCity, ST=GA, C=US
        Serial number: 5011a47b
        Valid from: Thu Jul 26 16:11:39 EDT 2012 until: Wed Oct 24 16:11:39 EDT 2012
    

    【讨论】:

    • 请原谅“愚蠢”的问题,但过期的证书是在服务器端还是客户端?
    • @Igal 如果我没记错的话,服务器端。
    【解决方案2】:

    此错误是因为您的服务器没有有效的 SSL 证书。因此我们需要告诉客户端使用不同的 TrustManager。这是一个示例代码:

    SSLContext ctx = SSLContext.getInstance("TLS");
    X509TrustManager tm = new X509TrustManager() {
    
        public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
        }
    
        public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
        }
    
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    };
    ctx.init(null, new TrustManager[]{tm}, null);
    SSLSocketFactory ssf = new SSLSocketFactory(ctx,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
    ClientConnectionManager ccm = base.getConnectionManager();
    SchemeRegistry sr = ccm.getSchemeRegistry();
    sr.register(new Scheme("https", 443, ssf));
    
    client = new DefaultHttpClient(ccm, base.getParams());
    

    【讨论】:

    • 从这一端移除安全性将如何解决另一端的问题?该 TrustManager 代码甚至不符合规范。
    • 我不明白你的意思。问题来自客户端,因此我们只需要更改它。哪个 TrustManager 代码行不符合规范?
    • getAcceptedIssuers() 被指定从不返回 null。您发布的代码根本不安全。它没有解决任何问题,它只会产生另一个问题,例如容易受到中间人攻击。
    • 代码完全可以用于测试目的,但绝对不适合生产
    • 谢谢你。在我们整理证书细节时需要进行一些测试,这有助于保持开发球滚动。
    【解决方案3】:

    如果您的服务器基于 JDK 7 并且您的客户端在 JDK 6 上并使用 SSL 证书,则会出现此异常。在 JDK 7 中,默认情况下禁用 sslv2hello 消息握手,而在 JDK 6 中启用 sslv2hello 消息握手。因此,当您的客户端尝试连接服务器时,将向服务器发送一条 sslv2hello 消息,并且由于 sslv2hello 消息禁用,您将收到此异常。要解决此问题,您必须将客户端移动到 JDK 7,或者必须使用 JDK 的 6u91 版本。但要获得此版本的 JDK,您必须获得 MOS(My Oracle Support)企业支持。此补丁不公开。

    【讨论】:

    • 在 Java 1.7 中遇到了同样的问题,当我在 1.8 中编译并运行它时,它在服务器上运行良好。
    【解决方案4】:

    如果客户端指定“https”但服务器仅运行“http”,则可以获取此信息。因此,服务器不希望建立安全连接。

    【讨论】:

      【解决方案5】:

      如果您尝试通过 HTTPS 连接并且服务器未配置为正确处理 SSL 连接,也会发生这种情况。

      我会检查您的应用服务器 SSL 设置并确保证书配置正确。

      【讨论】:

      • 什么可以配置错误? ssl 证书在浏览器中运行良好。为什么它不适用于 Java?为什么 Java 如此特别?
      【解决方案6】:

      就我而言,我使用的是 JDK 8 客户端,而服务器使用的是不安全的旧密码。服务器是 Apache,我在 Apache 配置中添加了这一行:

      SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:!MEDIUM:!LOW:!SSLv2:!EXPORT
      

      您应该使用这样的工具来验证您的 SSL 配置当前是否安全:https://www.ssllabs.com/ssltest/analyze.html

      【讨论】:

      • 这是否为您解决了错误.. 您是否将 SSlCipherSuite 属性添加到属性文件中。请详细说明
      • 我怀疑我对客户端进行了任何更改。我想我只是更改了服务器上的密码并修复了它。
      【解决方案7】:

      在我的例子中,服务器在 Docker 上运行(使用基础镜像采用openjdk/openjdk11:alpine),问题是 TLS 协议级别错误(感谢以下页面提供的解释:https://jfrog.com/knowledge-base/how-to-resolve-the-javax-net-ssl-sslpeerunverifiedexception-peer-not-authenticated-error-when-using-java-11/)。

      解决方案最终是使用以下 java 标志运行客户端:

      -Djdk.tls.client.protocols=TLSv1.2
      

      【讨论】:

        【解决方案8】:

        如果您处于开发模式且证书无效,为什么不设置 weClient.setUseInsecureSSL(true)。为我工作

        【讨论】:

        • 这不是 OP 所要求的
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-30
        • 1970-01-01
        • 1970-01-01
        • 2013-03-28
        相关资源
        最近更新 更多