Wie programmgesteuert importieren Sie eine pfx mit einer Kette von Zertifikaten in den Zertifikatspeicher?
Ich versuche, um programmgesteuert importieren Sie ein X509-Zertifikat (pfx /PKCS#12) in meinem lokalen Computer Zertifikatspeicher. Dieses bestimmte Zertifikat hat eine Kette von Zertifikaten, die Zertifizierung Pfad sieht ungefähr so aus:
- Root-CA-Zertifikat
- Organisation CA-Zertifikat
- Organisation 2-Zertifikat der CA
- Mein Zertifikat
- Organisation 2-Zertifikat der CA
- Organisation CA-Zertifikat
Den code, den ich benutze sieht wie folgt aus:
cert = new X509Certificate2(pathToCert, password);
if (cert != null)
{
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
if (!store.Certificates.Contains(cert))
{
store.Add(cert);
}
}
Diesem code wird das Zertifikat importieren, aber es scheint zu ignorieren, die Kette. Wenn ich Sie das Zertifikat in den store, die Zertifizierung Pfad zeigt nur:
- Mein Zertifikat
Allerdings, wenn ich importieren Sie die pfx-manuell, es zeigt den vollständigen Pfad.
Bin ich überspringen Sie einen Schritt, hier, oder ich bin fehlen einige parameter? Kann jemand etwas Licht in diese Schuppen?
InformationsquelleAutor der Frage Edwin de Koning | 2012-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie in der Lage sein, um die Iteration über die certs in Ihre PFX - (und import, jeweils in der cert-store Ihrer Wahl) durch öffnen der PFX-Datei als X509Certificate2Collection Objekt.
Hier sind die docs auf X509Certificate2Collection:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2collection.aspx
MSDN enthält einige Beispiel-code, den Google docs-Seite auf, wie man überprüfen jedes cert in der Sammlung.
Sobald Sie wissen, die ZNS - /Emittenten/sonstige Angaben zu den einzelnen cert-es sollte klar sein, welches Zertifikat speichern jeweils Hinzugefügt werden muss. Für die, die Sie verwenden können Sie das X509Store Klasse und die StoreName-enumeration angeben, die für die Speicherung, die Sie wollen, zu öffnen/hinzufügen zu:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509store.aspx
http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.storename.aspx
Siehe auch meine Antwort auf eine ähnliche Frage ALSO:
Gewusst wie: abrufen von Zertifikaten aus einer pfx-Datei mit c#?
Wie bereits in einem der letzten Kommentare auf diese Antwort, wenn Sie versuchen, importieren Sie das Zertifikat für den aktuellen Benutzer Root-store ("StoreName.Root" und "StoreLocation.CurrentUser" als name/Ort) erhalten Sie eine popup-Dialogfeld Sie gefragt werden, zu bestätigen.
Zu lösen, habe ich nur noch ein wenig MS-UI-Automatisierung-code zu meinem cert-import-Methode, klicken Sie auf OK in der Eingabeaufforderung.
Oder, wie der Kommentator "CodeWarrior", sagt die andere, SO beantworten Sie den Kommentar, um zu vermeiden das popup-Dialogfeld Sie können versuchen, indem die root-cert in der "LocalMachine" speichern statt CurrentUser.
Beispielcode:
InformationsquelleAutor der Antwort Bill Agee
Für die Zukunft, die ich entdeckte ein anderer Weg, dies zu tun, verwenden Sie die X509Chain Objekt:
InformationsquelleAutor der Antwort Edwin de Koning
Einem X. 509-Zertifikat enthält nur eine Kette, die links auf das root-Zertifikat (einschließlich den zwischengeschalteten stellen), aber diese Zertifikate werden nicht im Zertifikat enthalten. Diese Kette wird verwendet, wenn ein end-Zertifikat (das ist nicht self-signed) ist validiert - es führen muss, um ein root-Zertifikat vertrauenswürdig ist. Genauer den öffentlichen Schlüssel jeder CA verwendet wird, zu entschlüsseln und überprüfen Sie den hash für ein ausgestelltes Zertifikat. Dieser Prozess wird wiederholt, bis das root-Zertifikat erreicht wird. Nachdem die gesamte Kette wird überprüft, ob das root-Zertifikat vertrauenswürdig ist die end-Zertifikat auch vertrauenswürdig ist. Natürlich ist der Prozess beinhaltet andere Validierungen zu (wie start-Datum, end-Datum, certificate revocation list zum Beispiel), aber ich habe detaillierte nur der Teil bezüglich der Verwendung der Kette.
Damit Sie korrekt importiert "Meine Bescheinigung" zusammen mit der Kette auf "Root-Zertifikat der CA" - diese Kette ist kodiert in "Mein Zeugnis", und Sie können dies bestätigen, indem Sie seine Eigenschaften anzeigen, aber diese Kette ist nur ein link und es enthält keine "Root-Zertifikat der CA", "Organisation CA-Zertifikat" und "Organisation 2-Zertifikat der CA" Zertifikate.
Ich hoffe das löst dein Problem, aber wenn es nicht funktioniert, könnten Sie etwas konkreter über das, was Sie versuchen zu erreichen?
InformationsquelleAutor der Antwort andrei m
Für jeden, der will "auf den entsprechenden store" code generische Lösung
Dies ist, was ich erstellt habe mit VB so sein sollte nicht zu schwer Anschluss zu C#. Ich habe die oben genannten Beiträge zu erhalten, mich begonnen und ich bin ein total NooB in diesem.
InformationsquelleAutor der Antwort Clarkey