J'ai un conteneur Docker basé sur Linux, où si je fais:
openssl s_client -showcerts -connect www.google.com:443 CONNECTED(00000003) depth=3 DC = com, DC = forestroot, CN = SHA256RootCA verify error:num=19:self signed certificate in certificate chain --- Certificate chain 0 s:/C=US/ST=California/L=Mountain View/O=Google LLC/CN=www.google.com i:/CN=ssl-decrypt -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgIIXIk3p8xOX/kwDQYJKoZIhvcNAQELBQAwFjEUMBIGA1UE AxMLc3NsLWRlY3J5cHQwHhcNMTgxMjE5MDgxNzAwWhcNMTkwMzEzMDgxNzAwWjBo ... tq0VAGIoj4+YhO6bktTq3alCRoLstJuuxjVdb1wRkH4YRi0I6ZAB1Cw+M8Lg+2eQ KuEo -----END CERTIFICATE----- 1 s:/CN=ssl-decrypt i:/DC=com/DC=bgs/CN=SHA256IssueCA -----BEGIN CERTIFICATE----- MIIGzDCCBLSgAwIBAgITEQAADvB9T7mSaacwDQABAAAO8DANBgkqhkiG9w0BAQsF ADBCMRMwEQYKCZImiZPyLGQBGRYDY29tMRMwEQYKCZImiZPyLGQBGRYDYmdzMRYw ... 1z9f/nkj2XTRyGeACoy0qRd5uXJHp1iGM27l3RFDR9OjrfPV56pOBUYWAlc9Nn+1 Vr3qUZrcCkROrmYisVF4jg== -----END CERTIFICATE----- 2 s:/DC=com/DC=MyCompanyServer/CN=SHA256IssueCA i:/DC=com/DC=MyCompanyServer/CN=SHA256RootCA -----BEGIN CERTIFICATE----- MIIH4zCCBcugAwIBAgITOQAAAAOa4wv9nnK0uQAAAAAAAzANBgkqhkiG9w0BAQsF ADBIMRMwEQYKCZImiZPyLGQBGRYDY29tMRowGAYKCZImiZPyLGQBGRYKZm9yZXN0 ... IomErcbcymIWBmN75PVMsk9EMyqDP394jG8+IOK+lVUVX4pxzhdd7eYbqTAwDE1X bNWcZZkt/w== -----END CERTIFICATE----- 3 s:/DC=com/DC=MyCompanyServer/CN=SHA256RootCA i:/DC=com/DC=MyCompanyServer/CN=SHA256RootCA -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIQULxmYXGJ1aFIlIyCHA4NIzANBgkqhkiG9w0BAQsFADBI MRMwEQYKCZImiZPyLGQBGRYDY29tMRowGAYKCZImiZPyLGQBGRYKZm9yZXN0cm9v ... jQBLY0/KIjHywv66GhtVWpexgQcXrLxQP2VHW7eXpsylvwkNU5XNQYzHTB7u+w5C VunfRLt/7mVWyURcwkOre38tVSByKR4= -----END CERTIFICATE----- --- Server certificate subject=/C=US/ST=California/L=Mountain View/O=Google LLC/CN=www.google.com issuer=/CN=ssl-decrypt --- No client certificate CA names sent Peer signing digest: SHA256 Server Temp Key: ECDH, P-256, 256 bits --- SSL handshake has read 6556 bytes and written 302 bytes Verification error: self signed certificate in certificate chain --- New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256 Server public key is 2048 bit Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES128-GCM-SHA256 Session-ID: 723D9976F985887CA5F256EE3C2E7B44B9C98A6B440AAF4E19564AE101F78D00 Session-ID-ctx: Master-Key: C3D8759A753C1D269FF9C00854E59B8C10ABC1E94AFE9F0166486A649FE295ACE1AF5E5BEDB0129E557E781BC860D2FA PSK identity: None PSK identity hint: None SRP username: None Start Time: 1548690163 Timeout : 7200 (sec) Verify return code: 19 (self signed certificate in certificate chain) Extended master secret: yes --- read:errno=0
... alors j'obtiens une erreur:
curl: (60) Problème de certificat SSL: certificat auto-signé dans la chaîne de certificats Plus de détails ici: https://curl.haxx.se/docs/sslcerts.html
La même chose se produit pour n'importe quelle URL - ce n'est pas Google qui est en faute.
Le lien référencé ci-dessus suggère diverses solutions, dont aucune ne semble appropriée à part peut-être la dernière, ce qui suggère mise à jour du magasin de certificats. Mais il n'y a pas d'instructions sur la façon de faire cela (ou du moins, aucune n'a de sens pour moi).
Est-ce la bonne chose à faire, et si oui, comment?
MISE À JOUR : comme demandé, voici le résultat de:
curl https://google.com
Ce que je retiens, c'est qu'il y a un certificat dans cette chaîne appartenant au entreprise pour laquelle je travaille (que j'ai renommé MyCompanyServer), et j'imagine que c'est le problème.
Ai-je raison de penser que je dois installer une sorte de clé pour ce certificat? Tout cela est grec pour moi, alors excuses pour les questions du débutant.
3 Réponses :
Vous n'avez probablement pas de certificats CA corrects disponibles dans le conteneur, donc les connexions TLS ne peuvent pas être vérifiées.
Essayez d'installer le package ca-certificates
(le package peut avoir un nom différent , cela dépend de la distribution utilisée).
MISE À JOUR:
Votre entreprise inspecte les connexions TLS dans le réseau de l'entreprise, donc les certificats d'origine sont remplacés par les certificats de votre entreprise. Vous devez ajouter le certificat CA de votre entreprise aux certificats CA racine.
Linux (Ubuntu, Debian):
/usr/local/share/ca-certificates/
sudo update-ca-certificates
Si votre système d'exploitation hôte a déjà préconfiguré correctement les certificats d'autorité de certification (certificats d'autorité de certification d'entreprise inclus), vous pouvez simplement les monter en tant que volume dans le conteneur:
docker run \ -v /etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt \ ...
Emplacements typiques des certificats CA:
/etc/ssl/certs/ca-certificates.crt
Debian / Ubuntu / Gentoo etc. /etc/pki/tls/certs/ca-bundle.crt
Fedora / RHEL 6 /etc/ssl/ca-bundle.pem
OpenSUSE /etc/pki/tls/cacert.pem
OpenELEC /etc/pki/ca-trust/extrected/pem/tls-ca-bundle.pem
CentOS / RHEL 7
si je fais apt-get install ca-certificates
, cela signale qu'il est déjà installé et à jour. Mais où ils sont et si curl
est capable de les trouver, je ne peux pas le dire.
Ajout d'informations sur le certificat CA d'entreprise.
c'est excellent - merci pour cela. Cependant, malheureusement, je ne semble pas avoir sudo
:-(
Incluez le certificat CA de l'entreprise dans l'image Docker.
Merci Jan pour toute votre aide.
Pour moi, la désactivation temporaire de l'antivirus (Kaspersky) a résolu le problème.
J'utilisais ce code pour envoyer une requête cUrl, cela n'a pas fonctionné et j'ai généré cette erreur:
Problème de certificat SSL: certificat auto-signé dans la chaîne de certificats php curl
curl_setopt($ch, CURLOPT_URL, "https://test.example.com/v1/authenticate.json?api_key=123456"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0); curl_setopt($ch, CURLOPT_FAILONERROR, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_SSLCERT,'cert.embedapp.20191004.pem');
Après avoir tout essayé, j'ai changé ma requête cUrl en:
curl_setopt($ch, CURLOPT_URL, "https://test.example.com/v1/authenticate.json?api_key=123456"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_FAILONERROR, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch,CURLOPT_CAINFO,'cert.embedapp.20191004.pem'); curl_setopt($ch,CURLOPT_CAPATH,'./cert.embedapp.20191004.pem');
Enfin ça marche pour moi :)
D'accord, je viens d'ajouter cette déclaration et cela fonctionne très bien maintenant.
CURLOPT_SSL_VERIFYPEER => 0,
Juste ajouté à où?
Oui, où avez-vous ajouté cela? Est-ce une variable d'environnement?
J'ai mis une version modifiée de ceci comme curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, 0);
comme une ligne dans mon propre bit de cURL qui avait un problème similaire. Il n'authentifie toujours pas la page mais arrête au moins l'erreur SSL sur un certificat auto-signé.
Veuillez afficher la sortie de
openssl s_client -showcerts -connect www.google.com:443
. Quelque chose (proxy) ou quelqu'un (attaquant) "vole" probablement votre connexion TLS et utilise ses propres certificats auto-signés. Quoi / qui fournit votre connectivité Internet? Un proxy est-il configuré dans la configuration du démon docker ou une variable d'environnement proxy est-elle définie au niveau du conteneur?@JanGaraj: J'ai ajouté la sortie. Je sais que je suis derrière un pare-feu, mais je n'ai pas de détails. Il semble qu'il y ait un certificat dans la chaîne qui est local pour l'entreprise pour laquelle je travaille. Je n'en sais pas assez pour répondre à vos deux dernières questions :-(
J'ai ce problème et je ne peux pas le résoudre jusqu'à présent