Android WebView setCertificate выдает проблемы с SSL

Я видел много сообщений и информации об ошибках SSL, и я сам наткнулся на них.

Я пытаюсь получить доступ к веб-странице через Android WebView с сертификатом GlobalSign CA BE, и я получаю недостоверную ошибку.

Для большинства телефонов он отлично работает, чтобы справиться с этим, и просто попросите обработчик продолжить работу.

Некоторые телефоны, однако, получат onReceivedError в webview-клиенте, сообщая ему, что он не может установить контакт с сервером. Это происходит после того, как он прошел через onReceivedSslError и продолжил.

Я искал описания и нашел много описаний с участием HttpClient и либо установил свой собственный сертификат, либо просто обманул его в принятии всех.

Однако, поскольку я использовал WebView, мне показалось, что я использую WebView.setCertificate(SslCertificate crt). Я искал обсуждения этой функции, но не нашел много информации.

Я получил сертификат, который был назван ненадежным, и сделал этот код:

try{
     Certificate myCert = CertificateFactory.getInstance("X509").
     generateCertificate(this.getResources().
     openRawResource(R.raw.globalsign_ca_be));

     X509Certificate x509 = (X509Certificate) myCert;
     SslCertificate sslCert = new SslCertificate(x509);
     webView.setCertificate(sslCert);

    }
    catch (CertificateException ex){
        ex.printStackTrace();
    }

С файлом .cer, содержащим это:

----- НАЧАТЬ СЕРТИФИКАТ ----- MIIEbjCCA1agAwIBAgILBAAAAAABElatYgQwDQYJKoZIhvcNAQEFBQAwVzELMAkG A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0wNzA1MDQxMDAw MDBaFw0xNDAxMjcxMTAwMDBaMHExCzAJBgNVBAYTAkJFMR0wGwYDVQQLExREb21h aW4gVmFsaWRhdGlvbiBDQTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEoMCYG A1UEAxMfR2xvYmFsU2lnbiBEb21haW4gVmFsaWRhdGlvbiBDQTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBALSfSeaznwFVNtA2lWzLFlpscrXineL6OekK 3HNcoDt2bQUokw2lQvPoy + 7TMxoTJwrfXNFUYmqaFzbWPFiHHrJmH1VpK4lWR7TC UAzlXcH9KRtmc0P0b9EUTyptSFI69eSQP96y9BDV + fqslg0QMiPS01GnlYVQ + g8p naeITg0xm0RBjkEvbpoatLalWfFJWQl + fknTaTNLAJLFG0Igafhk39inRNGQXv05 rWt9/tWLpAFk9qe0IITMBS8n7h7VJJauhEOkPkPzO5nX + fLePRnt0GXxScpI0jh9 xkjXcmG4xsJnCthlWv1b88X9voxpz5kgtursOYDpZqjuPZ1Ge4cCAwEAAaOCAR8w ggEbMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMEsGA1UdIARE MEIwQAYJKwYBBAGgMgEKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuZ2xvYmFs c2lnbi5uZXQvcmVwb3NpdG9yeS8wHQYDVR0OBBYEFDYSTp5xxCZB8frxKUy/F6RT KLbrMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQv cm9vdC5jcmwwEQYJYIZIAYb4QgEBBAQDAgIEMCAGA1UdJQQZMBcGCisGAQQBgjcK AwMGCWCGSAGG + EIEATAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzAN BgkqhkiG9w0BAQUFAAOCAQEAwyV5SvrNJm9AariUG + ag4WvSMZo/ifvFCiJ1ev27 QDScvJ6FSVl6lcwNLUQLx8sVEB7S3ON46l/1NVGmyD85kBWeXxXJt49da2OZaOFu XPydNzMKrodwSqLjqyZ9cwfk9wqqdY + m7psE0QVDdBq61MKdf7egbO0WmmdAVquD n0yc6yg0H43mWg9pQNmpnmr5iX/Q + IyzSC4LT/H5z/UOEQIMiRZzU10s0 +/eXwsl utVOj4WQP4iTeaUgrP + wisvLpVV4gzlBMqpdJZOn6u4YcrXiHX8IdBG2ASdOls + о 8Cr5UqwkGhmen2xSfIs6plTewcchfTrTvBqobfK/33bKAw == ----- СЕРТИФИКАТ КОНЕЦ -----

Он завершился без исключения, но я по-прежнему получал такое же поведение от своего веб-представления. Сначала ошибка SSL, а затем ошибка, говорящая, что он не может связывать/загружать страницу.

Если у кого-то есть какая-то информация, он смог правильно работать с SSL в WebView или даже просто помог отладить это. Я был бы очень признателен.

Моя голова также немного взрывается, потому что я не очень разбираюсь в SSL для начала.

* это открытый ключ btw, ничего интересного;) (GlobalSign CA BE)

Дополнительная информация: исключение ssl: первичная ошибка: 3 сертификат: выдано: CN = GlobalSign Проверка домена CA, O = GlobalSign nv-sa, OU = Проверка домена CA, C = BE;

Выдано: CN = GlobalSign Root CA, OU = Root CA, O = GlobalSign nv-sa, C = BE;

ошибка 3, SSL_UNTRUSTED

Однако у меня есть ощущение, что функция setCertificate не добавляет доверенный сертификат для отсутствующего корня или аналогичного, но вместо этого добавляет сертификат клиента для идентификации с ожидающим его сервером. Было бы хорошо с некоторой дополнительной информацией об этой функции, хотя это кажется немного недокументированным.

Я получил CA через запуск confied.payex.com:443 через сайт ssltest.net и загрузку сертификата оттуда.

Ответ 1

Я попытался декодировать сертификат, но он не кажется действительным (на самом деле я протестировал 2 различных реализация X509 и оба дал мне ошибку "неправильной кодировки" ).

Можете ли вы предоставить более подробную информацию об исключении SSL?

Я не нашел много информации о методе setCertificate. Я думаю, что этот метод ожидает сертификат сервера. Вы должны убедиться, что сертификат, который вы декодируете, является сертификатом конечной сущности, а не сертификатом ЦС.

Ответ 2

Если вы используете InMobi sdk, просто обновите его до последней версии, и это предупреждение будет исправлено. Дополнительная информация здесь в ответе Сохана

Информация

Ответ 3

Если у вас есть WebClient, который переопределяет функцию onReceivedSSLError() и вызывает API-интерфейс handler.proceed(), он может решить проблему с сертификатом ошибки 3, которую я тестировал на Android 4.4 и 6.0.

Если вы по-прежнему получаете errorCode (-1) в функции onReceivedError(), вам нужно проверить реализацию на стороне сервера когда-нибудь, особенно когда вы вызываете метод POST вместо метода GET, потому что сервер ничего не может вернуть, если есть неожиданные параметры POST.

Удачи.