У меня есть файл PEM, предоставленный мне, и мне сказали, что он понадобится для создания SSL-сокета, который подключается к серверу С++ для некоторых вызовов API. Кто-нибудь знает, как я могу читать в файле PEM и подключаться? Мне также был предоставлен парафарный пароль.
Как использовать файл PEM для создания SSL-сокета в Java?
Ответ 1
Похоже, что файл PEM является сертификатом клиента, который вы можете использовать для входа на сервер. Если это сертификат клиента, и это похоже на то, что вам, вероятно, понадобится файл сертификата CA, который также будет использоваться для проверки сертификата сервера, чтобы установить соединение.
Сертификаты CA должны зайти в доверительный магазин, и ваши сертификаты клиента должны войти в хранилище ключей. В Java оба из них будут JKS (хотя он имеет ограниченную поддержку PKCS12.) Для JRE, а также для каждого пользователя существуют местоположения хранилища ключей/доверенных мест по умолчанию. Вы также можете указать внешние местоположения для этих файлов в своем коде, как в приведенных ниже примерах. Библиотека commons-ssl, похоже, может поддерживать PEM напрямую, без необходимости JKS, но я ее не использовал.
Ключевая фраза по умолчанию для этих хранилищ ключей в Java "changeit" без кавычек.
Эта страница показывает, что вы должны прочитать PEM в своем хранилище ключей/доверия. Вот еще один пример.
После того, как вы установили правильную сеть доверия и хранилища ключей, вам необходимо передать следующие свойства системы JSSE в вашу JVM:
javax.net.ssl.keyStore
javax.net.ssl.keyStoreType
javax.net.ssl.keyStorePassword
javax.net.ssl.trustStore
javax.net.ssl.trustStoreType
javax.net.ssl.trustStorePassword
Вы можете указать их как -D-параметры для JRE или, как в приведенных ниже примерах, программно.
Как только вы закончите это, heres aa commons-ssl example создания сокета. Кроме того, heres Java api для SSLSocket. Heres также пример, который не использует какие-либо домены apache.
Ответ 2
Вам нужна библиотека, которая обрабатывает SSL. Как отметил Джон Эллинвуд, некоторые структуры (такие как Java 2 SE) предлагают эти встроенные функции, для других вам нужно использовать сторонние библиотеки.
РазработчикиC часто используют openssl напрямую, но нельзя сказать, что это просто, и при использовании С++ существует несколько "gotchas", которые легко впасть.
Я предлагаю вам использовать сетевую библиотеку С++ с поддержкой SSL, такую как сетевая библиотека QT или Poco NetSSL. См. здесь для некоторой учебной документации и здесь для API - вы, вероятно, захотите взглянуть на initializeClient, который напрямую берет файл PEM.