HTTP失败:javax.net.ssl.SSL握手异常:链验证失败。

3

我尝试使用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)

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

  1. OnePlus 6T(Android 10)
  2. Samsung s5(Android 9)
  3. Samsung A5(Android 6)
  4. Android模拟器(Android 11)
  5. LG Nexus(Android 6)

2
这种错误类型意味着设备SSL堆栈无法验证服务证书。您使用的是哪个Android版本,您正在尝试连接到哪个服务? - Dominik Murzynowski
@DominikMurzynowski 三星S6(安卓9)和OnePlus 6T(安卓10) - Rajasekaran M
没有,@YuriSchimke已经提到了它。 - Rajasekaran M
@RajasekaranM,请检查您的移动设备日期,并与模拟器进行比对。 - Vijaya Varma Lanke
检查是否存在链接原因异常,toSSLHandshakeException 应该保留它。 - Yuri Schimke
1个回答

2
这是Android模拟器 "Chain Validation Failed"连接自签名证书的开发者机器SSLHandshakeException-链验证失败,如何解决?的重复内容。
很可能是设备日期错误、证书过期(如果在其他地方工作,则不太可能)或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个真实设备,它们都有同样的问题。 - Rajasekaran M
你确定你已经发布了完整的异常信息吗?有没有被你截断的原因? - Yuri Schimke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接