2017-01-23 7 views
0

ich eine Zertifikatsanforderung wie folgt aus:X509Chain.Build() für widerrufenes Zertifikat. C#

certreq -new req.inf req-Revoked.req 
certreq -submit -attrib "SAN:[email protected]&[email protected]" -config Win2K8-64\Test-Win2K8-64-CA req-Revoked.req testerCert-Revoked.cer 
certreq -accept testerCert-Revoked.cer 
CertUtil -f -p testerCert -exportPFX -user My Testing.Tester.T.1234567890 testerCert-Revoked.pfx 
CertUtil -delstore -user My Testing.Tester.T.1234567890 

Dann habe ich es widerrufen, über:

CertUtil -revoke <SerialNumber_from_above_Cert> 

ich dann diesen Code ausführen:

X509Certificate2 certificate = GetCertificate("testerCert-Revoked.pfx", "password"); // helper method loads the pfx from a file 
X509Chain chain = new X509Chain(); 
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot; 
chain.ChainPolicy.RevocationMode = X509RevocationMode.Online; 
chain.ChainPolicy.VerificationTime = DateTime.Now; 
chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 0, 0); 
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag; 

if (!chain.Build(certificate)) 
{ 
    errorBuffer.Append("Could not build X.509 certificate chain:\r\n"); 
    foreach (X509ChainStatus status in chain.ChainStatus) 
    { 
    errorBuffer.AppendFormat(" - {0}\r\n", status.StatusInformation); 
    } 
    throw new CryptographicException(errorBuffer.ToString()); 
} 

chain.Build() gibt immer wahr zurück. Aber da das Zertifikat gesperrt ist, sollte es falsch sein! Ich habe überprüft, dass das Zertifikat gesperrt ist und dass die Seriennummer im Server-Manager unter widerrufenen Zertifikaten aufgeführt ist. Ich habe überprüft, dass die CURL-Verteilungspunkt-URLs auf dem Server und den Zertifikatsanforderungen übereinstimmen. (Sie sind LDAP-URLs). CertUtil sieht die Zwischen-CER-Datei als widerrufen. Aber der C# -Code oben nicht.

Dies alles funktioniert, bevor die ursprüngliche CA abgelaufen ist, und IT baute meine Testmaschine mit einem neuen Zertifikat neu. Ich habe die Zertifikate mit der neuen CA neu erstellt, und jede einzelne Unit-Tests funktionieren wieder, außer denen, die sich mit dem Widerruf befassen. Abgelaufene Zertifikate funktionieren wie erwartet, aber nicht widerrufen.

Ich bin ratlos, was ich als nächstes tun muss, damit dieser Code wieder funktioniert, und ich würde etwas Hilfe brauchen. Vielen Dank!

+0

Ich habe auch die CURL über den Server-Manager veröffentlicht. – ChopperCharles

Antwort

0

Es stellte sich heraus, dass das Problem eine Anwendung namens Tumbleweed war. Es wurde auf dem Server installiert und hat alle Sperranforderungen abgefangen. Durch die Deaktivierung des Tumbleweed-Dienstes wurde mein Problem vollständig behoben.

Charles.

0

Die Kette ist einfach eine Liste der Zertifikate, beginnend mit dem, das Sie bereitstellen, bis zum Stammzertifikat. Es ist aus allen möglichen Zertifikaten aufgebaut - selbst wenn sie veraltet, ungültig oder widerrufen sind.

Sie versuchen, die Kette zu validieren. Verwenden Sie den chain.ChainStatus dafür.

Von der MSDN docs: Das X509Chain-Objekt hat einen globalen Fehlerstatus namens ChainStatus, der für die Zertifikatsüberprüfung verwendet werden sollte. Die Regeln für die Zertifikatvalidierung sind komplex und es ist leicht, die Validierungslogik zu vereinfachen, indem der Fehlerstatus eines oder mehrerer der beteiligten Elemente ignoriert wird. Der globale Fehlerstatus berücksichtigt den Status jedes Elements in der Kette.