Подтвердить что ты не робот

Проверка сертификата 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-сервисы с открытым исходным кодом или сервисы, которые я могу использовать?

Я был удивлен тем, как мало оказалось, когда я искал эту онлайн-версию.

4b9b3361

Ответ 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 не может сделать это за вас.