自己署名証明書を持つサーバーがありますが、クライアント側の証明書認証も必要です。生のCAサーバー証明書を取得して、キーストアにインポートできるようにするのに苦労しています。誰でも簡単にそれを行う方法についていくつかの提案がありますか?ありがとう。
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}
これを行うにはいくつかの方法がありました。
Java InstallCert [Host]:[port] keytool -exportcert -keystore jssecacerts -storepass changeit -file output.cert keytool -importcert -keystore [DESTINATION_KEYSTORE] -file output.cert
私はopensslを使用しますが、それを望まない場合、またはそれを持たないシステム(特にWindows)上にある場合は、since Java 7 in 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 up always、および以前のバージョンでは多くの場合、Javaは、従来のJKSファイルの代わりにPKCS12ファイルをキーストアに使用できます。および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
関数に対する 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