Fehler bei der Authentifizierung des openssl-Clients: tlsv1-Warnung unbekannt ca:… SSL-Warnung Nummer 48

7

Ich habe mit openssl ein Zertifikat generiert und es auf dem Computer des Clients abgelegt. Wenn ich jedoch versuche, mit diesem Zertifikat eine Verbindung zu meinem Server herzustellen, wird in der Betreffzeile ein Fehler von meinem Server zurück erwähnt.

Folgendes habe ich getan.

1) Ich führe eine Testverbindung mit openssl durch, um festzustellen, welche CA-Namen für Client-Zertifikate für meinen Server zulässig sind. Ich gebe diesen Befehl von meinem Client-Computer an meinen Server aus:

openssl s_client -connect myupload.mysite.net:443/cgi-bin/posupload.cgi -prexit

und ein Teil von dem, was ich zurück bekomme, ist wie folgt:

Acceptable client certificate CA names
/C=US/ST=Colorado/L=England/O=Inteliware/OU=Denver Office/CN=Tim Drake/[email protected]
/C=US/ST=Colorado/O=Inteliware/OU=Denver Office/CN=myupload.mysite.net/[email protected]

2) In der Apache-Konfigurationsdatei auf dem Server finden Sie Informationen zur SSL-Clientauthentifizierung:

SSLCACertificatePath /etc/apache2/certs

SSLVerifyClient require 
SSLVerifyDepth  10

3) Ich habe mit mypos.pem und mypos.key ein selbstsigniertes Client-Zertifikat mit dem Namen "client.pem" erstellt. Wenn ich also diesen Befehl ausführe:

openssl x509 -in client.pem -noout -issuer -subject -serial

Hier ist, was zurückgegeben wird:

issuer= /C=US/ST=Colorado/O=Inteliware/OU=Denver Office/CN=myupload.mysite.net/[email protected]
subject= /C=US/ST=Colorado/O=Inteliware/OU=Denver Office/CN=mlR::mlR/[email protected]
serial=0E

(Bitte beachten Sie, dass sich mypos.pem in / etc / apache2 / certs / befindet und mypos.key in / etc / apache2 / certs / private / gespeichert ist.)

4) Ich habe client.pem auf dem Client-Computer abgelegt und auf dem Client-Computer den folgenden Befehl ausgeführt:

openssl s_client -connect myupload.mysite.net:443/cgi-bin/posupload.cgi -status -cert client.pem

und ich bekomme diesen Fehler:

CONNECTED(00000003)
OCSP response: no response sent
depth=1 /C=US/ST=Colorado/L=England/O=Inteliware/OU=Denver Office/CN=Tim Drake/[email protected]
verify error:num=19:self signed certificate in certificate chain
verify return:0
574:error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:/SourceCache/OpenSSL098/OpenSSL098-47/src/ssl/s3_pkt.c:1102:SSL alert number 48
574:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:/SourceCache/OpenSSL098/OpenSSL098-47/src/ssl/s23_lib.c:182:

Ich bin wirklich ratlos darüber, was ich falsch gemacht habe. Ich habe ziemlich viel nach diesem Fehler gesucht und festgestellt, dass die ausstellende Zertifizierungsstelle des Client-Zertifikats vom Server nicht als vertrauenswürdig eingestuft wird. Wenn ich mir jedoch den Aussteller meines Client-Zertifikats anschaue, stimmt er mit einem der Fehler überein Die akzeptierte Zertifizierungsstelle, die von meinem Server zurückgegeben wurde.

Kann mir bitte jemand helfen?

Vielen Dank im Voraus.

JoJoeDad
quelle

Antworten:

5

ok, ich habe endlich herausgefunden, was das Problem war und möchte es teilen, falls jemand auch mit dieser Fehlermeldung nicht weiterkommt.

Die Konfigurationsdatei von Apache enthält die folgenden Zeilen, wenn es um die Zertifizierungsstelle geht:

    #   Set the CA certificate verification path where to find CA
    #   certificates for client authentication or alternatively one
    #   huge file containing all of them (file must be PEM encoded)
    #   Note: Inside SSLCACertificatePath you need hash symlinks
    #         to point to the certificate files. Use the provided
    #         Makefile to update the hash symlinks after changes.

