56 votes

Java keytool moyen facile d'ajouter un certificat de serveur à partir de l'url/du port

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.

34voto

dave_thompson_085 Points 11995

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 

4voto

Jon Freedman Points 4411

Vous pouvez exporter un certificat à l'aide de Firefox, ce site contient des instructions. Ensuite, vous utilisez keytool pour ajouter le certificat.

4voto

Reegan Points 131

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X