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.
Удачи.