Dies bedeutet, dass jede Zertifikatdatei in diesem Verzeichnis, auf die SSLCACertificatePath verweist, einen symbolischen Link verwenden muss. UND vor allem muss der Name jedes symbolischen Links der Betreff-Hash-Wert jedes Zertifikats sein. Sie können den Hashwert des CA-Zertifikats ermitteln, indem Sie diesen Befehl ausführen:

    openssl x509 -subject_hash -in *cacert.pem*

Wenn der Hash-Wert 0434423b war, sollten Sie in dem Verzeichnis, auf das SSLCACertificatePath verweist, zwei symbolische Links erstellen, um auf das Zertifikat im Verzeichnis zu verweisen:

0434423b -> /etc/apache2/certs/mypos.pem
0434423b.0 -> /etc/apache2/certs/mypos.pem

Dies sollte das Problem lösen. Wenn ich die SSLCACertificateFile verwendet hätte, hätte ich natürlich nicht so viele Probleme gehabt.

Die Erklärung von SSLCACertificatePath habe ich hier gefunden:

Die Befehlsseite von openssl wird überprüft

Schauen Sie unter -CApath Verzeichnis

JoJoeDad
quelle
Ich bin mir nicht sicher über die SSLCACertificateFile. Es wird anscheinend nicht verwendet, um Client-Zertifikate zu überprüfen, sondern um das Zertifikat Ihres eigenen Servers den Verbindungsclients vorzulegen, damit diese Sie überprüfen können (nicht umgekehrt). Deshalb ist es nur eine Datei. Sie können keine SSLCACertificateFile für die Zertifizierungsstelle jedes Clients haben, dies wäre nicht sehr sinnvoll.
Ychaouche
1

Ich habe festgestellt, dass der Befehl "sudo update-ca-certificates --fresh" automatisch symbolische Links vom Betreff-Hashwert jedes Zertifikats zum Zertifikat generiert.

Mark Miller
quelle
Es ist nicht ganz klar, was Sie hier sagen wollen und was es mit der Frage zu tun hat.
Etagenklo
0

Hallo, haben Sie versucht, den folgenden Befehl auszuführen:

openssl s_client -connect myupload.mysite.net:443/cgi-bin/posupload.cgi -status -cert client.pem -verify 1 -showcerts

Beachten Sie die Überprüfung 1 . Es sagt ssl, wie tief es gehen muss, und ich denke, dies könnte das Problem sein, das Sie in Ihrer Apache-Konfiguration haben. Versuchen Sie, die Apache-Konfiguration festzulegen.

SSLVerifyDepth 1

Prost, Dexter

Danie
quelle
Ich bekomme noch einige Nachrichten zurück, aber am Ende werden immer noch die gleichen zwei Fehlerzeilen angezeigt ... hier ist, was ich zusätzlich zurück bekomme. Tiefe = 1 / C = US / ST = Colorado / L = England / O = Intelitap / OU = Büro in Denver / CN = Tim Drake/[email protected] Fehler überprüfen: num = 19: Selbstsigniertes Zertifikat in der Zertifikatskette Rückgabe überprüfen: 1 Tiefe = 1 / C = US / ST = Colorado / L = England / O = Inteliware / OU = Büro in Denver / CN = Tim Drake/[email protected] Rückgabe überprüfen: 1 Tiefe = 0 / C. = US / ST = Colorado / O = Intelitap / OU = Denver Office/CN=myupload.mysite.net/[email protected] Rückgabe überprüfen: 1
JoJoeDad
Richtig, Sie müssen möglicherweise Ihr CA-Stammzertifikat zu Ihrem Befehl hinzufügen:> openssl s_client -connect myupload.mysite.net:443/cgi-bin/posupload.cgi -status -cert client.pem -verify 1 -showcerts -CAfile filecontainingyourCA Dies ist Ihr Fehler in "19 X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: Selbstsigniertes Zertifikat in der Zertifikatskette Die Zertifikatskette konnte mit den nicht vertrauenswürdigen Zertifikaten aufgebaut werden, aber der Stamm wurde lokal nicht gefunden."
Danie
Danke für den Vorschlag. Das hat auch nicht funktioniert.
JoJoeDad
Könnte ich das falsche Zertifikat verwenden, um das Client-Zertifikat zu generieren? mypos.pem und mypos.key sind das Serverzertifikat und der Schlüssel ... Vielleicht sollte ich einen anderen Satz von Zertifikaten und Schlüsseln verwenden?
JoJoeDad
Auf dem Server zeigt das Fehlerprotokoll: Zertifikatüberprüfung: Fehler (20): Lokales Ausstellerzertifikat kann nicht
abgerufen werden