
Ich versuche, ein Skript zu erstellen, das prüft, ob eine Website ein für ihre Domain gültiges, nicht selbstsigniertes Zertifikat verwendet. Das bedeutet, dass im Browser keine Warnung angezeigt wird.
Ich habe versucht mit
openssl s_client -connect www.example.com:443 -servername www.example.com
Obwohl das Zertifikat für die Domäne nicht gültig ist, erhalte ich dennoch:
Rückgabecode überprüfen: 0 (ok)
Irgendeine Idee, wie ich das erreichen kann?
Antwort1
Wenn Sie möchten, dass OpenSSL das Zertifikat tatsächlich überprüft, müssen Sie es dazu anweisen.
1. Überprüfen Sie, ob der Hostname auf dem Zertifikat mit dem gewünschten Namen übereinstimmt
Dafür gibt es eine spezielle Option -verify_hostname
. Im folgenden Befehl verwende ich sie auf serverfault.com, prüfe aber mit dem Hostnamen example.com:
[jenny@temeraire crt] $ openssl s_client -verify_hostname example.com -connect serverfault.com:443
CONNECTED(00000003)
[...]
Verify return code: 62 (Hostname mismatch)
---
DONE
Der Rückgabecode des Prozesses selbst ist jedoch immer noch 0, was bedeutet, dass Sie sich die Ausgabe ansehen müssen, anstatt den Rückgabecode in einem Test zu verwenden.
2. Überprüfen, ob das Zertifikat von einer vertrauenswürdigen Zertifizierungsstelle stammt
Ich habe es auf der Website serverfault.com ausgeführt, ohne ihm eine Liste vertrauenswürdiger CAs zur erneuten Überprüfung zu geben, sodass die Überprüfung garantiert fehlschlägt:
[jenny@galactica tmp] $ openssl s_client -verify 2 -connect serverfault.com:443
[...]
Verify return code: 27 (certificate not trusted)
Allerdings gibt OpenSSL dennoch den Rückgabecode 0 zurück, da der Befehl tatsächlich ordnungsgemäß ausgeführt wurde, was das Umgehen mit dem Skript erschwert.
Besser wäre es, zunächst das Zertifikat herunterzuladen und openssl verify
es dann auszuführen:
[jenny@galactica tmp] $ openssl verify selfsignedcert.pem; echo $?
selfsignedcert.pem: C=SE, O="Nevermind", CN=foo.example.com
error 18 at 0 depth lookup: self signed certificate
18
Wie Sie sehen, habe ich den Rückgabecode 18 erhalten, was „selbstsigniertes Zertifikat“ bedeutet. Es gibt eine Reihe weiterer Fehlercodes. verify
Weitere Informationen finden Sie auf der Manpage.