Es gibt einen Server mit einer unterbrochenen SSL-Kette, wie bei dieser SSL-Prüfung gemeldet :
Ich weiß, dass dies ein Problem ist , das auf dem Server selbst gelöst werden sollte , aber manchmal ist es schwierig , dies zu beheben (ich bin nicht der Administrator des Servers).
Die Sache ist, dass Chrome / Mozilla / Edge unter Windows dem Site-Zertifikat trotzdem vertrauen :
In einer Gnu / Linux-Bereitstellung (Ubuntu 18.04 in Docker) ist das Zertifikat jedoch nicht vertrauenswürdig:
curl: (60) SSL certificate problem: unable to get local issuer certificate
Ich habe versucht update-ca-certificates
und sogar das Globalsign Root-Zertifikat importiert. update-ca-certificates
hat in diesem Fall ein doppeltes Zertifikat gemeldet. Jedenfalls funktioniert nichts.
Wie zu reproduzieren
Docker verwenden:
docker run -it ubuntu:18.04
# within container:
apt-get update
apt-get -y install curl
curl https://betriebsheft.vog.it # <---- "unable to get local issuer certificate"
Wie kann ich Gnu / Linux dazu bringen, diesem Zertifikat zu vertrauen?
PS: Das gleiche Zertifikat wird korrekt auf einem anderen Server bereitgestellt .
quelle
Antworten:
Die eigentliche Lösung hierfür besteht darin, sicherzustellen, dass Ihr Server alle Zertifikate in der Kette und nicht nur das Endentitätszertifikat (Serverzertifikat) anzeigt.
Richten Sie Ihren Server - Administrator zu RFC 5246 Abschnitt 7.4.2 , die eindeutig besagt , dass Diese Meldung übermittelt das Zertifikat des Servers Kette an den Client.
Wenn Ihr Administrator dies aus irgendeinem Grund ablehnt / nicht tun kann, besteht Ihre alternative Option darin, zu versuchen,
curl
mit dem fehlerhaften Handshake zu arbeiten.Laut einer Nachricht auf der Curl-Mailingliste:
Sie sollten in der Lage sein, die Stammzertifizierungsstelle und alle Zwischenzertifikate zu einem Bundle hinzuzufügen und
curl
mit der--cacert <file>
Option darauf zu verweisen .Während Ihre Browser funktionieren, können Sie von dort aus auf die richtigen CA-Zertifikate zugreifen. Zeigen Sie auf der Registerkarte "Zertifikate" (für jeden Browser unterschiedlich, aber Sie werden es sicher herausfinden) die Zertifikatkette an. Doppelklicken Sie auf das Root CA ersten Globalsign Root CA - G1 und auf den Details der Registerkarte, klicken Sie auf In Datei kopieren ... . Speichern Sie es als
root.cer
. Machen Sie dasselbe mit dem AlphaSSL CA - SHA256 - G2 und speichern Sie es unterissuing.cer
. Verbinden Sie die beiden in einer einzigen Datei (z. B.chain.cer
) und verwenden Sie diese als Argument für-cacert
.Wie von @AB freundlicherweise erwähnt, finden Sie das fehlende Zertifikat auch hier .
Ihre Browser funktionieren, weil sie CA-Zertifikate zwischenspeichern. Wenn Sie in der Vergangenheit zu einer korrekt konfigurierten Website navigiert haben, deren Zertifikat von derselben Zertifizierungsstelle wie das Zertifikat Ihres Servers ausgestellt wurde, wird es vom Browser zwischengespeichert. Wenn Sie anschließend Ihre falsch konfigurierte Site besuchen, verwendet Ihr Browser die CA-Zertifikate in seinem Cache, um die Kette zu erstellen. Für Sie scheint alles in Ordnung zu sein, obwohl der Server hinter den Kulissen falsch konfiguriert ist.
Beachten Sie, dass IE / Edge und Chrome unter Windows denselben Cache verwenden, während Firefox seinen eigenen verwendet.
Darüber hinaus verwenden IE / Edge und Chrome (da sie denselben Kryptostapel verwenden) eine Erweiterung in Zertifikaten mit dem Namen AuthorityInformationAccess . Dies hat eine caIssuer- Option, die eine URL bereitstellt, von der das CA-Zertifikat des End-Entity-Zertifikats heruntergeladen werden kann. Selbst wenn einer dieser Browser die fehlenden Zertifikate aus dem vorherigen Browser nicht zwischengespeichert hat, kann er sie daher bei Bedarf abrufen. Beachten Sie, dass Firefox dies nicht tut, weshalb Firefox manchmal Zertifikatfehler anzeigen kann, wenn IE / Edge und Chrome zu funktionieren scheinen.
quelle
--cacert cacert.pem
aber CURL akzeptiert das Zertifikat immer noch nicht.echo q | openssl s_client -showcerts -connect betriebsheft.vog.it:443
Sie es ausführen, wird nur ein Zertifikat von Ihrem Server angezeigt. Es sollten zwei vorhanden sein - das End-Entity-Zertifikat (das vorgestellt wird) und die ausstellende Zertifizierungsstelle - das Alpha SSL-SHA256-G2-Zertifikat. Letzteres wird nicht vom Server gesendet, sollte aber.