web-dev-qa-db-fra.com

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

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.

36
wuntee

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}
71
dnozay

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 
21
wuntee

Vous pouvez exporter un certificat en utilisant Firefox, ce site a des instructions. Ensuite, vous utilisez keytool pour ajouter le certificat.

4
Jon Freedman

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 
3
dave_thompson_085

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
0
Ninh Pham