Hoe de fout “SSL-certificaatprobleem: zelfondertekend certificaat in certificaatketen” op te lossen?

Ik heb een op Linux gebaseerde Docker-container, en als ik dat doe:

curl https://google.com

…dan krijg ik een foutmelding:

krul: (60) Probleem met SSL-certificaat: zelfondertekend certificaat in certificaatketen
Meer details hier: https://curl.haxx.se/docs/sslcerts.html

Hetzelfde gebeurt voor elke URL – het is niet Google die de schuld heeft.

De link waarnaar hierboven wordt verwezen, suggereert verschillende oplossingen, waarvan geen enkele geschikt lijkt, afgezien van misschien de laatste, die suggereert dat het certificaatarchief wordt bijgewerkt. Maar er zijn geen instructies over hoe je dat moet doen (of in ieder geval geen enkele die voor mij logisch is).

Is dat het juiste om te doen, en zo ja, hoe?


UPDATE: zoals gevraagd, hier is het resultaat van:

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

Wat ik hieruit opmaak is dat er een certificaat in deze keten zit van het bedrijf waarvoor ik werk (dat ik heb hernoemd tot MyCompanyServer), en ik kan me voorstellen dat dat het probleem is.

Heb ik gelijk als ik denk dat ik een soort sleutel voor dat certificaat moet installeren? Dit is allemaal Grieks voor mij, dus excuses voor de beginnersvragen.


Antwoord 1, autoriteit 100%

Waarschijnlijk heeft u niet de juiste CA-certificaten in de container, dus TLS-verbindingen kunnen niet worden geverifieerd.

Probeer het pakket ca-certificateste installeren (pakket kan een andere naam hebben, dit hangt af van de gebruikte distributie).


UPDATE:

Uw bedrijf inspecteert TLS-verbindingen in het bedrijfsnetwerk, dus originele certificaten worden vervangen door uw bedrijfscertificaten. U moet uw bedrijfs-CA-certificaat toevoegen aan root-CA-certificaten.

Linux (Ubuntu, Debian):

  • kopieer CA-certificaat van bedrijf naar dir /usr/local/share/ca-certificates/
  • voer sudo update-ca-certificates
  • uit

Als uw host-besturingssysteem CA-certificaten al correct heeft geconfigureerd (inclusief bedrijfs-CA-certificaten), kunt u ze gewoon als een volume aan de container koppelen:

docker run \
  -v /etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt \
  ...

Typische locaties voor CA-certificaten:

  • /etc/ssl/certs/ca-certificates.crtDebian/Ubuntu/Gentoo enz.
  • /etc/pki/tls/certs/ca-bundle.crtFedora/RHEL 6
  • /etc/ssl/ca-bundle.pemOpenSUSE
  • /etc/pki/tls/cacert.pemOpenELEC
  • /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pemCentOS/RHEL 7

Antwoord 2, autoriteit 19%

Ok, ik heb deze verklaring zojuist toegevoegd en het werkt nu prima.

CURLOPT_SSL_VERIFYPEER => 0,

Antwoord 3

Ik gebruikte deze code om een cUrl-verzoek te verzenden, het werkte niet en gaf deze fout:

Probleem met SSL-certificaat: zelfondertekend certificaat in certificaatketen
php curl

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');

Na alles geprobeerd te hebben, heb ik mijn cUrl-verzoek gewijzigd in:

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');

Eindelijk werkt het voor mij 🙂

Other episodes