Curl: Kann lokales Ausstellerzertifikat nicht erhalten. Wie kann man debuggen?

14

Ich habe ein seltsames Problem. Ich habe meine LAMP-Entwicklungsmaschine (Debian) auf PHP 7 aktualisiert. Danach kann ich über Curl keine Verbindung mehr zu einer bestimmten TLS-verschlüsselten API herstellen.

Das betreffende SSL-Zertifikat ist von thawte signiert.

curl https://example.com

gibt mir

curl: (60) SSL certificate problem: unable to get local issuer certificate

wohingegen

curl https://thawte.com

was natürlich auch von Thawte-Werken signiert ist.

Ich kann auf die API-Site über HTTPS auf anderen Computern zugreifen, z. B. auf meinem Desktop über Curl und im Browser. Das Zertifikat ist also definitiv gültig. Die Bewertung von SSL Labs ist A.

Alle anderen Curl-Anfragen von meinem Entwicklercomputer an andere SSL-verschlüsselte Sites funktionieren. Meine Root-Zertifikate sind aktuell. Zur Überprüfung lief ich update-ca-certificates. Ich habe sogar http://curl.haxx.se/ca/cacert.pem nach / etc / ssl / certs heruntergeladen und lief c_rehash.

Immer noch der gleiche Fehler.

Gibt es eine Möglichkeit, den Überprüfungsprozess zu debuggen und festzustellen, nach welcher lokalen Zertifikat-Locke (oder OpenSSL-Locke) gesucht wird, diese jedoch nicht gefunden wird, dh nach einem Dateinamen?

AKTUALISIEREN

curl -vs https://example.com

sagt mir (IP + Domain anonymisiert)

* Hostname was NOT found in DNS cache
*   Trying 192.0.2.1...
* Connected to example.com (192.0.2.1) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0

Und

echo | openssl s_client -connect example.com:443

gibt

CONNECTED(00000003)
depth=2 C = US, O = "thawte, Inc.", OU = Certification Services Division, OU = "(c) 2006 thawte, Inc. - For authorized use only", CN = thawte Primary Root CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=DE/ST=XYZ/CN=*.example.com
   i:/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
 1 s:/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
   i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
 2 s:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
   i:/C=ZA/ST=Western Cape/L=Cape Town/O=Thawte Consulting cc/OU=Certification Services Division/CN=Thawte Premium Server CA/[email protected]
---
Server certificate
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
subject=/C=DE/ST=XYZ/CN=*.example.com
issuer=/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
---
No client certificate CA names sent
---
SSL handshake has read 4214 bytes and written 421 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: [...]
    Session-ID-ctx:
    Master-Key: [...]
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 5a 95 df 40 2c c9 6b d5-4a 50 75 c5 a3 80 0a 2d   Z..@,.k.JPu....-
    [...]
    00b0 - d5 b9 e8 25 00 c5 c7 da-ce 73 fb f2 c5 46 c4 24   ...%.....s...F.$

    Start Time: 1455111516
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---
DONE
rauben
quelle
1
Könnten Sie eine ausführliche Ausgabe von mindestens diesen cmd geben? curl -vs https://example.com echo | openssl s_client -connect example.com:443
François

Antworten:

8

Mit openssl s_client -connect thawte.com:443zeigt:

---
Certificate chain
 0 s:/1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/O=Thawte, Inc./C=US/ST=California/L=Mountain View/businessCategory=Private Organization/serialNumber=3898261/OU=Infrastructure Operations/CN=www.thawte.com
   i:/C=US/O=thawte, Inc./CN=thawte Extended Validation SHA256 SSL CA
 1 s:/C=US/O=thawte, Inc./CN=thawte Extended Validation SHA256 SSL CA
   i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2008 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA - G3
---

Das letzte "i" zeigt die ausstellende selbstsignierte Stammzertifizierungsstelle. Ich vermute , dass diese bestimmte Thawte- Stammzertifizierungsstelle, _i.e. Das Zertifikat der primären Stammzertifizierungsstelle - G3 befindet sich nicht in Ihrem /etc/ssl/certsVerzeichnis (wie in der curlAusgabe angegeben; openssl s_clienthat keinen Standardpfad für die Zertifizierungsstelle und muss ausdrücklich angegeben werden, z -CApath /etc/ssl/certs . B. ).

Das Hinzufügen dieses Zertifikats zu Ihrem /etc/ssl/certsVerzeichnis (und das erneute Ausführen c_rehash) würde sicherlich nicht schaden. Und wenn es funktioniert, z. B. wie mit "Verifiziert" openssl s_client -connect example.com:443 -CApath /etc/ssl/certs, dann wissen Sie, dass für diesen update-ca-certificatesBefehl möglicherweise eine Prüfung / ein Debugging erforderlich ist, um festzustellen, warum er diese Stammzertifizierungsstelle nicht abgerufen hat.

Möglicherweise befindet sich die oben genannte Stammzertifizierungsstelle bereits in Ihrem /etc/ssl/certsVerzeichnis, und die oben genannten Schritte hatten keine Auswirkung. In diesem Fall müssen (zumindest in der von angebotenen Zertifizierungsstellenkette ) zwei weitere Zertifizierungsstellenzertifikate überprüft werden thawte.com:443: die aufgetaute primäre Stammzertifizierungsstelle und die aufgetaute SSL-Zertifizierungsstelle - G2 . Das Wiederholen der obigen Schritte, um diese Zertifikate in Ihrem /etc/ssl/certsVerzeichnis zu installieren (und erneut auszuführen c_rehash), funktioniert möglicherweise. Da es sich bei diesen beiden Zertifizierungsstellen um Zwischenzertifizierungsstellen und nicht um Stammzertifizierungsstellen handelt, erklärt das Fehlen einer dieser Zertifizierungsstellen Ihre Ergebnisse und wird möglicherweise von übersehen update-ca-certificates.

Hoffe das hilft!

Castaglia
quelle
Vielen Dank! Das Herunterladen des Zwischenzertifikats "thawte SSL CA - G2" nach / etc / ssl / certs und das erneute Ausführen von c_rehash haben das Problem behoben!
Rob
1
Dieser openssl s_client -connect <server>:443 -CAfile cacert.pemBefehl ist sehr hilfreich ... Danke!
kris
0

Dies kann durch eine falsche Reihenfolge des Standorts sowie durch das Ausstellen von Zwischen- und Stammzertifikaten in der Zertifikatdatei des öffentlichen Schlüssels des Standorts verursacht werden.

Die Anzeige des Browsers erfolgt in umgekehrter Richtung von oben nach unten (Root, Intermediate, Issuing, Site), das Zertifikat muss jedoch in der Richtung von unten nach oben (Site, Issuing, Intermediate, Root) erfolgen.

andrej
quelle