首页 > 解决方案 > 如何让 Android Studio 识别 DoD ssl 证书

问题描述

我正在尝试使用政府 api( https://api.usno.navy.mil/rstt/oneday?date=8/8/2019&coords=48.39,-115.56&tz=-7) 来获取日出和日落类型信息,但我得到了错误java.security.cert.CertPathValidatorException: Trust anchor for certification path not found。在我导入政府证书之前,我在 Windows 10 上使用 Chrome 浏览器时遇到了同样的问题。

但是,我不知道如何让 Android Studio 模拟器识别证书(在模拟器中一切正常后,我会担心我的 Nexus 6 设备)。

我有一个政府证书文件,并已使用Settings/tools/ServerCertificates. 我添加的证书是 DOD ID SW CA-38、DoD Root CA 2、DoD Root CA 3 和 DoD Root CA 4。当我在浏览器上查看证书路径时,它显示 DoD Root CA 3、DOD ID SW CA-38 和api.usno.navy.mil. 该api.usno.navy.mil证书由 DOD ID SW CA-38 颁发。

我尝试将服务器证书设置为“自动接受不受信任的证书”(不是我最喜欢的选项)。

一切都没有帮助。我还查看了似乎相关但没有找到解决方案的 stackoverflow 消息。我试图不使用第三方应用程序。

虽然在浏览器中显然不需要它,但是否可以有一些其他证书专门供api.usno.navy.mil参考?

usno(美国海军天文台)要求获得更普遍认可的证书(与 DoD 证书相比),但他们不知道管理员何时会提供这些证书。

如何让 Android Studio 模拟器识别这些 DoD 证书?

任何建议,将不胜感激。谢谢。

完整的堆栈跟踪如下:

4424-4451/com.drme.weathertest W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
4424-4451/com.drme.weathertest W/System.err:     at com.google.android.gms.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(:com.google.android.gms@13280022@13.2.80 (040700-211705629):47)
4424-4451/com.drme.weathertest W/System.err:     at com.android.okhttp.internal.io.RealConnection.connectTls(RealConnection.java:192)
4424-4451/com.drme.weathertest W/System.err:     at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:149)
4424-4451/com.drme.weathertest W/System.err:     at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:112)
4424-4451/com.drme.weathertest W/System.err:     at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:184)
4424-4451/com.drme.weathertest W/System.err:     at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
4424-4451/com.drme.weathertest W/System.err:     at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
4424-4451/com.drme.weathertest W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
4424-4451/com.drme.weathertest W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
4424-4451/com.drme.weathertest W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461)
4424-4451/com.drme.weathertest W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407)
4424-4451/com.drme.weathertest W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:244)
4424-4451/com.drme.weathertest W/System.err:     at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
4424-4451/com.drme.weathertest W/System.err:     at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(Unknown Source:0)
4424-4451/com.drme.weathertest W/System.err:     at com.drme.weatherNoaa.NetworkHelpers.getUrlBytes(NetworkHelpers.java:123)
4424-4451/com.drme.weathertest W/System.err:     at com.drme.weatherNoaa.SunMoonWebRunnable.run(SunMoonWebRunnable.java:108)
4424-4451/com.drme.weathertest W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
4424-4451/com.drme.weathertest W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
4424-4451/com.drme.weathertest W/System.err:     at java.lang.Thread.run(Thread.java:764)
4424-4451/com.drme.weathertest W/System.err: Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
4424-4451/com.drme.weathertest W/System.err:     at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:646)
4424-4451/com.drme.weathertest W/System.err:     at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:495)
4424-4451/com.drme.weathertest W/System.err:     at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:418)
4424-4451/com.drme.weathertest W/System.err:     at com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:339)
4424-4451/com.drme.weathertest W/System.err:     at android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:94)
4424-4451/com.drme.weathertest W/System.err:     at android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:88)
4424-4451/com.drme.weathertest W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
4424-4451/com.drme.weathertest W/System.err:     at com.google.android.gms.org.conscrypt.Platform.checkTrusted(:com.google.android.gms@13280022@13.2.80 (040700-211705629):2)
4424-4451/com.drme.weathertest W/System.err:     at com.google.android.gms.org.conscrypt.Platform.checkServerTrusted(:com.google.android.gms@13280022@13.2.80 (040700-211705629):1)
4424-4451/com.drme.weathertest W/System.err:     at com.google.android.gms.org.conscrypt.ConscryptFileDescriptorSocket.verifyCertificateChain(:com.google.android.gms@13280022@13.2.80 (040700-211705629):5)
4424-4451/com.drme.weathertest W/System.err:     at com.google.android.gms.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
4424-4451/com.drme.weathertest W/System.err:     at com.google.android.gms.org.conscrypt.NativeSsl.doHandshake(:com.google.android.gms@13280022@13.2.80 (040700-211705629):8)
4424-4451/com.drme.weathertest W/System.err:     at com.google.android.gms.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(:com.google.android.gms@13280022@13.2.80 (040700-211705629):15)
4424-4451/com.drme.weathertest W/System.err:    ... 18 more

标签: androidsslssl-certificate

解决方案


推荐阅读