J'ai un serveur avec un certificat auto-signé, mais requiert également une authentification cert côté client. Je ne parviens pas à obtenir le certificat de serveur de CA brut afin de l’importer dans un magasin de clés. Quelqu'un a des suggestions sur la façon de le faire facilement? Merci.
Je cherchais comment faire confiance à un certificat lors de l'utilisation de jenkins cli, et j'ai trouvé https://issues.jenkins-ci.org/browse/JENKINS-12629 qui dispose d'une recette pour cela.
Cela vous donnera le certificat:
openssl s_client -connect ${Host}:${PORT} </dev/null
si vous êtes uniquement intéressé par la partie certificat, découpez-la en la dirigeant vers:
| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
et rediriger vers un fichier:
> ${Host}.cert
Puis importez-le en utilisant keytool:
keytool -import -noprompt -trustcacerts -alias ${Host} -file ${Host}.cert \
-keystore ${KEYSTOREFILE} -storepass ${KEYSTOREPASS}
En une fois:
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}
J'ai trouvé plusieurs façons de le faire:
InstallCert Java [hôte]: [port] keytool -exportcert -keystore jssecacerts -storepass changeit -file output.cert keytool -importcert -keystore [DESTINATION_KEYSTORE] -file output.cert
J'utilise openssl, mais si vous préférez ne pas le faire ou sur un système (Windows en particulier) 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 toujours, et pour les versions antérieures dans de nombreux cas, Java peut utiliser un fichier PKCS12 pour un fichier 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.
#!/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