无法验证证书:空

Could not validate certificate: null

我正在尝试使用基于 Android 4.4.2 的设备连接到网络服务器,在连接较新的设备时一切正常,但在连接这些较旧的设备时出现以下错误:

 javax.net.ssl.SSLHandshakeException: com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate: null
    at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:409)
    at com.android.okhttp.Connection.upgradeToTls(Connection.java:146)
    at com.android.okhttp.Connection.connect(Connection.java:107)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294)
    at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179)
    at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:246)
    at com.mypackage.myapp.api.myappApi.getOptions(myappApi.java:117)
    at com.mypackage.myapp.service.myappCommService.getOptions(myappCommService.java:104)
    at com.mypackage.myapp.service.myappCommService.onHandleIntent(myappCommService.java:120)
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
    at android.os.Handler.dispatchMessage(Handler.java:110)
    at android.os.Looper.loop(Looper.java:193)
    at android.os.HandlerThread.run(HandlerThread.java:61)
 Caused by: java.security.cert.CertificateException: com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate: null
    at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:308)
    at com.android.org.conscrypt.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:202)
    at com.android.org.conscrypt.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:611)
    at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
    at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:405)
    at com.android.okhttp.Connection.upgradeToTls(Connection.java:146) 
    at com.android.okhttp.Connection.connect(Connection.java:107) 
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294) 
    at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) 
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) 
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345) 
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296) 
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179) 
    at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:246) 
    at com.mypackage.myapp.api.myappApi.getOptions(myappApi.java:117) 
    at com.mypackage.myapp.service.myappCommService.getOptions(myappCommService.java:104) 
    at com.mypackage.myapp.service.myappCommService.onHandleIntent(myappCommService.java:120) 
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
    at android.os.Handler.dispatchMessage(Handler.java:110) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.os.HandlerThread.run(HandlerThread.java:61) 
 Caused by: com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate: null
    at com.android.org.bouncycastle.jce.provider.RFC3280CertPathUtilities.processCertA(RFC3280CertPathUtilities.java:1488)
    at com.android.org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi.engineValidate(PKIXCertPathValidatorSpi.java:305)
    at java.security.cert.CertPathValidator.validate(CertPathValidator.java:190)
    at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:295)
    at com.android.org.conscrypt.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:202) 
    at com.android.org.conscrypt.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:611) 
    at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method) 
    at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:405) 
    at com.android.okhttp.Connection.upgradeToTls(Connection.java:146) 
    at com.android.okhttp.Connection.connect(Connection.java:107) 
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294) 
    at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) 
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) 
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345) 
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296) 
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179) 
    at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:246) 
    at com.mypackage.myapp.api.myappApi.getOptions(myappApi.java:117) 
    at com.mypackage.myapp.service.myappCommService.getOptions(myappCommService.java:104) 
    at com.mypackage.myapp.service.myappCommService.onHandleIntent(myappCommService.java:120) 
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
    at android.os.Handler.dispatchMessage(Handler.java:110) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.os.HandlerThread.run(HandlerThread.java:61) 
 Caused by: java.security.cert.CertificateExpiredException
    at com.android.org.conscrypt.OpenSSLX509Certificate.checkValidity(OpenSSLX509Certificate.java:220)
    at com.android.org.bouncycastle.jce.provider.RFC3280CertPathUtilities.processCertA(RFC3280CertPathUtilities.java:1483)
    at com.android.org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi.engineValidate(PKIXCertPathValidatorSpi.java:305) 
    at java.security.cert.CertPathValidator.validate(CertPathValidator.java:190) 
    at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:295) 
    at com.android.org.conscrypt.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:202) 
    at com.android.org.conscrypt.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:611) 
    at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method) 
    at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:405) 
    at com.android.okhttp.Connection.upgradeToTls(Connection.java:146) 
    at com.android.okhttp.Connection.connect(Connection.java:107) 
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294) 
    at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) 
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) 
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345) 
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296) 
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179) 
    at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:246) 
    at com.mypackage.myapp.api.myappApi.getOptions(myappApi.java:117) 
    at com.mypackage.myapp.service.myappCommService.getOptions(myappCommService.java:104) 
    at com.mypackage.myapp.service.myappCommService.onHandleIntent(myappCommService.java:120) 
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
    at android.os.Handler.dispatchMessage(Handler.java:110) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.os.HandlerThread.run(HandlerThread.java:61) 
06-29 10:14:40.270 2498-4412/com.mypackage.myapp E/NativeCrypto: ssl=0x54e32608 cert_verify_callback x509_store_ctx=0x55e20938 arg=0x0
06-29 10:14:40.270 2498-4412/com.mypackage.myapp E/NativeCrypto: ssl=0x54e32608 cert_verify_callback calling verifyCertificateChain authMethod=ECDHE_RSA

我已经实现了一个自定义 SSLSocketFactory 以尝试使用 TLSV1.2 强制它连接,因为这似乎是一个常见错误,但并没有改变抛出的错误中的任何内容。此设备上的日期和时间设置为当前日期和时间。它不仅发生在这台设备上,而且发生在所有使用 Android 4.4.2 之前版本的设备上。

带有 Android 4.0 的甚至更旧的设备引发了更明显的错误,我尝试连接的服务器的根证书已过期,因此导致了问题。

确保您设备的“日期和时间”是up-to-date