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:
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
L'utilisation de HTTP ou de --insecure
Échoue au deuxième critère.
Suivre ces étapes devrait résoudre votre problème:
echo quit | openssl s_client -showcerts -servername "${API_Host}" -connect "${API_Host}":443 > cacert.pem
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}
Essayez -k
:
curl -k https://yourhost/
Il doit "accepter" les certificats auto-signés
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:
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.
Générez un certificat chaîné pour le serveur Web.
Ensuite, indiquez à curl le répertoire des certificats avec:
curl --capath <dir>
et toutes les autres options nécessaires.
Cela effacera les deux erreurs.