199 votes

connexion https en utilisant CURL en ligne de commande

Je suis nouveau dans le monde de Curl et Cacerts et je rencontre un problème lors de la connexion à un serveur. En fait, j'ai besoin de tester la connectivité sur https d'une machine à une autre. J'ai une URL à laquelle je dois me connecter à partir de la machine A (une machine linux). J'ai essayé ceci à l'invite de commande

cmd> curl https://[my domain or IP address]

et a obtenu le résultat suivant :

curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

C'est en lisant quelques articles sur Internet que j'ai trouvé ceci :

openssl s_client -connect <domain name or Ip address>:443

et a reçu quelques réponses, dont la certificat du serveur (à l'intérieur de -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- ).

Que dois-je faire maintenant ? Je pense que je vais devoir copier-coller le texte à l'intérieur. BEGIN CERTIFICATE & END CERTIFICATE et l'enregistrer dans un fichier. Mais.., Quel type de fichier doit-il être ? .pem , .crt ?.. Que dois-je faire après cela ?

J'ai essayé ceci - j'ai copié le texte à l'intérieur BEGIN CERTIFICATE & END CERTIFICATE et l'a sauvegardé dans un .crt et l'a nommé my-ca.crt (j'ai aussi essayé la même chose en le nommant comme my-ca.pem fichier) et a ensuite procédé comme suit :

cmd>curl --cacert my-ca.crt https://[my domain or IP address]

Mais j'ai obtenu la même erreur.

208voto

Dave Child Points 1789

J'ai eu le même problème - je récupérais une page de mon propre site, qui était servie par HTTPS, mais curl donnait le même message "problème de certificat SSL". J'ai contourné le problème en ajoutant un -k à l'appel pour autoriser les connexions non sécurisées.

curl -k https://whatever.com/script.php

Edit : J'ai découvert la racine du problème. J'utilisais un certificat SSL (de StartSSL, mais je ne pense pas que cela ait beaucoup d'importance) et je n'avais pas configuré le certificat intermédiaire correctement. Si vous avez le même problème que user1270392 ci-dessus, c'est probablement une bonne idée de Testez votre certificat SSL et de régler les problèmes éventuels avant de recourir à la curl -k fixer.

75voto

Antonio Feitosa Points 872

Informations de base sur le certificat

C'est mon script de tous les jours :

curl --insecure -vvI https://www.example.com 2>&1 | awk 'BEGIN { cert=0 } /^\* SSL connection/ { cert=1 } /^\*/ { if (cert) print }'

Sortie :

* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: C=US; ST=California; L=Los Angeles; O=Verizon Digital Media Services, Inc.; CN=www.example.org
*  start date: Dec 10 00:00:00 2021 GMT
*  expire date: Dec  9 23:59:59 2022 GMT
*  issuer: C=US; O=DigiCert Inc; CN=DigiCert TLS RSA SHA256 2020 CA1
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x5588e1f5ae30)
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
* Connection #0 to host www.example.com left intact

Informations sur le certificat complet

openssl s_client -connect www.example.com:443 </dev/null 2>/dev/null | openssl x509 -inform pem -text

49voto

Somaiah Kumbera Points 434

Vous devez fournir toute la chaîne de certificats à curl, car curl n'est plus livré avec des certificats d'autorité de certification. Comme l'option cacert ne peut utiliser qu'un seul fichier, vous devez concaténer les informations de la chaîne complète dans un seul fichier

Copiez la chaîne de certificats (à partir de votre navigateur, par exemple) dans un fichier binaire x.509 (.cer) codé en DER. Faites-le pour chaque certificat.

Convertir les certificats en PEM et les concaténer en un seul fichier.

openssl x509 -inform DES -in file1.cer -out file1.pem -text
openssl x509 -inform DES -in file2.cer -out file2.pem -text
openssl x509 -inform DES -in file3.cer -out file3.pem -text

cat *.pem > certRepo

curl --cacert certRepo -u user:passwd -X GET -H 'Content-Type: application/json' "https//somesecureserver.com/rest/field"

J'ai écrit un blog sur la façon de procéder ici : http://javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html

27voto

ano Points 231

Utiliser --cacert pour spécifier un .crt fichier. ca-root-nss.crt par exemple.

7voto

geckob Points 3081

J'ai eu ce genre de problème et je l'ai résolu en suivant ces étapes :

  1. Obtenez l'ensemble des certificats de l'autorité de certification racine à partir d'ici : https://curl.haxx.se/ca/cacert.pem et l'enregistrer sur le disque local

  2. Trouver le php.ini fichier

  3. Régler le curl.cainfo le chemin d'accès aux certificats. Il s'agira donc de quelque chose comme :

curl.cainfo = /path/of/the/keys/cacert.pem

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