Что касается деталей TLS / SSL, для аутентификации по сертификату клиента, по сравнению с "обычным" hanshake, сервер отправляет дополнительное сообщение CertificateRequest
TLS клиенту, который отвечает своим сертификатом в последующем сообщении Certificate
TLS.(позже клиент отправляет сообщение CertificateVerify
TLS, где он подписывает другие сообщения своим закрытым ключом, чтобы доказать серверу, что он действительно имеет закрытый ключ для открытого ключа в сертификате, который он отправил.)Обратите внимание, что после завершения рукопожатия сообщения шифруются не вашим закрытым ключом, а эфемерными ключами, передаваемыми на сервер (конфиденциальное согласование этих ключей также является частью рукопожатия).
На практикевам нужен сертификат и его закрытый ключ, содержащиеся в файле PKCS # 12 (например) и для настройки клиента для отправки его при подключении к серверу (сервер запросит его в соответствии с его конфигурацией).Проще предположить, что вам понадобится только один сертификат, и вам не придется выбирать между несколькими сертификатами, в противном случае вам нужно настроить собственный X509TrustManager
в пределах SSLContext
.
Если все ваши подключения могут использовать этот сертификат, вы можете использовать настройки по умолчанию, которые HttpsURLConnection
(и значение по умолчанию SSLSocketFactory
) подберут.Это можно сделать:
- , установив системные свойства
javax.net.ssl.keyStore
, javax.net.ssl.keyStoreType
и javax.net.ssl.keyStorePassword
в командной строке с вашими настройками.Я бы порекомендовал против , чтобы, поскольку кто-то на машине мог потенциально видеть командную строку и ваши настройки, перечисляя процессы (в зависимости от конфигурации машины), - устанавливая эти системные свойствав вашем приложении
- инициализирует
SSLContext
и устанавливает его как значение по умолчанию с помощью SSLContext.setDefault(..)
(Java 6).
Обратите внимание, что файлы .p12 (PKCS # 12)являются встроенным хранилищем ключей, поэтому вам не нужно выполнять какие-либо преобразования с keytool
, просто используйте PKCS12
в качестве типа хранилища.
Если вам нужны эти настройки или вы можете инициализироватьSSLContext
, создайте SSLSocketFactory
из него, а затем настройте экземпляр HttpsURLConnection
(если это то, что вы используете) с setSSLSocketFactory
.
(Вы можете использовать такие инструменты, как jSSLutils , чтобы помочь построить SSLContext
.)