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

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

Вопрос:

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

Мне нужно использовать свой серверный сертификат от мобильного Android Client, я нашел отличную статью об этой проблеме – Использовать Модернизацию с самоподписанным или неизвестным 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)

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

Псевдо-РЕШЕНИЕ

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

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

okHttpClient.setHostnameVerifier(new NullHostNameVerifier());

Но я все еще чувствую, что это не лучшее решение, пожалуйста, какие-нибудь мысли?

Лучший ответ:

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

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

имя субъекта iPAddressAltName должно присутствовать в сертификате и должно точно соответствовать IP-адресу в URI “

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

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

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

Ответ №1

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

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

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

Оцените статью
Добавить комментарий