Wie verwende ich die SSL-Zertifikate mit HttpWebRequest-Klasse in C#?
Derzeit Schreibe ich ein Dienstprogramm-Anwendung, die eine Verbindung zu einer bestimmten IP und port und überprüfen Sie die Angaben im SSL-Zertifikat mit HttpWebRequest. Wenn ich versuche, zu extrahieren Sie das Zertifikat bekomme ich eine Fehlermeldung, dass eine Ausnahme geworfen wurde. Die Ausnahme zu sein scheint, weil der Akt der Bewältigung des SSL-Zertifikats auszulösen scheint noch eine weitere überprüfung.
Hier ist der code, und vielleicht kann mir jemand entweder mir zeigen, einen besseren Weg, dies zu tun, oder wenn mir etwas fehlt. Ich interessiere mich nicht, wenn das SSL-Zertifikat ist abgelaufen oder entspricht nicht der URL. Nichts davon ist relevant für das, was ich Tue.
Wenn ich weisen Sie die X509Certificate-in die Stellvertretung eine neue variable, und schau dir die variable im debugger, der alle Eigenschaften zeigen SSLCert.Emittent hat eine Ausnahme vom Typ 'System.Sicherheit.Die Kryptographie.CyrptographicException'
Wenn ich versuchen, auf eine Eigenschaft der SSLCert, bekomme ich die folgende Exception geworfen: m_safeCertContext ist ein ungültiges handle
Ich gelöscht gesucht, die Ausnahme, aber alles weist auf ein ungültiges Zertifikat, die wahr sein könnte, wenn das Zertifikat abgelaufen ist, und könnte wahr sein, für die IP-und port-Kombination, die ich am Anschluss an. Aber da ich mich anschließen, um die IP über die IP und nicht alles, was würden Sie übereinstimmen, den gemeinsamen Namen, ich erwarte, dass und könnte weniger Pflege, als ich noch die Informationen benötigen.
Dem code unten, habe ich einige Kommentare in als auch für das, was nicht funktioniert und was funktioniert nicht.
//To get around the SSL validation in the HttpWebRequest
System.Net.ServicePointManager.ServerCertificateValidationCallback =
delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
System.Security.Cryptography.X509Certificates.X509Chain chain,
System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
//The below works but isn't what I want. CertName and ExpireDate are both Strings
this.CertName = ProcessSubject(certificate.Subject);
this.ExpireDate = certificate.GetExpirationDateString();
//The below works but the X509Certificate SSLCert shows exceptions in the debugger for most of the properties.
this.SSLCert = certificate;
return true; //**** Always accept
};
HttpWebRequest myRequest = (HttpWebRequest)System.Net.WebRequest.Create("https://" + this.IP + ":" + this.Port + "/SSLCheck.html");
myRequest.KeepAlive = false;
myRequest.Method = "GET";
try
{
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
}
catch (Exception e)
{
if (e.Message != "The remote server returned an error: (404) Not Found.")
{
throw Exception("Error");
}
}
//THE BELOW FAILS
this.CertName = this.SSLCert.Subject;
- Es gibt eine Menge von Fragen und Antworten, die hier zum arbeiten mit SSL und Zertifikate in
HttpWebRequest
. Haben Sie schaute auf die "Verwandten Fragen" auf der rechten Seite, oder erfolgt eine Suche nach [ssl-Zertifikat httpwebrequest]? - Ja, so ziemlich jeder fragt sich, wie client-Zertifikate verwenden, die ich nicht verwende, oder ist immer ein Fehler innerhalb HttpWebRequest, weil ein ungültiges Zertifikat, welches ich bereits Umgang.
- Ich sollte hinzufügen, das große problem ist, dass ich die kopieren möchten X509Certificate zu einem anderen X509Certificate-Typ-variable und .NET angezeigt werden, überprüfen Sie das Zertifikat erneut, wenn ich "dabei.SSLCert = Zertifikat;"
- Was ist die detaillierte Ausnahme geworfen, wo Ihr Beispiel nicht? Bitte fügen Sie es dem OP, wenn du kannst...
- Ich fügte hinzu, mehr Informationen, mit der Ausnahme und Fehler geworfen.
- Hier ist etwas relevant für Ihre Ausnahme, dass Sie sehen: geekswithblogs.net/timh/archive/2006/04/18/75477.aspx
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Bearbeiten von unsere Kommentare unten)
Ich nehme an, was Sie tun müssen, ist erstellen Sie eine benutzerdefinierte Klasse und speichern die Daten, die Sie brauchen, in der es innerhalb des Delegaten code, anstatt zu übergeben um das eigentliche Zertifikat verweisen.
Dies ist nur eine Vermutung auf mein Teil. Was ich denke passiert, ist, dass das Zertifikat Infos kommen durch in den SSL-handshake verwendet wird .NET zum erstellen einer cert-Objekt, das übergeben wird, um Sie in die Stellvertretung. Die Stellvertretung ist nur für den Zweck der Validierung. Nachdem der Aufruf abgeschlossen ist, .NETTO schließt den sicheren Griff des Zertifikats. Deshalb ist der Aufruf schlägt fehl, wenn Sie versuchen, Zugriff auf das Zertifikat außerhalb der Rückruf.
Um dies ZU umgehen, können Sie serialisieren, die das Zertifikat innerhalb des Delegaten, und deserialisiert es außerhalb der Stellvertretung.