7
votes

Comment réparer l'erreur "Problème de certificat SSL: certificat auto-signé dans la chaîne de certificats"?

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 commentaires

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


3 Réponses :


15
votes

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):

  • copier le certificat de l'autorité de certification de l'entreprise dans le répertoire /usr/local/share/ca-certificates/
  • exécutez 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


6 commentaires

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.



0
votes

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 :)


0 commentaires

5
votes

D'accord, je viens d'ajouter cette déclaration et cela fonctionne très bien maintenant.

CURLOPT_SSL_VERIFYPEER => 0,


3 commentaires

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é.