У меня есть сервер с самоподписанным сертификатом, но также требует аутентификации на стороне клиента. У меня тяжелое время, пытаясь получить исходный сертификат сервера CA, чтобы я мог импортировать его в хранилище ключей. У кого-нибудь есть предложения по тому, как легко это сделать? Спасибо.
Java keytool - простой способ добавить серверный сертификат из url/port
Ответ 1
Смотрел, как доверять сертификату при использовании jenkins cli, и нашел https://issues.jenkins-ci.org/browse/JENKINS-12629, у которого есть рецепт для этого.
Это даст вам сертификат:
openssl s_client -connect ${HOST}:${PORT} </dev/null
если вас интересует только часть сертификата, вырежьте его, связав его:
| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
и перенаправить файл:
> ${HOST}.cert
Затем импортируйте его с помощью keytool:
keytool -import -noprompt -trustcacerts -alias ${HOST} -file ${HOST}.cert \
-keystore ${KEYSTOREFILE} -storepass ${KEYSTOREPASS}
За один раз:
HOST=myhost.example.com
PORT=443
KEYSTOREFILE=dest_keystore
KEYSTOREPASS=changeme
# get the SSL certificate
openssl s_client -connect ${HOST}:${PORT} </dev/null \
| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ${HOST}.cert
# create a keystore and import certificate
keytool -import -noprompt -trustcacerts \
-alias ${HOST} -file ${HOST}.cert \
-keystore ${KEYSTOREFILE} -storepass ${KEYSTOREPASS}
# verify we've got it.
keytool -list -v -keystore ${KEYSTOREFILE} -storepass ${KEYSTOREPASS} -alias ${HOST}
Ответ 2
Я нашел несколько способов сделать это:
- Firefox: Добавить исключение → Получить сертификат → Вид → Подробности → Экспорт...
- KeyMan (http://www.alphaworks.ibm.com/tech/keyman) Вы можете получить сертификат SSL непосредственно из меню Файл → Импорт
- InstallCert (Код Andreas Sterbenz)
java InstallCert [host]:[port] keytool -exportcert -keystore jssecacerts -storepass changeit -file output.cert keytool -importcert -keystore [DESTINATION_KEYSTORE] -file output.cert
Ответ 3
Вы можете экспортировать сертификат с помощью Firefox, этот сайт содержит инструкции. Затем вы добавляете сертификат keytool.
Ответ 4
Просто выложите dnozay ответ на функцию, чтобы мы могли одновременно импортировать несколько сертификатов.
#!/usr/bin/env sh
KEYSTORE_FILE=dest_keystore
KEYSTORE_PASS=changeit
import_cert() {
local HOST=$1
local PORT=$2
# get the SSL certificate
openssl s_client -connect ${HOST}:${PORT} </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ${HOST}.cert
# delete the old alias and then import the new one
keytool -delete -keystore ${KEYSTORE_FILE} -storepass ${KEYSTORE_PASS} -alias ${HOST} &> /dev/null
# create a keystore and import certificate
keytool -import -noprompt -trustcacerts \
-alias ${HOST} -file ${HOST}.cert \
-keystore ${KEYSTORE_FILE} -storepass ${KEYSTORE_PASS}
rm ${HOST}.cert
}
import_cert stackoverflow.com 443
import_cert www.google.com 443
import_cert 172.217.194.104 443 # google
Ответ 5
Я использую openssl, но если вы предпочитаете не работать или быть в системе (особенно Windows), которая ее не имеет, поскольку java 7 в 2011 году keytool
может выполнять всю работу:
keytool -printcert -sslserver host[:port] -rfc >tempfile
keytool -import [-noprompt] -alias nm -keystore file [-storepass pw] [-storetype ty] <tempfile
# or with noprompt and storepass (so nothing on stdin besides the cert) piping works:
keytool -printcert -sslserver host[:port] -rfc | keytool -import -noprompt -alias nm -keystore file -storepass pw [-storetype ty]
И наоборот, для java 9 всегда и для более ранних версий во многих случаях Java может использовать файл PKCS12 для хранилища ключей вместо традиционного файла JKS, а OpenSSL может создавать PKCS12 без какой-либо помощи от keytool:
openssl s_client -connect host:port </dev/null | openssl pkcs12 -export -nokeys [-name nm] [-passout option] -out p12file
# <NUL on Windows
# default is to prompt for password, but -passout supports several options
# including actual value, envvar, or file; see the openssl(1ssl) man page