Momentan schreibe ich eine Utility-Anwendung, die eine Verbindung zu einer bestimmten IP und einem Port herstellt und die Informationen im SSL-Zertifikat mit HttpWebRequest überprüft. Wenn ich versuche, das Zertifikat zu extrahieren, erhalte ich den Fehler, dass eine Ausnahme ausgelöst wurde. Die Ausnahme scheint darin zu liegen, dass das Auslösen des SSL-Zertifikats anscheinend eine weitere Validierungsprüfung auslöst.
Hier ist der Code, und vielleicht kann mir jemand einen besseren Weg zeigen, oder ich vermisse etwas. Es ist mir egal, ob das SSL-Zertifikat abgelaufen ist oder nicht mit der URL übereinstimmt. Nichts davon ist relevant für das, was ich tue.
Wenn ich das X509Certificate im Delegaten einer neuen Variablen zuweise und die Variable im Debugger betrachte, zeigen alle Eigenschaften SSLCert.Issuer eine Ausnahme vom Typ 'System.Security.Cryptography.CyrptographicException'
Wenn ich versuche, auf eine Eigenschaft von SSLCert zuzugreifen, erhalte ich die folgende Ausnahme: m_safeCertContext ist ein ungültiges Handle
Ich wurde nach dieser Ausnahme gesucht, aber alles deutet auf ein ungültiges Zertifikat hin, das möglicherweise wahr ist, wenn das Zertifikat abgelaufen ist, und möglicherweise für die IP- und Port-Kombination, zu der ich mich verbinde. Aber da ich mit der IP eine Verbindung zur IP herstelle und nichts, was dem allgemeinen Namen entsprechen würde, erwarte ich das und könnte mich weniger kümmern, da ich die Informationen immer noch brauche.
Der Code ist unten, ich habe auch einige Kommentare für was nicht funktioniert und was funktioniert.
%Vor%(Bearbeiten Sie unsere Kommentare unten)
Ich nehme an, dass Sie eine benutzerdefinierte Klasse erstellen und die darin benötigten Daten im Delegiertencode speichern müssen, anstatt die eigentliche Zertifikatsreferenz zu übergeben.
Das ist nur eine Vermutung von meiner Seite. Was ich glaube, ist, dass die Zertifikatsinformationen, die im SSL-Handshake eingehen, von .NET verwendet werden, um ein Cert-Objekt zu erstellen, das Ihnen im Delegaten übergeben wird. Der Delegierte darf nur zum Zwecke der Validierung verwendet werden. Nachdem der Aufruf abgeschlossen ist, schließt .NET das sichere Handle des Zertifikats. Aus diesem Grund schlägt der Aufruf fehl, wenn auf das Zertifikat außerhalb des Rückrufs zugegriffen wird.
Um dies zu umgehen, können Sie das Zertifikat innerhalb des Delegaten serialisieren und es außerhalb des Delegaten deserialisieren.
Tags und Links c# ssl httpwebrequest x509certificate x509