Якість довіри не знайдено для Android SSL Connection


185

Я намагаюся підключитися до коробки IIS6, на якій працює godaddy 256bit SSL cert, і я отримую помилку:

java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

Ви намагалися визначити, що може бути причиною цього, але малюйте пробіли прямо зараз.

Ось як я підключаюся:

HttpsURLConnection conn;              
conn = (HttpsURLConnection) (new URL(mURL)).openConnection();
conn.setConnectTimeout(20000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
String tempString = toString(conn.getInputStream()); 

Відповіді:


78

Рішення @Chrispix небезпечно! Довіряючи всім сертифікатам, хтось може зробити чоловіка в атаці середнього! Просто надішліть будь-який сертифікат клієнту, і він прийме його!

Додайте свої сертифікати до спеціального менеджера довіри, як описано в цій публікації: Довіряйте всім сертифікатам за допомогою HttpClient через HTTPS

Хоча встановити захищений зв’язок із користувацьким сертифікатом трохи складніше, це принесе вам бажану безпеку шифрування ssl без небезпеки для людини в середині нападу!


1
Це нормально для роботи з самостійно створеним сертифікатом, але для одного (наприклад, ОП), який має дійсний ланцюг назад до кореневого ЦС, це просто вирішення для погано налаштованого сервера - дивіться мою відповідь.
Стіві

4
@Stevie Прийняття сертифікату ВСЕ - це лише варіант підтвердження тестування концепції, коли з'єднання SSL не є частиною, яку ви хочете перевірити. Інакше вам не доведеться використовувати SSL, якщо ви приймаєте кожен сертифікат, оскільки з'єднання не захищено!
Маттіас Б

1
Ах, вибачте, я думаю, що є непорозуміння - я повністю погоджуюся, що ніхто ніколи не повинен приймати кожен сертифікат! :) Мій коментар стосувався вашого другого пункту - пропозиція використовувати спеціальний менеджер довіри - який IMHO повинен бути кращим рішенням, а не рекомендованим рішенням.
Стіві

2
Підніміть голову вгору .. Я усунув «рішення», яке я вставив як обхід, щоб не викликати більше проблем, оскільки люди не сприймали це як «тимчасову роботу навколо».
Кріспікс

7
@Chrispix, ви не повинні були видалити часткове виправлення, це добре лише для тестування
Hugo Allexis Cardona

224

На відміну від прийнятої відповіді, вам не потрібен спеціальний менеджер довіри, вам потрібно виправити конфігурацію вашого сервера!

Я потрапив у ту ж проблему під час підключення до сервера Apache з неправильно встановленим сертифікатом dynadot / alphassl. Я підключаюсь за допомогою HttpsUrlConnection (Java / Android), який кидав -

javax.net.ssl.SSLHandshakeException: 
  java.security.cert.CertPathValidatorException: 
    Trust anchor for certification path not found.

Актуальною проблемою є неправильна конфігурація сервера - протестуйте її за допомогою http://www.digicert.com/help/ або подібного, і він навіть підкаже вам рішення:

"Сертифікат не підписаний довіреною владою (перевірка кореневого магазину Mozilla). Якщо ви купили сертифікат у надійного органу, вам, мабуть, просто потрібно встановити один або кілька проміжних сертифікатів . Зверніться до свого постачальника сертифікатів, щоб допомогти зробити це для вашого платформа сервера. "

Ви також можете перевірити сертифікат за допомогою openssl:

openssl s_client -debug -connect www.thedomaintocheck.com:443

Напевно ви побачите:

Verify return code: 21 (unable to verify the first certificate)

і, раніше у виході:

