web-dev-qa-db-fra.com

Comment faire confiance au certificat auto-signé dans la ligne de commande cURL?

J'ai créé un certificat auto-signé pour foo.localhost en utilisant Let's Encrypt recommendation en utilisant ce Makefile:

include ../.env

configuration = csr.cnf
certificate = self-signed.crt
key = self-signed.key

.PHONY: all
all: $(certificate)

$(certificate): $(configuration)
    openssl req -x509 -out $@ -keyout $(key) -newkey rsa:2048 -nodes -sha256 -subj '/CN=$(HOSTNAME)' -extensions EXT -config $(configuration)

$(configuration):
    printf "[dn]\nCN=$(HOSTNAME)\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:$(HOSTNAME)\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth" > $@

.PHONY: clean
clean:
    $(RM) $(configuration)

Je l'ai ensuite attribué à un serveur Web. J'ai vérifié que le serveur renvoie le certificat correspondant:

$ openssl s_client -showcerts -connect foo.localhost:8443 < /dev/null
CONNECTED(00000003)
depth=0 CN = foo.localhost
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = foo.localhost
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/CN=foo.localhost
   i:/CN=foo.localhost
-----BEGIN CERTIFICATE-----
[…]
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=foo.localhost
issuer=/CN=foo.localhost
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1330 bytes and written 269 bytes
Verification error: unable to verify the first certificate
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: […]
    Session-ID-ctx: 
    Master-Key: […]
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket:
    […]

    Start Time: 1529622990
    Timeout   : 7200 (sec)
    Verify return code: 21 (unable to verify the first certificate)
    Extended master secret: no
---
DONE

Comment puis-je faire en sorte que cURL lui fasse confiance sans rien modifier dans/etc?--cacert Fonctionne pas, probablement parce qu'il n'y a pas de CA:

$ curl --cacert tls/foo.localhost.crt 'https://foo.localhost:8443/'
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

L'objectif est d'activer HTTPS pendant le développement:

  • Je ne peux pas avoir un certificat de type production sans beaucoup de travail pour activer la vérification DNS dans tous les environnements de développement. Par conséquent, je dois utiliser un certificat auto-signé.
  • Je veux toujours évidemment rendre mon environnement de développement aussi similaire que possible à la production, donc je ne peux pas simplement ignorer tous les problèmes de certificat. curl -k Est comme catch (Exception e) {} dans ce cas - rien du tout comme un navigateur parlant à un serveur web.

En d'autres termes, lorsque je lance curl [something] https://project.local/api/foo, Je veux être sûr que

  1. si TLS est configuré correctement sauf pour avoir un certificat auto-signé la commande réussira et
  2. si j'ai des problèmes avec ma configuration TLS sauf pour avoir un certificat auto-signé la commande échouera.

L'utilisation de HTTP ou de --insecure Échoue au deuxième critère.

11
l0b0

Suivre ces étapes devrait résoudre votre problème:

  1. Téléchargez et enregistrez le certificat auto-signé: echo quit | openssl s_client -showcerts -servername "${API_Host}" -connect "${API_Host}":443 > cacert.pem
  2. Informez le client curl: curl --cacert cacert.pem --location --silent https://${API_Host}

On pourrait également utiliser wget et ignorer les certificats avec: wget --no-check-certificate https://${API_Host}

3
Robert Brisita

Essayez -k:

curl -k https://yourhost/

Il doit "accepter" les certificats auto-signés

0
V13

Il est non valide d'avoir une chaîne de confiance qui inclut un certificat auto-signé. Si tel était le cas, n'importe qui pourrait fournir une chaîne de confiance (constituée) valide. Si un certificat auto-signé apparaît dans une chaîne de confiance, il doit être ignoré. Un certificat auto-signé ne peut être valide que dans un répertoire local (contrôlé par le propriétaire de l'ordinateur). Le certificat attribué à n'importe quel serveur doit être chaîné au certificat auto-signé.

Un guide général sans la plupart des petits détails.

  • Votre sortie du openssl s_client la commande affiche deux erreurs:

    verify error:num=20:unable to get local issuer certificate
    verify error:num=21:unable to verify the first certificate
    

    Cela signifie que le magasin de certificats par défaut de votre machine manque un certificat qui valide la chaîne fournie par le site Web que vous avez utilisé. Vous avez besoin d'un répertoire avec un certificat auto-signé et un certificat chaîné à celui du serveur Web.

Pas:

  1. Vous pouvez créer un nouveau répertoire (n'importe où), le traiter avec le c_rehash script et dites à openssl de l'utiliser pour vérifier les certificats avec l'option -CApath Directory. Apportez des modifications jusqu'à ce que vous vous débarrassiez des deux erreurs lors de l'utilisation de -CApath option.

  2. Générez un certificat chaîné pour le serveur Web.

  3. Ensuite, indiquez à curl le répertoire des certificats avec:

    curl --capath <dir>
    

    et toutes les autres options nécessaires.

Cela effacera les deux erreurs.

0
Isaac