J'ai un serveur avec un certificat auto-signé, mais nécessite également une authentification de certificat côté client. J'ai du mal à essayer d'obtenir le certificat brut du serveur CA afin de pouvoir l'importer dans un magasin de clés. Quelqu'un a-t-il des suggestions sur la façon de le faire facilement? Merci.
Réponses
Trop de publicités?J'utilise openssl, mais si vous préférez ne pas le faire, ou si vous êtes sur un système (en particulier Windows) qui ne l'a pas, puisque java 7 en 2011 keytool
peut faire tout le travail :
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]
Inversement, pour java 9 up toujours, et pour les versions antérieures dans de nombreux cas, Java peut utiliser un fichier PKCS12 pour un magasin de clés au lieu du fichier JKS traditionnel, et OpenSSL peut créer un PKCS12 sans aucune aide de 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
Exposez simplement la réponse de dnozay à une fonction afin que nous puissions importer plusieurs certificats en même temps.
Enregistrez-le dans un fichier .sh puis exécutez-le.
#!/usr/bin/env sh
KEYSTORE_FILE=/path/to/keystore.jks
KEYSTORE_PASS=changeit
import_cert() {
local HOST=$1
local PORT=$2
if [[ -z $PORT ]]; then
PORT=443
fi
# 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 (or update) and import certificate
keytool -import -noprompt -trustcacerts \
-alias ${HOST} -file ${HOST}.cert \
-keystore ${KEYSTORE_FILE} -storepass ${KEYSTORE_PASS}
# remove temp file
rm ${HOST}.cert
}
# Change your sites here
import_cert stackoverflow.com 443
import_cert www.google.com # default port 443
import_cert 172.217.194.104 443 # google