Wie kann man Gnu / Linux dazu bringen, einem Zertifikat zu vertrauen, dem Windows sofort vertraut?

11

Es gibt einen Server mit einer unterbrochenen SSL-Kette, wie bei dieser SSL-Prüfung gemeldet :

SSL-Prüfbericht

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 :

Geben Sie hier die Bildbeschreibung ein

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-certificatesund sogar das Globalsign Root-Zertifikat importiert. update-ca-certificateshat 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 .

Udo G.
quelle
Warum das Downvote?
Udo G
1
Ich stimme dafür, diese Frage als nicht zum Thema gehörend zu schließen, weil das OP etwas fragt, das er selbst nicht beeinflussen kann. Er sagte, er könne nichts auf der Serverseite ändern , daher gehört dies wahrscheinlich dem Superuser, da es ein Problem beschreibt, für das es keine clientseitige Lösung gibt.
LinuxSecurityFreak
2
Ich bitte speziell um eine clientseitige Lösung. Ich kann den Server nicht beeinflussen, habe aber die volle Kontrolle über das Client-Betriebssystem (Ubuntu) und möchte, dass diese spezielle Betriebssystem-Installation dem Zertifikat genauso vertraut wie anderen Betriebssystemen (Windows). Es geht nicht darum, die HTTPS-Site für andere zu reparieren.
Udo G
1
Die Frage
Udo G
1
Sie steuern den Server nicht, können das Problem jedoch der Person melden, die den Server steuert.
Michael Hampton

Antworten:

11

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, curlmit dem fehlerhaften Handshake zu arbeiten.

Laut einer Nachricht auf der Curl-Mailingliste:

Kann jemand bestätigen, ob cURL ein Zwischenzertifikat unterstützt (oder nicht)?

Ja tut es. Alle ca-Zertifikate haben eine Zertifikatkette, die bis zum Stamm reicht. Das Ca-Bündel, das Sie mit Curl verwenden, muss aus den Zertifikaten für die gesamte Kette bestehen.

/ daniel.haxx.se

Sie sollten in der Lage sein, die Stammzertifizierungsstelle und alle Zwischenzertifikate zu einem Bundle hinzuzufügen und curlmit 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 unter issuing.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.

garethTheRed
quelle
1
Es ist nicht mein Server, kann also nichts serverseitig ändern. Ich habe versucht, das CA-Bundle aus curl.haxx.se/docs/caextract.html zu verwenden (da Firefox dem Zertifikat vertraut) und es mit zu übergeben, --cacert cacert.pemaber CURL akzeptiert das Zertifikat immer noch nicht.
Udo G
1
Es ist dein Server. Wenn echo q | openssl s_client -showcerts -connect betriebsheft.vog.it:443Sie 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.
GarethTheRed
2
@garethTheRed: Ich verstehe, dass der Server nicht alle Zertifikate präsentiert, aber der Server nicht unter meiner Kontrolle ist (das habe ich mit "nicht mein Server" gemeint). Ich versuche nur, auf eine API auf einem fremden Server zuzugreifen. Unter Windows beschwert sich keiner meiner Browser über das Zertifikat, nur Linux / Debian / Ubuntu.
Udo G
@AB: vielen dank! Durch die Installation aller Stammzertifikate von dieser Seite wurde das Problem behoben . Ich würde jedoch gerne verstehen, warum dieser manuelle Schritt notwendig ist.
Udo G
2
Das fehlende Zwischenzertifikat (wie von @garethTheRed erwähnt) finden Sie dort: support.globalsign.com/customer/portal/articles/… . OP zunächst nur versucht , die hinzuzufügen root cert , die an Ort und Stelle wahrscheinlich schon war, also nichts zu erreichen.
AB