Erstellen und überprüfen von X. 509 Zertifikaten in .Net
In Verbindung mit meinem enterprise-Projekt (intranet-nur) stieß ich auf eine Frage, die mit der Verifizierung von Zertifikaten verwenden .net System.Security.Cryptography.X509Certificates
Schritt 1: Erstellung des root-Zertifikats
Verwenden makecert
für die Erstellung eines root-Zertifikat und installieren Sie es in der 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
Schritt 2: ein Zertifikat Erstellen und signieren Sie es mit dem root-Zertifikat
Verwenden makecert
um ein Zertifikat zu erstellen, melden Sie es mit dem root-Zertifikat und installieren Sie es, um die "Vertrauenswürdige Herausgeber"
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 die C# - Codebeispiel, um die Zertifikate zu überprüfen:
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, muss ich prüfen Sie die Kette und überprüfen Sie die letzten in der Kette, vorausgesetzt, es ist ein root-Zertifikat?
Gibt es einen besseren Weg, es zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstellen Sie eine Kette des Vertrauens, ja. Dies bedeutet, dass Sie haben, um Sie zurückzuverfolgen, um ein Zertifikat vertrauenswürdig ist, indem Sie. Es muss sich nicht um ein root-Zertifikat, sondern es ist üblich, zu Vertrauen, das root-Zertifikat und nicht ein intermediate Zertifikat. Manchmal möchten Sie nur eine einzelne Person mit einem einzigen Zertifikat. Solange Sie sicher sind, es ist das richtige Zertifikat, könnte man einfach darauf Vertrauen, dass single-leaf-Zertifikat, so dass die "Kette" würde darin bestehen, ein Zertifikat. Ein Beispiel HIERFÜR sind selbst-signierte root-Zertifikate, die sind manchmal verwendet, um web-services.
Beachten Sie, dass die Verifikation der Zertifikatskette ist nur ein Teil der insgesamt Validierung eines Zertifikats. Sie müssen sicherstellen, dass das Zertifikat nicht gesperrt wurde, dass das Zertifikat noch gültig ist (zwischen dem Datum des Inkrafttretens und das Datum des Ablaufs der Gültigkeit). Manchmal gibt es auch zusätzliche, proprietäre Regeln für die Validierung von Zertifikaten, z.B. bei Vorhandensein des Zertifikats-ID in einer DB - whitelisting/blacklisting.
Neben Maarten Bodewes' Antwort:
Leicht überprüfen, ob die Kette gültig ist, können Sie den folgenden code verwenden:
IsCertificateChainValid gibt dann true zurück, wenn die Zertifikat-Kette ist korrekt.
In den Fällen, es gibt false zurück, können Sie
Informationen über warum der status nicht gültig ist.
Mögliche Werte sind: NotTimeValid, UntrustedRoot.