depth=0 OU = Domain Control Validated, CN = www.thedomaintocheck.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 OU = Domain Control Validated, CN = www.thedomaintocheck.com
verify error:num=27:certificate not trusted
verify return:1
depth=0 OU = Domain Control Validated, CN = www.thedomaintocheck.com
verify error:num=21:unable to verify the first certificate`

Ланцюг сертифікатів міститиме лише 1 елемент (ваш сертифікат):

Certificate chain
 0 s:/OU=Domain Control Validated/CN=www.thedomaintocheck.com
  i:/O=AlphaSSL/CN=AlphaSSL CA - G2

... але слід посилатися на органи, що підписують, по ланцюжку назад до того, якому довіряють Android (Verisign, GlobalSign тощо):

Certificate chain
 0 s:/OU=Domain Control Validated/CN=www.thedomaintocheck.com
   i:/O=AlphaSSL/CN=AlphaSSL CA - G2
 1 s:/O=AlphaSSL/CN=AlphaSSL CA - G2
   i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
 2 s:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
   i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA

Інструкції (та проміжні сертифікати) для налаштування вашого сервера зазвичай надаються органом, який видав ваш сертифікат, наприклад: http://www.alphassl.com/support/install-root-certificate.html

Після встановлення проміжних сертифікатів, наданих моїм емітентом сертифікатів, у мене тепер немає помилок при підключенні за допомогою HttpsUrlConnection.


3
Якщо ОП має доступ до конфігурації SSL серверів, до якої він підключається, це може бути рішенням. Але якщо він не той, хто приймає послугу, з якою він підключається, він повинен виправити проблему на своєму боці, це означає впровадити спеціальний менеджер довіри.
Маттіас Б

9
Ваше рішення працює, жодних питань, але ви не згодні з тим, що це вирішення, а не виправлення першопричини? Якщо мені доведеться підключитися до сервера від 3-х клієнтів (Android, iOS, Windows Mobile), тоді мені доведеться застосувати рішення на всіх 3, тоді як я можу виправити сервер один раз, і всі вони "просто працюватимуть".
Стіві

2
Дякую Стіві, у мене сервер був неправильно налаштований протягом 3 місяців, і лише зараз я виявив це! Тепер мій додаток для Android працює на 100%
jpros

2
@Stevie Я роблю багато дзвінків до різних API, які мають один і той же домен, але лише один з них не працює (javax.net.ssl.SSLHandshakeException) ... будь-яка ідея, чому таке трапиться? і, до речі, сертифікату SSL не довіряють. Отже, я вважав, що всі дзвінки повинні провалюватися за тим самим винятком.
чесний гравець

1
@dvaey зв’яжіться з тим, хто володіє сервером, і скажіть їм, що їх конфігурація зламана, і їхні https не працюють належним чином - надайте їм це посилання, щоб довести це digicert.com/help ... Я думаю, вони б оцінили і швидко зробили б вирішувати. В іншому випадку вам доведеться зробити один із способів вирішення відповідей в інших відповідях, але тоді вам доведеться або не приймати ніякої безпеки (ігнорувати certs) або перерозподіляти ваші програми, коли термін закінчується, і ваш власний довірений магазин більше не відповідає новому cert.
Стіві

17

Ви можете довірити певний сертифікат під час виконання.
Просто завантажте його з сервера, вкладіть активи та завантажте так, використовуючи ssl-utils-android :

OkHttpClient client = new OkHttpClient();
SSLContext sslContext = SslUtils.getSslContextForCertificateFile(context, "BPClass2RootCA-sha2.cer");
client.setSslSocketFactory(sslContext.getSocketFactory());

У наведеному вище прикладі я використовував, OkHttpClientале SSLContextйого можна використовувати з будь-яким клієнтом на Java.

Якщо у вас є якісь питання, не соромтеся задавати питання. Я автор цієї невеликої бібліотеки.


що з .pfx?
Чолецький

2
Це не небезпечно, оскільки будь-який користувач може отримати доступ до папки активів для додатка, коли він має APK?
Патріс Андала

1
@PatriceAndala, Root CA є загальнодоступними, тому все нормально
BekaBot

17

Оновлення на основі останньої документації на Android (березень 2017 року):

Коли ви отримуєте такий тип помилок:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
        at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:374)
        at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209)
        at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478)
        at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
        at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
        at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
        at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282)
        at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177)
        at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)

Випуск може бути одним із таких:

  1. ЦА, який видав серверний сертифікат, був невідомий
  2. Сертифікат сервера не був підписаний ЦА, а був самостійно підписаний
  3. У налаштуваннях сервера відсутній проміжний СА

Рішення полягає в тому, щоб навчити HttpsURLConnectionдовіряти конкретному набору ЦО. Як? Перевірте https://developer.android.com/training/articles/security-ssl.html#CommonProblems

Інші , які використовують AsyncHTTPClientз com.loopj.android:android-async-httpбібліотеки, будь ласка , перевірте AsyncHttpClient настройки для використання HTTPS .


5
А як бути, якщо користувач okhttp-клієнт?
TheLearner

Для okhttp, pls перевірити відповідь @ mklimek.
user1506104

14

Якщо ви використовуєте модернізацію, вам потрібно налаштувати ваш OkHttpClient.

retrofit = new Retrofit.Builder()
                        .baseUrl(ApplicationData.FINAL_URL)
                        .client(getUnsafeOkHttpClient().build())
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

Повний код наведено нижче.

    public class RestAdapter {

    private static Retrofit retrofit = null;
    private static ApiInterface apiInterface;

    public static OkHttpClient.Builder getUnsafeOkHttpClient() {
        try {
            // Create a trust manager that does not validate certificate chains
            final TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[]{};
                        }
                    }
            };

            // Install the all-trusting trust manager
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
            return builder;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static ApiInterface getApiClient() {
        if (apiInterface == null) {

            try {
                retrofit = new Retrofit.Builder()
                        .baseUrl(ApplicationData.FINAL_URL)
                        .client(getUnsafeOkHttpClient().build())
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

            } catch (Exception e) {

                e.printStackTrace();
            }


            apiInterface = retrofit.create(ApiInterface.class);
        }
        return apiInterface;
    }

}

1
Я намагаюся використовувати код, але я знову отримую таку помилку. " Ви можете допомогти в цьому
Vishwa Pratap

Це радикально небезпечно. Не використовувати.
Маркіз Лорн

Дякую! Переписав метод getUnsafeOkHttpClient()у Котліні: stackoverflow.com/a/60507560/2914140 .
CoolMind

11

Відповідь на дуже старий пост. Але, можливо, це допоможе новонародженому, і якщо щось із вищезазначеного не вийде.

Пояснення: я знаю, що ніхто не хоче пояснити лайно; скоріше рішення. Але в одному лайнері ви намагаєтеся отримати доступ до послуги з локальної машини до віддаленої машини, яка не довіряє вашій машині. Вам потрібно отримати довіру віддаленого сервера.

Рішення: Наступне рішення передбачає, що у вас є такі умови

  1. Спроба отримати доступ до віддаленої версії api з вашої локальної машини.
  2. Ви будуєте додаток для Android
  3. Ваш віддалений сервер знаходиться під проксі-фільтрацією (ви використовуєте проксі в налаштуваннях свого веб-переглядача для доступу до віддаленої служби api, як правило, на сценічному сервері чи сервісі розробників)
  4. Ви тестуєте на реальному пристрої

Кроки:

Вам потрібен файл розширення .keystore, щоб зареєструвати додаток. Якщо ви не знаєте, як створити .keystore файл; потім перейдіть разом із наступним розділом Створіть .keystore файл або іншим чином перейдіть до наступного розділу Підпишіть файл apk

Створіть .keystore файл

Відкрийте Android Studio. Клацніть у верхньому меню Створити> Створити підписаний APK. У наступному вікні натисніть кнопку Створити нову ... кнопку. У новому вікні введіть дані у всіх полях. Запам’ятайте два поля Пароль, які я рекомендую, повинні мати однаковий пароль; не використовуйте інший пароль; а також пам'ятати про шляхи збереження на самому верхнє поле Key шляху магазину: . Після введення всього поля натисніть кнопку ОК.

Підпишіть файл apk

Тепер вам потрібно створити підписаний додаток із файлом .keystore, який ви тільки що створили. Виконайте ці кроки

  1. Створити> Очистити проект, дочекатися його закінчення
  2. Створити> Створити підписаний APK
  3. Натисніть Choose existing...кнопку
  4. Виберіть файл .keystore ми тільки що створили в Create .keystore файл розділу
  5. Введіть той самий пароль, який ви створили під час створення в розділі Створити .keystore файл . Використовуйте той самий пароль Key store passwordі для Key passwordполів. Також введіть псевдонім
  6. Натисніть кнопку Далі
  7. На наступному екрані; які можуть відрізнятися залежно від ваших налаштувань у build.gradleфайлах, вам потрібно вибрати Build Typesта Flavors.
  8. Для Build Typesвибору releaseзі спадного меню
  9. Тому що Flavorsце залежить від ваших налаштувань у build.gradleфайлі. Виберіть stagingіз цього поля. Я використовував наступні налаштування в розділі build.gradle, ви можете використовувати ті ж, що і мій, але переконайтеся, що ви змінили ім'я applicationIdсвого пакета

    productFlavors {
        staging {
            applicationId "com.yourapplication.package"
            manifestPlaceholders = [icon: "@drawable/ic_launcher"]
            buildConfigField "boolean", "CATALYST_DEBUG", "true"
            buildConfigField "boolean", "ALLOW_INVALID_CERTIFICATE", "true"
        }
        production {
            buildConfigField "boolean", "CATALYST_DEBUG", "false"
            buildConfigField "boolean", "ALLOW_INVALID_CERTIFICATE", "false"
        }
    }
  10. Клацніть два Signature Versionsостанні прапорці та натисніть Finishкнопку.

Майже там:

Всі важкі роботи зроблені, тепер рух правди. Для отримання доступу до резервного сервера резервного копіювання за допомогою проксі-сервера вам потрібно зробити деякі налаштування у ваших реальних тестових пристроях Android.

Налаштування проксі-сервера на пристрої Android:

  1. Клацніть Налаштування в телефоні Android, а потім Wi-Fi
  2. Довго натисніть на підключеному wifi і виберіть Modify network
  3. Натисніть поле, Advanced optionsякщо ви не бачите Proxy Hostnameполе
  4. У Proxy Hostnameв'їжджають в IP або ім'я планується отримати доступ. Типовий сервер постановки буде названий якstg.api.mygoodcompany.com
  5. Для порту введіть, наприклад, чотиризначний номер порту 9502
  6. Натисніть Saveкнопку

Остання зупинка:

Пам'ятайте, що ми створили підписаний apk-файл у розділі Файл APK- підпису . Настав час встановити цей файл APK.

  1. Відкрийте термінал і перейдіть у підписану папку файлів apk
  2. Підключіть свій пристрій Android до машини
  3. Видаліть будь-який попередній встановлений apk-файл із пристрою Android
  4. Біжи adb install name of the apk file
  5. Якщо з якоїсь причини вищезазначена команда повернеться з adb command not found. Введіть повний шлях якC:\Users\shah\AppData\Local\Android\sdk\platform-tools\adb.exe install name of the apk file

Я сподіваюся, що проблема може бути вирішена. Якщо ні, будь ласка, залиште мені коментар.

Салам!


4

Повідомлення про помилку, яке я отримував, було схожим, але причина полягала в тому, що термін дії самопідписаного терміну закінчився. Коли була спроба клієнта openssl, це дало мені причину, яку не помітили, коли я перевіряв діалогове вікно сертифіката від firefox.

Тож загалом, якщо сертифікат є в магазині клавіш і його "ВАЛІДНО", ця помилка вимкнеться.


1
Якщо термін дії сертифікату закінчився, він не дійсний відповідно до ряду стандартів. Гаразд використовувати користувальницький TrustManagerі використовувати інший набір критеріїв. Але поза межами, з цим вам доведеться працювати.
jww

4

У мене була така ж проблема під час підключення від клієнта Android до сервера Kurento. Сервер Kurento використовує сертифікати jks, тому мені довелося перетворити на нього pem. Як вхід для перетворення я використав файл cert.pem, і це призвело до таких помилок. Але якщо використовувати fullchain.pem замість cert.pem - все в порядку.


3

Використовуйте https://www.ssllabs.com/ssltest/ для тестування домену.

Рішення Шихаба Уддіна в Котліні.

import java.security.SecureRandom
import java.security.cert.X509Certificate
import javax.net.ssl.*
import javax.security.cert.CertificateException

companion object {

    private val gson: Gson
    private val retrofit: Retrofit

    init {

        val okHttpClient = getUnsafeOkHttpClient() // OkHttpClient().newBuilder()
            .build()

        gson = GsonBuilder().setLenient().create()

        retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(okHttpClient)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build()
    }

    private fun getUnsafeOkHttpClient(): OkHttpClient.Builder =
        try {
            // Create a trust manager that does not validate certificate chains
            val trustAllCerts: Array<TrustManager> = arrayOf(
                object : X509TrustManager {
                    @Throws(CertificateException::class)
                    override fun checkClientTrusted(chain: Array<X509Certificate?>?,
                                                    authType: String?) = Unit

                    @Throws(CertificateException::class)
                    override fun checkServerTrusted(chain: Array<X509Certificate?>?,
                                                    authType: String?) = Unit

                    override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf()
                }
            )
            // Install the all-trusting trust manager
            val sslContext: SSLContext = SSLContext.getInstance("SSL")
            sslContext.init(null, trustAllCerts, SecureRandom())
            // Create an ssl socket factory with our all-trusting manager
            val sslSocketFactory: SSLSocketFactory = sslContext.socketFactory
            val builder = OkHttpClient.Builder()
            builder.sslSocketFactory(sslSocketFactory,
                trustAllCerts[0] as X509TrustManager)
            builder.hostnameVerifier { _, _ -> true }
            builder
        } catch (e: Exception) {
            throw RuntimeException(e)
        }
}

2

У мене була така ж проблема, що я виявив, що у файлі .crt сертифікату я надав відсутній проміжний сертифікат. Тому я попросив усі .crt-файли у свого адміністратора сервера, а потім стисло їх у зворотному порядку.

Вих. 1. Root.crt 2. Inter.crt 3. myCrt.crt

у Windows я виконав копію Inter.crt + Root.crt newCertificate.crt

(Тут я проігнорував myCrt.crt)

Тоді я надав файл newCertificate.crt у код через вхідний потік. Роботу завершено.


У нас теж було таке ж питання. Проміжний сертифікат відсутній
Нідхін Чандран

1

Помилка прив’язки якоря може трапитися з багатьох причин. Для мене це було просто те, що я намагався отримати доступ https://example.com/замість цього https://www.example.com/.

Тому ви, можливо, захочете ще раз перевірити свої URL-адреси перед тим, як почати створювати власний довірчий менеджер (як я).


0

У пряникових телефонах я завжди отримую цю помилку: Trust Anchor not found for Android SSL Connectionнавіть якщо я налаштований покладатися на свій сертифікат.

Ось код, який я використовую (мовою Scala):

object Security {
    private def createCtxSsl(ctx: Context) = {
        val cer = {
            val is = ctx.getAssets.open("mycertificate.crt")
            try
                CertificateFactory.getInstance("X.509").generateCertificate(is)
            finally
                is.close()
        }
        val key = KeyStore.getInstance(KeyStore.getDefaultType)
        key.load(null, null)
        key.setCertificateEntry("ca", cer)

        val tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm)
    tmf.init(key)

        val c = SSLContext.getInstance("TLS")
        c.init(null, tmf.getTrustManagers, null)
        c
    }

    def prepare(url: HttpURLConnection)(implicit ctx: Context) {
        url match {
            case https: HttpsURLConnection 
                val cSsl = ctxSsl match {
                    case None 
                        val res = createCtxSsl(ctx)
                        ctxSsl = Some(res)
                        res
                    case Some(c)  c
                }
                https.setSSLSocketFactory(cSsl.getSocketFactory)
            case _ 
        }
    }

    def noSecurity(url: HttpURLConnection) {
        url match {
            case https: HttpsURLConnection 
                https.setHostnameVerifier(new HostnameVerifier {
                    override def verify(hostname: String, session: SSLSession) = true
                })
            case _ 
        }
    }
}

і ось код підключення:

def connect(securize: HttpURLConnection  Unit) {
    val conn = url.openConnection().asInstanceOf[HttpURLConnection]
    securize(conn)
    conn.connect();
    ....
}

try {
    connect(Security.prepare)
} catch {
    case ex: SSLHandshakeException /*if ex.getMessage != null && ex.getMessage.contains("Trust anchor for certification path not found")*/ 
        connect(Security.noSecurity)
}

В основному, я налаштований довіряти своєму власному сертифікату. Якщо це не вдається, то я відключаю безпеку. Це не найкращий варіант, але єдиний вибір, про який я знаю, зі старими та гнучкими телефонами.

Цей зразок коду може бути легко переведений на Java.


Розчин для андроїд 2.3.x в разі , якщо хто в ній має потребу, stackoverflow.com/a/46465722/7125370
Newbie009

0

У моєму випадку це сталося після оновлення до Android 8.0. Для самопідписаного сертифіката Android було встановлено довіру, використовуючи алгоритм підпису SHA1withRSA. Перехід до нового сертифіката за допомогою алгоритму підпису SHA256зRSA виправив проблему.


0

Я знаю, що вам не потрібно довіряти всім сертифікатам, але в моєму випадку у мене виникли проблеми з налагодженнями налагодження, де ми мали самопідписані сертифікати, і мені було потрібно брудне рішення.

Все, що мені потрібно було зробити, - це змінити ініціалізацію sslContext

mySSLContext.init(null, trustAllCerts, null); 

де trustAllCertsстворено так:

private final TrustManager[] trustAllCerts= new TrustManager[] { new X509TrustManager() {
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
        return new java.security.cert.X509Certificate[]{};
    }

    public void checkClientTrusted(X509Certificate[] chain,
                                   String authType) throws CertificateException {
    }

    public void checkServerTrusted(X509Certificate[] chain,
                                   String authType) throws CertificateException {
    }
} };

Сподіваюся, що це стане у нагоді.


Це я хотів знайти! Дякуємо
oxied

Я отримую помилку Hostname '192.168.0.16' was not verified. Я тестую свої веб-сайти через налагоджувач (IIS Express) локально. Будь-яка ідея, як це виправити? Дякую :)
Сем

1
Це докорінно небезпечно. Не використовувати.
Маркіз Лорн

0

У мене була подібна проблема, і я повністю виключив стратегію довіри до всіх джерел.

Я ділюся своїм рішенням, застосованим до програми, реалізованої в Котліні

Спочатку рекомендую використовувати наступний веб-сайт для отримання інформації про сертифікат та його дійсність

Якщо він не відображається як "Прийняті емітенти" в магазині довіри за замовчуванням Android , ми повинні отримати цей сертифікат і включити його в додаток, щоб створити спеціальний магазин довіри

Ідеальним рішенням у моєму випадку було створити менеджер довіри високого рівня, який поєднує в собі користувальницький і довірчий магазин Android за замовчуванням

Тут він розкриває код високого рівня, який використовується для налаштування OkHttpClient, який він використовував з Retrofit.

override fun onBuildHttpClient(httpClientBuild: OkHttpClient.Builder) {

        val trustManagerWrapper = createX509TrustManagerWrapper(
            arrayOf(
                getCustomX509TrustManager(),
                getDefaultX509TrustManager()
            )
        )

        printX509TrustManagerAcceptedIssuers(trustManagerWrapper)

        val sslSocketFactory = createSocketFactory(trustManagerWrapper)
        httpClientBuild.sslSocketFactory(sslSocketFactory, trustManagerWrapper)

    }

Таким чином, я міг спілкуватися з сервером із самопідписаним сертифікатом, а з іншими серверами - з сертифікатом, виданим довіреною особою сертифікації

Це воно, сподіваюся, може комусь допомогти.


0

Я знаю, що це дуже стара стаття, але я зіткнувся з цією статтею, намагаючись вирішити мої проблеми з якорями довіри. Я опублікував, як я це виправив. Якщо ви попередньо встановили Root CA, вам потрібно додати конфігурацію до маніфесту.

https://stackoverflow.com/a/60102517/114265


лише для API 24+
BekaBot

@BekaBot - це, мабуть, правда, але згідно з документацією 23 та нижче довіряє сертифікату користувачів за замовчуванням За замовчуванням безпечні з'єднання (використовуючи такі протоколи, як TLS та HTTPS) з усіх додатків довіряють попередньо встановленим системним системам керування та програмам, орієнтованим на Android 6.0 (API рівня 23) та нижчих версій також довіряють доданому користувачем магазину CA за замовчуванням
GR Envoy

-1
**Set proper alias name**
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509","BC");
            X509Certificate cert = (X509Certificate) certificateFactory.generateCertificate(derInputStream);
            String alias = cert.getSubjectX500Principal().getName();
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
            trustStore.load(null);
trustStore.setCertificateEntry(alias, cert);

-2

Я також зіткнувся з тією ж проблемою. Я просто видаляю hhtps на http, наприклад,

final public static String ROOT_URL = "https://example.com"; до final public static String ROOT_URL = "http://example.com";

Нарешті, я вирішив цю проблему.


Звичайно, це просто вилучення безпеки рівня SSL з рівняння, що, мабуть, є поганою ідеєю для виробничого середовища.
Драгонтаути

Це дійсно не рішення, зняття безпеки SSL.
omega1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.