HTTP FAILED:javax.net.ssl.SSLHandshakeException:链验证失败[重复]

Posted

技术标签:

【中文标题】HTTP FAILED:javax.net.ssl.SSLHandshakeException:链验证失败[重复]【英文标题】:HTTP FAILED: javax.net.ssl.SSLHandshakeException: Chain validation failed [duplicate] 【发布时间】:2021-04-11 07:51:22 【问题描述】:

我尝试使用 OkHttp 客户端调用 API,但在 android 中没有成功。该 API 在 ios 和 Postman 上运行良好。

我仅在 Android 中收到 SSLHandshakeException。那么,究竟是什么原因,又该如何解决呢?

OkHttp 库

implementation 'com.squareup.okhttp3:okhttp:3.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'

Http 客户端

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
if (BuildConfig.DEBUG)
    builder.addInterceptor(logging);
OkHttpClient client= builder.build();

日志:

javax.net.ssl.SSLHandshakeException: Chain validation failed
    at com.android.org.conscrypt.SSLUtils.toSSLHandshakeException(SSLUtils.java:362)
    at com.android.org.conscrypt.ConscryptEngine.convertException(ConscryptEngine.java:1134)
    at com.android.org.conscrypt.ConscryptEngine.readPlaintextData(ConscryptEngine.java:1089)
    at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:876)
    at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:747)
    at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:712)
    at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.processDataFromSocket(ConscryptEngineSocket.java:849)
    at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.access$100(ConscryptEngineSocket.java:722)
    at com.android.org.conscrypt.ConscryptEngineSocket.doHandshake(ConscryptEngineSocket.java:238)
    at com.android.org.conscrypt.ConscryptEngineSocket.startHandshake(ConscryptEngineSocket.java:217)
    at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:299)
    at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.java:268)
    at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:160)
    at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:256)
    at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:134)
    at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:113)
    at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)

经过测试的设备和操作系统版本

    一加 6T (Android 10) 三星 s5 (Android 9) 三星 A5(安卓 6) Android 模拟器 (Android 11) LG Nexus(安卓 6)

【问题讨论】:

此错误类型意味着设备 SSL 堆栈无法验证服务证书。您使用的是哪个 Android 版本,您尝试连接的服务是什么? @DominikMurzynowski 三星 s6 (android 9) 和 Onplus 6T (android 10) 没有@YuriSchimke 已经提到它 @RajasekaranM 检查您的移动设备日期并检查模拟器 检查链接原因异常,toSSLHandshakeException 应该保留它。 【参考方案1】:

这是Android Emulator "Chain Validation Failed" connecting developers machine with self-signed cert 和SSLHandshakeException - Chain chain validation failed, how to solve? 的副本

很可能是设备上的日期错误、证书过期(不太可能在其他地方工作)或您的 Android 设备上缺少 CA 证书。

如果没有根案例,很难判断发生了什么。您可能只包含了一半的异常跟踪。相信也有缘由。

    /**
     * Wraps the given exception if it's not already a @link SSLHandshakeException.
     */
    static SSLHandshakeException toSSLHandshakeException(Throwable e) 
        if (e instanceof SSLHandshakeException) 
            return (SSLHandshakeException) e;
        

        return (SSLHandshakeException) new SSLHandshakeException(e.getMessage()).initCause(e);
    

【讨论】:

我检查了 4 台真实设备,都遇到了同样的问题。 你确定你已经发布了整个异常信息吗?有没有你切断的原因?

以上是关于HTTP FAILED:javax.net.ssl.SSLHandshakeException:链验证失败[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Android应用程序崩溃okhttp3 HTTP FAILED:javax.net.ssl.SSLException:读取错误:系统调用期间I/O错误,软件导致连接中止

Android之提示javax.net.ssl.SSLHandshakeException: Chain validation failed

Jmeter:响应代码:非 HTTP 响应代码:javax.net.ssl.SSLHandshakeException

不能在 java.net.http.HttpClient 上发出多个请求,否则将收到:javax.net.ssl.SSLHandshakeException

java.lang.ClassCastException:libcore.net.http.HttpURLConnectionImpl 无法转换为 javax.net.ssl.HttpsURLConn

Android 7.0:'javax.net.ssl.SSLHandshakeException:连接被对等方关闭