web-dev-qa-db-fra.com

Commande Curl pour https (SSL)

J'essaie d'exécuter la commande CURL suivante mais j'obtiens une erreur de certificat SSL:

curl https://example.com:8443/cli/agentCLI -u username:password

Erreur:

curl: (60) Problème de certificat SSL, vérifiez que le certificat CA est OK. Détails: erreur: 14090086: routines SSL: SSL3_GET_SERVER_CERTIFICATE: échec de la vérification du certificat Plus de détails ici: http://curl.haxx.se/docs/sslcerts.html

curl effectue la vérification du certificat SSL par défaut, à l'aide d'un "ensemble" de clés publiques (CA) de l'autorité de certification (CA). Le bundle par défaut est nommé curl-ca-bundle.crt; vous pouvez spécifier un autre fichier à l'aide de l'option --cacert. Si ce serveur HTTPS utilise un certificat signé par une autorité de certification représentée dans le bundle, la vérification du certificat a probablement échoué en raison d'un problème avec le certificat (il peut être expiré ou le nom peut ne pas correspondre au nom de domaine dans l'URL). Si vous souhaitez désactiver la vérification curl du certificat, utilisez l'option -k (ou --insecure).

Comment pourrais-je résoudre ce problème pour autoriser les URL SSL?

9
Kalaiyarasan

si vous utilisez un certificat auto-signé sur le serveur, vous pouvez utiliser:

curl -k https://example.com:8443/cli/agentCLI -u username:password

mais sachez que ce n'est pas mieux que d'utiliser une connexion non SSL au serveur, car votre communication ne sera plus sécurisée, permettant toutes sortes d'attaques d'homme au milieu.

Bien que mon conseil soit de télécharger le .pem depuis le serveur:

en utilisant:

echo "HEAD / HTTP/1.0\n Host: example.com\n\n EOT\n" | openssl s_client -prexit -connect example.com:8443 > cert.pem

sur votre ordinateur, ne conservez que la partie entre BEGIN CERTIFICATE et END CERTIFICATE dans le fichier (y compris les lignes BEGIN/END) et donnez-lui le paramètre --cacert option, vous pouvez également le télécharger. Vous pourrez ensuite authentifier votre serveur à chaque connexion!

curl --cacert cert.pem https://example.com:8443/cli/agentCLI -u username:password

Tester sur mon propre serveur auto-signé, ça marche bien:

% openssl s_client -showcerts -connect example.com:443 </dev/null 2>/dev/null | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' | grep -m1 -B-1 -- '-----END CERTIFICATE-----'  > cert.pem
% curl --cacert cert.pem https://example.com

pour un exemple qui devrait fonctionner:

% openssl s_client -showcerts -connect git.cryptolib.org:443 </dev/null 2>/dev/null | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' | grep -m1 -B-1 -- '-----END CERTIFICATE-----'  > cert.pem
% curl --cacert cert.pem https://git.cryptolib.org
curl: (51) SSL: certificate verification failed (result: 5)

mais malheureusement ce n'est pas le cas.

J'ai également essayé de le faire, comme suggéré ici :

% openssl x509 -inform PEM -in cert.pem -text -out certdata.pem
% curl --cacert certdata.pem https://git.cryptolib.org

Ce qui ne fonctionne pas, car ce site (git.cryptolib.org) que j'utilise pour les tests n'est pas auto-signé, mais il provient de la chaîne CACert, qui peut être résolu en utilisant les certificats racine CACert, à la suite de cela FAQ .


quelques ressources à creuser:

Mais aucune réponse définitive à ce jour: -s

15
zmo