2010-06-23 1 views
7

Wenn ich eine HTTPS-Anfrage an den Remote-Webserver mache, verwende ich WebRequest, das eine sichere Verbindung mit dem Remote-Webserver herstellt. Während der Entwicklung verwende ich ein selbstsigniertes Zertifikat auf dem Server, und WebRequest kann keine sichere Verbindung herstellen, da das Zertifikat nicht gültig ist, was erwartetes Verhalten ist.Überprüfen Sie das Remote-SSL-Zertifikat während der HTTPS-Anforderung

Ich habe diesen Code gefunden, der "Remote" -Zertifikat prüft, aktiviert durch Aufruf der Methode SetCertificatePolicy() im folgenden Code.

public static void SetCertificatePolicy() 
{ 
    ServicePointManager.ServerCertificateValidationCallback 
       += RemoteCertificateValidate; 
} 

/// <summary> 
/// Remotes the certificate validate. 
/// </summary> 
private static bool RemoteCertificateValidate(
    object sender, X509Certificate cert, 
    X509Chain chain, SslPolicyErrors error) 
{ 
    // trust any certificate!!! 
    System.Console.WriteLine("Warning, trust any certificate"); 
    return true; 
} 

Ich frage mich, ob es möglich ist, spezielle Prüfungen auf Remote-SSL-Zertifikat zu tun (mit obigem Code, zum Beispiel), so dass ich, dass Remote-Web-Server gültiges SSL-Zertifikat verwendet überprüfen kann, und nicht nur irgendein gültiges Zertifikat, aber genau das, was ich will? Zum Beispiel möchte ich sicherstellen, dass ich mit www.someplace.com Website sprechen, ausgestellt auf ACME Inc, mit Fingerabdruck 00:11:22: .....

Was ist eine "Best Practice "Ansatz für dieses Szenario?

Danke!

Antwort

7

Wenn Sie wirklich auf ein bestimmtes Zertifikat zurückgreifen möchten, können Sie die Zertifikatsdaten (im DER-Format) mit byte[] in certificate.GetRawCertData() vergleichen.

Sie können auch GetCertHashString() und Subject auf dem certificate Parameter in RemoteCertificateValidate verwenden die Informationen, sind Sie nach zu bekommen. Der Hostname sollte im Betreff des alternativen Namens des Zertifikats oder, falls kein alternativer Subjektname vorhanden ist, im CN des Subjekts (distinguiert) enthalten sein. Wenn man bedenkt, wie .NET den Betreffstring formatiert, sollte dies der erste CN sein, den Sie dort finden.

Sie erhalten auch mehr Daten, wenn certificate eine Instanz von X509Certificate2 ist. Sie werden dann in der Lage sein, SubjectName als X500PrincipalName und auch die Extensions zu erhalten (um die alternative Namenserweiterung des Themas zu überprüfen). Es könnte nützlich sein, Tools wie BouncyCastle zum Parsen des Subjektnamens zu verwenden.

Je nach Laufzeittyp erhalten Sie wahrscheinlich auch weitere Informationen über den Hostnamen, den Sie kontaktieren möchten, in sender.

+0

Danke, das war was ich war eine Art von Informationen, die ich suche. Nur ein kurzes Q, über den ersten Hinweis (Vergleich der Cert-Daten mit Byte []) - muss ich das Byte-Array eines bekannten gültigen Cert mit dem vergleichen, das ich verifiziere? –

+0

Ich denke, das Byte-Array wird das Zertifikat in der DER-Kodierung sein, also sollten Sie das wahrscheinlich mit Ihrem Referenzzertifikat im DER-Format vergleichen (viele Tools, einschließlich des Windows-Zertifikattools, können in dieses Format exportieren). Möglicherweise können Sie dies sogar direkt aus dem Zertifikatspeicher laden (nicht sicher, wie). – Bruno