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