Beispiel CMS Signing mit BouncyCastle für .NET
könnten Sie verwenden die BouncyCastle Krypto-Bibliothek für .NET, die ihre eigenen X509-Zertifikat und CMS Unterzeichnung Maschinen enthält. Viele der Beispiele und Dokumentationen im Internet sind für Java, als BouncyCastle eine Java-Bibliothek zuerst war. Ich habe gebrauchte die Antwort auf diese Frage Stackoverflow als Startpunkt für das Laden des Zertifikats und Schlüssels und fügte die CMS-Signierung hinzu. Möglicherweise müssen Sie Parameter optimieren, um die gewünschten Ergebnisse für Ihren Anwendungsfall zu erzielen.
Ich habe die Unterzeichnung Funktion wie das Ihre sucht etwa gemacht, aber beachten Sie die privaten Schlüssel nun ein eigener Parameter ist.
%Vor%.NET CMS (Quick-fix mit dem Rest der Kette von der Unterzeichnung weggelassen)
Ich kann Ihr Problem mit einem Zertifikat reproduzieren, dessen Stamm nicht im vertrauenswürdigen Zertifikatspeicher enthalten ist, und bestätigen, dass beim Hinzufügen der Zertifikatkette zur cmsSigner
/ signedCms
Certificates
-Aktion der A certificate chain could not be built to a trusted root authority
-Fehler nicht vermieden wird.
Sie können erfolgreich signieren, indem Sie cmsSigner.IncludeOption = X509IncludeOption.EndCertOnly;
Wenn Sie dies tun, erhalten Sie den Rest der Kette in der Signatur nicht. Das ist wahrscheinlich nicht das, was du willst.
Nebenbei, in Ihrem Beispiel verwenden Sie X509Certificate
für das Array von Zertifikaten in der Kette, aber übergeben sie an ein X509Certificate2Collection
(beachten Sie die "2" darin). X509Certificate2
leitet sich von X509Certificate
ab, aber wenn es nicht tatsächlich ein X509Certificate2
ist, das Sie in eine dieser Sammlungen einfügen, erhalten Sie einen Umwandlungsfehler, wenn etwas über die Sammlung iteriert wird (Sie bekommen beim Hinzufügen keine Fehlermeldung) ein Zertifikat vom falschen Typ, da X509Certificate2Collection
auch von X509CertificateCollection
abgeleitet ist und seine Add-Methoden erbt.)