2015-09-08 1 views
5

Wir führen zufällig einen REST-API-Dienst aus, der einen https://-Endpunkt verfügbar macht. Kürzlich haben wir unser SSL-Zertifikat geändert und mehrere Benutzer, hauptsächlich libcurl- und Java-Benutzer, haben sich beschwert, dass sie das Zertifikat nicht mehr validieren können und ihre Programme sich nicht mehr mit unserem Dienst verbinden können. Andere Benutzer, einschließlich .NET-Benutzer, haben keine Probleme festgestellt. Firefox ist auch glücklich, Seiten auf der Website mit diesem Zertifikat zu öffnen.Wie führe ich die schwierigste SSL-Zertifikatsprüfung mit .NET-Code durch?

Wir müssen einen Code erstellen, der die Zertifikate auf die härteste Weise validiert, bevor wir sie in der Produktion verwenden.

ich in Handarbeit ein Stück Code, der ein X509Certificate2 Objekt für das Zertifikat erstellt und dann versucht, X509Chain.Build() von ihm:

var certDataArray = File.ReadAllBytes(path); 
var cert = new X509Certificate2(certDataArray, password); 
var chain = new X509Chain(); 
var result = chain.Build(cert); 
var status = chain.ChainStatus; 

Dieser Code läuft in Ordnung für unsere vorherigen Zertifikat (die noch nicht abgelaufen ist) und nicht (Build() liefert false und X509Chain.ChainStatus enthält eine Anzahl von Elementen - X509ChainStatusFlags.RevocationStatusUnknown, X509ChainStatusFlags.PartialChain, X509ChainStatusFlags.OfflineRevocation). So wie es für dieses spezifische Zertifikat aussieht, reicht diese Überprüfung aus.

Ist X509Chain.Build() genug, um sicherzustellen, dass alle unsere Benutzer das Zertifikat erfolgreich validieren können? Sind noch weitere Überprüfungen notwendig?

+0

Was haben Sie an Ihrem Zertifikat geändert? Haben Sie einen neuen CA/Aussteller verwendet? –

+0

@ stephen.vakil Das neue Zertifikat stammt von einer anderen Zertifizierungsstelle und mit dieser CA-Infrastruktur stimmt etwas nicht, was eine gründliche Überprüfung verhindert hat. Ist es wirklich wichtig? – sharptooth

Antwort

3

Der X509ChainStausFlags.PartialChain Code ist ein Zeichen, dass Sie ein Problem haben. Mindestens ein Zertifikat in der Kette a) hat keinen Aussteller, der sich bereits in Ihren lokalen Zertifikatsspeichern befindet, und b) hat keine auflösbare Erweiterung für Zugriffsrechte für Zugriffsrechte, mit der das System das Zertifikat herunterladen kann (obwohl dies auch ein Netzwerkfehler sein könnte)).

Wenn das fehlende Zertifikat das Stammverzeichnis ist, würde die Übergabe an chain.ChainPolicy.ExtraStore (vor dem Aufruf von Build) X509ChainStatusFlags.PartialChain in X509ChainStatusFlags.UntrustedRoot ändern. Wenn es sich um ein Zwischenprodukt handelt, kann es durchaus dazu führen, dass die Kette erfolgreich aufgebaut wird.

Der OfflineRevocation Code scheint seltsam, da Sie X509RevocationMode.Offline nicht angegeben haben (zumindest nicht in Ihrem Schnipsel hier).

Verwandte Themen