Проверка сертификата SSL в Java
Скажем, у меня есть два Java-приложения, которые я написал: Ping.jar
и Pong.jar
, и они развертываются и запускаются на двух отдельных серверах (Ping.jar
разворачивается до srv-01.myorg.com
и Pong.jar
разворачивается до srv-02.myorg.com
), и эти два приложения должны взаимодействовать друг с другом (с 2-мя способами) через SSL. Предположим также, что каждое приложение имеет собственный сертификат SSL.
- Как я, программист Java, код
Ping
и Pong
, чтобы проверить друг друга SSL-сертификат? Каждый CA предоставляет какой-то RESTful API, с которым я могу попасть, скажем, HttpClient
? Есть ли у Java собственный API проверки сертификатов? Есть ли сторонние JAR-сервисы с открытым исходным кодом или сервисы, которые я могу использовать?
Я был удивлен тем, как мало оказалось, когда я искал эту онлайн-версию.
Ответы
Ответ 1
Если вы подключаетесь с использованием классов Java SE SSL/TLS (например, SSLSocket
или SSLEngine
), вы используете Java Secure Расширение гнезда (JSSE).
Он проверит сертификат удаленной стороны в соответствии с SSLContext
, который был использован для создания этого SSLSocket
или SSLEngine
.
Этот SSLContext
будет инициализирован TrustManager
, которые определяют, как следует устанавливать доверительные отношения.
Если вам не нужна конкретная конфигурация, вы можете часто полагаться на значения по умолчанию: это будет полагаться на алгоритм PKIX (RFC 3280) на проверьте сертификат на набор доверенных привязок (по умолчанию cacerts
). cacerts
, поставляемый с Oracle JRE, является хранилищем ключей JKS, к которому вы можете добавить дополнительные сертификаты. Вы можете добавлять сертификаты явным образом, используя keytool
, например.
Вы также можете создать X509TrustManager
на основе пользовательского ключевого хранилища программным способом (как описано в этом ответе) и использовать его в определенном SSLContext
, который не будет" t влияет на значение по умолчанию.
В дополнение к этому, если вы используете свой собственный протокол, вам нужно убедиться, что полученный сертификат совпадает с именем хоста, которое вы искали (см. RFC 6125). Как правило, вы можете искать альтернативное имя субъекта в X509Certificate
, который вы получаете (получить первый сертификат однорангового узла в цепочке из SSLSession
), в противном случае найдите CN
RDN в Subject Distinguished Name.
Ответ 2
Вам не нужно вручную проверять сертификаты друг друга.
Вам просто нужно импортировать каждый сертификат сервера в cacerts друг друга, таким образом оба сервера приложений будут автоматически доверять друг другу.
Ответ 3
Вы можете получить сертификат однорангового узла либо путем привязки HandshakeCompletedListener
к SSLSocket
, либо получения сертификата от события, либо путем получения SSLSession
из SSLSocket
и получения сертификата peer из сеанса.
SSL обеспечивает конфиденциальность, целостность и аутентификацию идентичности сверстников. Независимо от того, является ли это одноранговое соответствие тому, которое ожидает приложение, и что такое идентификация разрешено делать в приложении, должно быть проверено приложением, если это необходимо. Это шаг авторизации, и SSL не может сделать это за вас.