Connexion https à l'aide de CURL à partir de la ligne de commande

127

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

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

et a obtenu ce qui suit:

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

En parcourant quelques articles sur Internet, j'ai fait ceci:

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

et j'ai obtenu une réponse, y compris le certificat du serveur (à l'intérieur -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----).

Que dois-je faire ensuite à partir d'ici. Je pense que je devrai simplement copier coller le texte à l'intérieur BEGIN CERTIFICATE & END CERTIFICATEet l'enregistrer dans un fichier. Mais, quel type de fichier cela devrait-il être? .pem, .crt? .. Que dois-je faire après ça?

J'ai essayé ceci - j'ai copié le texte à l'intérieur BEGIN CERTIFICATE & END CERTIFICATEet l' ai enregistré dans un .crtfichier - je l'ai nommé my-ca.crt( j'ai également essayé la même chose en le nommant comme my-ca.pemfichier), puis j'ai fait ceci:

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

Mais j'ai eu la même erreur.

user1270392
la source
Je ne suis pas sûr de la solution que vous proposez, mais je cherchais juste des informations similaires et j'ai trouvé ce site utile pour utiliser curl avec PHP unitstep.net/blog/2009/05/05/…
MauroPerez
1
vous pouvez également ajouter --insecurepour ignorer l'erreur SSL.
Alexej Magura
les versions plus récentes de curl (par exemple 7.64) ne reconnaîtraient pas les chiffrements plus anciens comme RC4-SHA - l'utilisation de l'ancienne version de curl (7.46) m'a aidé serverfault.com/questions/889631
...

Réponses:

142

J'ai eu le même problème - je cherchais une page de mon propre site, qui était servie via HTTPS, mais curl donnait le même message "problème de certificat SSL". J'ai contourné ce problème en ajoutant un -kindicateur à l'appel pour permettre 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 compte beaucoup) et je n'avais pas configuré correctement le certificat intermédiaire. Si vous rencontrez le même problème que user1270392 ci-dessus, c'est probablement une bonne idée de tester votre certificat SSL et de résoudre les problèmes éventuels avant de recourir au curl -kcorrectif.

Dave enfant
la source
5
-k flag est un bon raccourci. A travaillé pour moi!
tidydee
45

Solution simple

C'est mon script quotidien:

curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'

Production:

* Server certificate:
*    subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=www.google.com
*    start date: 2016-01-07 11:34:33 GMT
*    expire date: 2016-04-06 00:00:00 GMT
*    issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*    SSL certificate verify ok.
* Server GFE/2.0 is not blacklisted
* Connection #0 to host www.google.com left intact
Antonio Feitosa
la source
11
Ainsi, vous autorisez une --insecureconnexion via TSL, tous les jours ...
Brethlosze
2
@Brethlosze Merci pour votre commentaire. Mais ce n'est pas le cas. Le but est d'obtenir les informations SSL de toutes sortes de certificats.
Antonio Feitosa
30

Vous devez fournir toute la chaîne de certificats à curl, car curl n'est plus livré avec les certificats CA. Étant donné que l'option cacert ne peut utiliser qu'un seul fichier, vous devez concater les informations complètes de la chaîne en 1 fichier

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

Convertissez les certificats en PEM et concattez-les en 1 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

Somaiah Kumbera
la source
1
Pouvez-vous expliquer le but de la transmission du nom d'utilisateur et du mot de passe? Que faire si j'écris un client Java, dois-je transmettre le nom d'utilisateur et le mot de passe dans l'en-tête de la requête GET, dans ce cas?
Shubhi224
@ Shubhi224 pas si votre serveur https ne nécessite pas une simple authentification pour les requêtes GET. J'ai dû utiliser l'authentification car c'était un appel REST qui l'exigeait.
Somaiah Kumbera
Comme mentionné dans cette réponse, "Vous devez fournir toute la chaîne de certificats à curl, car curl n'est plus livré avec des certificats CA."
Mohamed Bana
16

utilisez --cacertpour spécifier un .crtfichier. ca-root-nss.crtpar exemple.

ano
la source
6

J'ai en fait eu ce genre de problème et je le résous par ces étapes:

  1. Obtenez le paquet de certificats CA racine à partir d'ici: https://curl.haxx.se/ca/cacert.pem et enregistrez-le sur local

  2. Trouvez le php.inifichier

  3. Définissez le curl.cainfocomme étant le chemin des certificats. Donc, ce sera quelque chose comme:

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

geckob
la source
1

après avoir résolu le problème, j'ai pu utiliser le fichier CA par défaut du système existant, sur debian6 c'est:

/etc/ssl/certs/ca-certificates.crt

en tant que root, cela peut être fait comme:

echo curl.cainfo=/etc/ssl/certs/ca-certificates.crt >> /etc/php5/mods-available/curl.ini

puis redémarrez le serveur Web.

Jasen
la source
1

tu pourrais utiliser ça

curl_setopt($curl->curl, CURLOPT_SSL_VERIFYPEER, false);

Ahmed Ali
la source
0

Pour moi, je voulais juste tester un site Web qui avait une redirection automatique http-> https. Je pense que j'ai déjà installé des certificats, donc cela seul fonctionne pour moi sur Ubuntu 16.04 en cours d'exécutioncurl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3

curl --proto-default https <target>

SamCyanure
la source
-3

Avec les versions modernes de curl, vous pouvez simplement remplacer l'adresse IP à laquelle vous connecter, en utilisant --resolve ou --connect-to (curl plus récent que la version 7.49). Cela fonctionne même avec SSL / SNI. Tous les détails se trouvent dans la page de manuel.

Par exemple, pour remplacer DNS et vous connecter à www.example.com avec SSL en utilisant une adresse IP particulière: (Cela remplacera également ipv6)

curl --resolve www.example.com:443:192.168.42.2 https://www.example.com/

Un autre exemple, pour se connecter à un serveur principal particulier nommé backend1 sur le port 8080

curl --connect-to www.example.com:80:backend1.example.com:8080 http://www.example.com/

N'oubliez pas d'ajouter l'en-tête d'hôte si le serveur en a besoin pour répondre correctement:

-H 'Host:www.example.com' 
Ingvarha
la source
Je ne sais pas comment cela répond à la question.
Brethlosze du