javax. net. ssl. SSLPeerUnverifiedException: имя хоста не проверено:


Я пытаюсь использовать HTTPS соединение с самозаверяющим сертификатом.
Я следовал шагам создания самозаверяющего сертификата, как упоминалось здесь- Создание Самозаверяющего сертификата .
Все работает нормально даже в браузере, он только показывает мне сообщение, что мой сертификат подписан неизвестным CA.
Но у меня есть проблема с моим полным доменным именем(имя сервера не совпадает) имя в сертификате, потому что я установил неправильное имя при создании сертификата.
Я восстановил его и теперь такой ошибки нет.

Мне нужно использовать мой серверный сертификат из мобильного Android-клиента, я нашел отличную статью об этой проблеме- используйте Retrofit с самозаверяющим или неизвестным SSL-сертификатом в Android . Я выполнил все шаги, но, к сожалению, получаю ошибку (исключение).

javax.net.ssl.SSLPeerUnverifiedException: Hostname 195.xx.xx.xx not verified:
    certificate: sha1/qvH7lFeijE/ZXxNHI0B/M+AU/aA=
    DN: 1.2.840.113549.1.9.1=#160e63726f73704078616b65702e7275,CN=195.xx.xx.xx,OU=Departament of Development,O=CROSP Solutions,L=Chernihiv,ST=Chernihiv,C=UA
    subjectAltNames: []
            at com.squareup.okhttp.internal.http.SocketConnector.connectTls(SocketConnector.java:124)

Как вы можете видеть, имя хоста то же самое, но ошибка все еще присутствует.
Пожалуйста, помогите разобраться с этой проблемой, я буду благодарен за любую помощь.
Благодарю ты.

ПСЕВДО-РЕШЕНИЕ

Конечно, я искал раньше и нашелрешение для проверки имени хоста .
Я пробовал, это работает. Но можно ли использовать этот обходной путь, я добавил сертификат в свое приложение, чтобы прочитать его динамично, как в предыдущем примере, он все еще используется в этом случае.

Решение с OkHttp-одна строка. (Если вы выполнили все шаги в учебнике).

 okHttpClient.setHostnameVerifier(new NullHostNameVerifier());
Но я все еще чувствую, что это не лучшее решение, Пожалуйста. есть какие-нибудь мысли ?
2 8

2 ответа:

Интересно, что если хост запроса является IP, то " CN " не используется для его сопоставления; вместо этого,

Http://tools.ietf.org/html/rfc2818#section-3.1

Ip-адрес subjectAltName должен присутствовать в сертификате и должен точно соответствовать IP в URI "

Если вы используете Java keytool, это можно сделать с помощью

keytool -genkeypair  -ext SAN=IP:195.xx.xx.xx    ........

NullHostNameVerifier также подходит для вашего варианта использования. Ваш клиент доверяет только одному сертификату; до тех пор, пока соединение используя этот сертификат, вы в безопасности; имя хоста здесь не имеет значения.

Самозаверяющие сертификаты идеально подходят только для разработки. Вы не можете жить с этим, потому что вы знаете, что это не проверено, приложения и браузеры не будут доверять вам без одобрения CA.

Таким образом, это не "решение" для вашего живого приложения, а только для проверки, работает ли оно (и будет работать с действительным сертификатом, если и когда вы его получите). Потому что вы разрешаете все имена хостов (или, по крайней мере, жестко закодированные имена хостов, если вы ограничиваете их несколькими), и оба они плохие.

Планируете ли вы необходимость использовать самоподписанный сертификат в вашем живом приложении тоже?