2013-02-13 15 views
6

Im Zusammenhang mit meinem Enterprise-Projekt (nur Intranet) überprüfen, stieß ich auf eine Frage mit der Überprüfung von Zertifikaten .net System.Security.Cryptography.X509CertificatesErstellen und x509-Zertifikate in .Net

Schritt 1: ein Zertifikat Wurzel Erstellen

makecert Verwenden sie ein Stammzertifikat und installieren sie sie in die Vertrauenswürdige Stammzertifizierungsstellen

makecert -r -pe -n "CN=Test Labs (CA)" -ss CA -sr CurrentUser -a sha256 -cy authority -sky signature -sv TestLabCA.pvk TestLabCA.cer 
pvk2pfx -pvk TestLabCA.pvk -spc TestLabCA.cer -pfx TestLabCA.pfx 
erstellen

Schritt 2: ein Zertifikat erstellen und es mit dem Root-Zertifikat signieren

Verwenden makecert ein Zertifikat zu erstellen, unterschreibt mit dem Root-Zertifikat und installieren Sie es auf den Trusted Publishers

makecert -pe -n "CN=Test Labs (SPC)" -a sha256 -cy end -sky signature -ic TestLabCA.cer -iv TestLabCA.pvk -sv TestLabSPC.pvk TestLabSPC.cer 
pvk2pfx -pvk TestLabSPC.pvk -spc TestLabSPC.cer -pfx TestLabSPC.pfx 

Schritt 3: Überprüfen Sie im Code

Dies ist das C# -Codebeispiel zum Überprüfen der Zertifikate:

X509Certificate2 rootCertificate = new X509Certificate2("TestLabCA.cer"); 
X509Certificate2 certificate = new X509Certificate2("TestLabSPC.cer"); 

// will return true 
Console.WriteLine("{0}, verified = {1}", rootCertificate.GetName(), rootCertificate.Verify()); 

// will return false 
Console.WriteLine("{0}, verified = {1}", certificate.GetName(), certificate.Verify()); 

// validate the chain 
var chain = new X509Chain(); 
chain.Build(certificate); 
Console.WriteLine("{0}, verified root of chain = {1}", certificate.GetName(), chain.ChainElements[chain.ChainElements.Count-1].Certificate.Verify()); 

Frage:

Wenn ich will, um das Zertifikat zu überprüfen, muß ich die Kette zu überprüfen und die letzten in der Kette zu überprüfen, unter der Annahme, dass dies ein Root-Zertifikat?

Gibt es einen besseren Weg, es zu tun?

Antwort

2

Sie müssen eine Vertrauenskette erstellen, ja. Das heißt, Sie müssen es zurückverfolgen zu einem Zertifikat, das Ihnen vertraut. Dies muss kein Stammzertifikat sein, aber es ist üblich, dem Stammzertifikat und nicht einem Zwischenzertifikat zu vertrauen. Manchmal möchten Sie nur eine einzelne Entität mit einem einzelnen Zertifikat zulassen. Solange Sie sicher sind, dass es sich um das richtige Zertifikat handelt, können Sie diesem Blattzertifikat einfach vertrauen, sodass die "Kette" aus einem einzigen Zertifikat besteht. Ein Beispiel dafür sind selbstsignierte Stammzertifikate, die manchmal von Web-Services verwendet werden.

Beachten Sie, dass die Überprüfung der Zertifikatskette nur einen Teil der Gesamtvalidierung eines Zertifikats darstellt. Sie müssen sicherstellen, dass das Zertifikat nicht widerrufen wurde, dass das Zertifikat noch gültig ist (zwischen dem Gültigkeitsdatum und dem Ablaufdatum). Manchmal gibt es auch zusätzliche, proprietäre Regeln zum Validieren von Zertifikaten, z. Vorhandensein der Zertifikats-ID in einer Datenbank - Whitelisting/Blacklisting.

+0

Beachten Sie, dass dies X509-Zertifikate in einer PKI-Infrastruktur beschreibt, die sich ein wenig von einem "Web-of-Trust" unterscheidet, wie es z. PGP. –

2

Neben Maarten Bodewes' Antwort:

Um leicht zu überprüfen, ob die Kette gültig ist, dass Sie den folgenden Code verwenden:

X509Certificate2 Certificate = new X509Certificate2("Certificate.pfx"); 
X509Chain CertificateChain = new X509Chain(); 
//If you do not provide revokation information, use the following line. 
CertificateChain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; 
bool IsCertificateChainValid = CertificateChain.Build(Certificate); 

IsCertificateChainValid dann true zurück, wenn die Zertifikatskette korrekt ist. In Fällen gibt es falsch Sie

CertificateChain.ChainStatus 

für Informationen über warum der Status nicht gültig verwenden können, ist. Mögliche Werte sind NotTimeValid, UntrustedRoot.