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 ответа:
Интересно, что если хост запроса является 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.
Таким образом, это не "решение" для вашего живого приложения, а только для проверки, работает ли оно (и будет работать с действительным сертификатом, если и когда вы его получите). Потому что вы разрешаете все имена хостов (или, по крайней мере, жестко закодированные имена хостов, если вы ограничиваете их несколькими), и оба они плохие.
Планируете ли вы необходимость использовать самоподписанный сертификат в вашем живом приложении тоже?