У меня есть объект System.Security.Cryptography.X509Certificates.X509Certificate2. Я хочу создать экземпляр Pkcs12Store (Org.BouncyCastle.Pkcs), используя этот объект.
Я пытался:
Подход 1:
public Pkcs12Store GetPkcs12Store(X509Certificate2 cert, string password)
{
byte[] rawdata = cert.RawData;
MemoryStream memStream = new MemoryStream(rawdata);
Pkcs12Store pk12;
pk12 = new Pkcs12Store(memStream, password.ToCharArray());
return pk12;
}
В этом подходе я получаю исключение:
Unable to cast object of type 'Org.BouncyCastle.Asn1.DerSequence' to type 'Org.BouncyCastle.Asn1.DerInteger'.
Подход 2:
Я пытался:
public static Pkcs12Store GetPkcs12Store(X509Certificate2 cert, string password)
{
Org.BouncyCastle.X509.X509Certificate bcCert;
bcCert = DotNetUtilities.FromX509Certificate(cert);
pk12 = new Pkcs12StoreBuilder().Build();
X509CertificateEntry certEntry = new X509CertificateEntry(bcCert);
pk12.SetCertificateEntry(bcCert.SubjectDN.ToString(), certEntry);
AsymmetricKeyEntry keyEntry = new AsymmetricKeyEntry(bcCert.GetPublicKey());
return pk12;
}
В этом подход, я не получаю исключение, которое я получал ранее, но затем Pkcs12Store возвращает false для IsKeyEntry.
string alias = null;
foreach (object a in pk12.Aliases)
{
alias = ((string)a);
if (pk12.IsKeyEntry(alias))
{
break;
}
}
ICipherParameters pk = pk12.GetKey(alias).Key;
Таким образом, код завершается ошибкой в строке ICipherParameters pk = pk12.GetKey(alias).Key;
Подход 3:
public static Pkcs12Store GetPkcs12Store(X509Certificate2 cert, string password)
{
Pkcs12Store pk12;
byte[] rawdata;
Org.BouncyCastle.X509.X509Certificate bcCert;
rawdata = cert.Export(X509ContentType.Pfx, password);
MemoryStream memStream = new MemoryStream(rawdata);
pk12 = new Pkcs12Store(memStream, password.ToCharArray());
return pk12;
}
При таком подходе я получаю ошибку: Key not valid for use in specified state.
в утверждении cert.Export...