Как заставить Android Studio распознавать SSL-сертификаты DoD

Я пытаюсь использовать правительственный 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. У меня были те же проблемы с использованием браузера Chrome в Windows 10, пока я не импортировал правительственные сертификаты.

Однако я не могу понять, как заставить эмулятор Android Studio распознавать сертификаты (я буду беспокоиться о своем устройстве Nexus 6 после того, как все заработает в эмуляторе).

У меня есть файл государственных сертификатов, и я добавил их в Android Studio с помощью 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 (военно-морская обсерватория США) запросила более общепризнанные сертификаты (в отличие от сертификатов Министерства обороны США), но они не знают, когда администраторы их предоставят.

Как я могу заставить эмулятор 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@[email protected] (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@[email protected] (040700-211705629):2)
4424-4451/com.drme.weathertest W/System.err:     at com.google.android.gms.org.conscrypt.Platform.checkServerTrusted(:com.google.android.gms@[email protected] (040700-211705629):1)
4424-4451/com.drme.weathertest W/System.err:     at com.google.android.gms.org.conscrypt.ConscryptFileDescriptorSocket.verifyCertificateChain(:com.google.android.gms@[email protected] (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@[email protected] (040700-211705629):8)
4424-4451/com.drme.weathertest W/System.err:     at com.google.android.gms.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(:com.google.android.gms@[email protected] (040700-211705629):15)
4424-4451/com.drme.weathertest W/System.err:    ... 18 more

Где именно вы нашли этот домен? ICANN не распознает полный домен, и каждый уровень родительского домена не существует.

TheWanderer 10.01.2019 03:38

Я нашел указанный api на https://aa.usno.navy.mil/data/docs/api.php, когда искал информацию о закате и восходе солнца в Интернете. Этот сайт содержит инструкции по использованию API. Эти сайты используют сертификаты правительства / Министерства обороны США, которые обычно не встречаются в «гражданских» центрах сертификации. Они работают над тем, чтобы получить больше «нормальных» сертификатов, но пока их нет. В настоящее время я пытаюсь найти отдельный сертификат для адреса api.usno.navy.mil.

mtdavem 10.01.2019 19:36
0
2
61
0

Другие вопросы по теме