Utiliser openssl pour obtenir le certificat à partir d'un serveur

j'essaie d'obtenir le certificat d'un serveur distant, que je peux ensuite utiliser pour ajouter à mon keystore et utiliser dans mon application java.

un dev senior (qui est en vacances: () m'a informé que je peux exécuter ceci:

openssl s_client -connect host.host:9999

pour obtenir un certificat brut, que je peux ensuite copier et exporter. Je reçois la sortie suivante:

depth=1 /C=NZ/ST=Test State or Province/O=Organization Name/OU=Organizational Unit Name/CN=Test CA
verify error:num=19:self signed certificate in certificate chain
verify return:0
23177:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1086:SSL alert number 40
23177:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:

j'ai aussi essayé avec cette option

-showcerts 

et celui-ci (tournant sous debian)

-CApath /etc/ssl/certs/ 

mais obtenir la même erreur.

Cette source dit que je peux l'utiliser CApath drapeau, mais il ne semble pas aider. J'ai essayé plusieurs chemins d'accès en vain.

s'il vous plaît, faites-moi savoir où je vais mal.

242
demandé sur nasty pasty 2011-10-25 11:08:30
la source

10 ответов

avec SNI

si le serveur distant utilise SNI (c'est-à-dire partage de plusieurs hôtes SSL sur une seule adresse IP), vous devrez envoyer le nom d'hôte correct pour obtenir le bon certificat.

openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null

sans SNI

si le serveur distant n'utilise pas SNI, vous pouvez sauter le paramètre -servername :

openssl s_client -showcerts -connect www.example.com:443 </dev/null



pour voir les détails complets du cert d'un site, vous pouvez utiliser cette chaîne de commandes aussi bien:

$ echo | \
    openssl s_client -servername www.example.com -connect www.example.com:443 2>/dev/null | \
    openssl x509 -text
324
répondu Ari Maniatis 2017-11-03 13:40:39
la source

bien que je sois d'accord avec la réponse D'Ari (et que je l'ai mise en garde :), j'ai dû faire un pas supplémentaire pour la faire fonctionner avec Java sur Windows (où elle devait être déployée):

openssl s_client -showcerts -connect www.example.com:443 < /dev/null | openssl x509 -outform DER > derp.der

avant d'ajouter la conversion openssl x509 -outform DER , je recevais une erreur de keytool sur Windows se plaignant du format du certificat. L'importation de la .der fichier a bien fonctionné.

52
répondu David Jaquay 2013-12-27 10:59:56
la source

il s'avère qu'il y a plus de complexité ici: j'avais besoin de fournir beaucoup plus de détails pour mettre cela en marche. Je pense que c'est quelque chose à voir avec le fait que c'est une connexion qui a besoin d'authentification client, et le hankshake avait besoin de plus d'informations pour continuer à l'étape où les certificats ont été jetés.

voici ma commande de travail:

openssl s_client -connect host:port -key our_private_key.pem -showcerts \
                 -cert our_server-signed_cert.pem

espérons que ce soit un coup de pouce dans la bonne direction pour tous ceux qui pourraient faire avec un peu plus info.

33
répondu nasty pasty 2016-02-06 19:28:26
la source

la ligne de commande la plus facile pour cela, qui inclut la sortie PEM pour l'ajouter au keystore, ainsi qu'une sortie lisible par l'homme et prend également en charge SNI, ce qui est important si vous travaillez avec un serveur HTTP est:

openssl s_client -servername example.com -connect example.com:443 \
    </dev/null 2>/dev/null | openssl x509 -text

l'option - servername est d'activer le support SNI et le openssl x509-text imprime le certificat dans un format lisible par l'homme.

26
répondu Florian 2016-08-22 14:59:53
la source

pour obtenir le certificat de serveur distant, vous pouvez utiliser openssl outil et vous pouvez le trouver entre BEGIN CERTIFICATE et END CERTIFICATE que vous avez besoin de copier et coller dans votre fichier de certificat (CRT).

Voici la commande qui le démontre:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt

pour retourner tous les certificats de la chaîne, il suffit d'ajouter g (global) comme:

ex +'g/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq

, Alors vous pouvez simplement importer votre fichier de certificat ( file.crt ) dans votre porte-clés et lui faire confiance, donc Java ne devrait pas se plaindre.

sur OS X vous pouvez double-cliquer sur le fichier ou faire glisser et déposer dans votre porte-clés, de sorte qu'il apparaîtra dans login/certificats. Puis double-cliquez sur le certificat importé et faites-le toujours confiance pour SSL .

sur CentOS 5 vous pouvez les ajouter dans le fichier /etc/pki/tls/certs/ca-bundle.crt (et exécuter: sudo update-ca-trust force-enable ), ou dans CentOS 6 les copier dans /etc/pki/ca-trust/source/anchors/ et lancez sudo update-ca-trust extract .

dans Ubuntu, copiez - les dans /usr/local/share/ca-certificates et lancez sudo update-ca-certificates .

19
répondu kenorb 2016-03-25 15:11:34
la source

vous pouvez obtenir et stocker le certificat racine du serveur en utilisant le script de bash suivant:

CERTS=$(echo -n | openssl s_client -connect $HOST_NAME:$PORT -showcerts | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p')
echo "$CERTS" | awk -v RS="-----BEGIN CERTIFICATE-----" 'NR > 1 { printf RS "151900920" > "'$SERVER_ROOT_CERTIFICATE'"; close("'$SERVER_ROOT_CERTIFICATE'") }'

écrase juste les variables requises.

4
répondu Andrei Aleksandrov 2017-06-30 14:39:21
la source
HOST=gmail-pop.l.google.com
PORT=995

openssl s_client -servername $HOST -connect $HOST:$PORT < /dev/null 2>/dev/null | openssl x509 -outform pem
4
répondu akond 2017-10-25 04:09:24
la source

pour imprimer uniquement la chaîne de certificats et non le certificat du serveur:

# MYHOST=myhost.com
# MYPORT=443
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}'

pour mettre à jour CA trust sur CentOS/RHEL 6/7:

# update-ca-trust enable
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >/etc/pki/ca-trust/source/anchors/myca.cert
# update-ca-trust extract

sur CentOS / RHEL 5:

# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >>/etc/pki/tls/certs/ca-bundle.crt
3
répondu Mathieu CARBONNEAUX 2018-04-24 20:29:17
la source

pour le bénéfice d'autres comme moi qui ont essayé de suivre le bon conseil ici lors de l'accès AWS CloudFront mais a échoué, l'astuce est d'ajouter -servername domain.name.. .

Source: https://serverfault.com/a/780450/8972

1
répondu Amos Shapira 2017-04-13 15:13:41
la source

une doublure pour extraire le certificat d'un serveur distant au format PEM, cette fois en utilisant sed :

openssl s_client -connect www.google.com:443 2>/dev/null </dev/null |  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
0
répondu André Fernandes 2018-09-28 13:46:18
la source