1

Ich muss eine generierte BouncyCastle X509Certificate zu X509Certificate2 mit dem privaten Schlüssel konvertieren geladen in der resultierenden .NET StandardX509Certificate2 Objekt. Ist das möglich?Wie konvertiert man BouncyCastle X509Certificate in .NET Standard X509Certificate2 unter Beibehaltung des privaten Schlüssels?

Es ist eine Antwort auf eine ähnliche Frage https://stackoverflow.com/a/8150799/5048935, aber nach einer BouncyCastle Zertifikat erzeugt und deren Umwandlung X509Certificate2 das resultierende Objekt hat seine HasPrivateKey Eigenschaft auf „false“ auf .NET.

Kontext

Ich brauche ein Zertifikat und einen privaten Schlüssel (getrennte Base64-Strings ohne Kopf- und Fußzeilen) zu einem X509Certificate2 Objekt laden es aus einer .NET-Standard-1.6-Bibliothek in den App weitergeben. Das Problem ist, gibt es keine PrivateKey Eigenschaft in der X509Certificate2 Klasse in .NET Standard! Die einzige Möglichkeit für mich, den privaten Schlüssel in einem X509Certificate2 Objekt tatsächlich zu laden, besteht darin, es mit dem Zertifikat selbst in einer PFX-Datei zu kombinieren und es so in einem Konstruktor zu laden.

Ich habe Anregungen bekommt BouncyCastle zu verwenden für diese (https://stackoverflow.com/a/44465965/5048935), so dass ich zuerst einen BouncyCastle X509Certificate aus den Base64-Strings erzeugen und dann versuchen, es zu X509Certificate2 zu konvertieren, während dem privaten Schlüssel zu halten.

+0

Können Sie etwas Code posten, damit wir sehen können, was Sie bisher haben? – tattarrattat

Antwort

4

Der beste Weg, den ich gefunden habe, ist durch einen In-Memory-PFX-Stream zu gehen. Angenommen, Sie haben Ihr Hüpfburgen-Zertifikat bereits in "bcCert" geladen. Hinweis: Wenn Sie das .NET X509Certificate2 an einer beliebigen Stelle speichern, wird der "Alias" später in der Benutzeroberfläche aufgerufen, andernfalls ist es irrelevant (außer dass es für beide Aufrufe identisch sein muss)

using Org.BouncyCastle.Pkcs; 
using Org.BouncyCastle.Security; 
using System.IO; 
using System.Security.Cryptography.X509Certificates 

var pkcs12Store = new Pkcs12Store(); 
var certEntry = new X509CertificateEntry(bcCert); 
pkcs12Store.SetCertificateEntry(alias, certEntry); 
pkcs12Store.SetKeyEntry(alias, new AsymmetricKeyEntry(certKey.Private), new[] { certEntry });  
X509Certificate2 keyedCert; 
using (MemoryStream pfxStream = new MemoryStream()) 
{ 
    pkcs12Store.Save(pfxStream, null, new SecureRandom()); 
    pfxStream.Seek(0, SeekOrigin.Begin); 
    keyedCert = new X509Certificate2(pfxStream.ToArray()); 
} 
Verwandte Themen