Если у вас есть только Modulus
, Exponent
и D
, сначала вы должны восстановить параметры CRT (P
, Q
, DP
, DQ
, InverseQ
).
Как и другие ваши вопросы, в основном вам не хватает методов расширения cert.CopyWithPrivateKey(key)
и rsa.ImportParameters(RSAParameters)
:
, если я хочу создать сертификат, подписанный ЦС, а затем хочусохранить сертификат в виде файла PFX
using (RSA rsa = RSA.Create())
{
rsa.ImportParameters(rsaParameters);
using (X509Certificate2 caSigned = GetCASignedCert(rsa))
using (X509Certificate2 withKey = caSigned.CopyWithPrivateKey(rsa))
{
File.WriteAllBytes("some.pfx", withKey.Export(X509ContentType.Pkcs12, "and a password"));
}
}
или сохранить личный ключ в файле .PEM
Этот файл доступен в .NETЕжедневные сборки Core 3.0:
RSAParameters rsaParameters = default(RSAParameters);
using (StreamWriter writer = new StreamWriter("rsa.key"))
using (RSA rsa = RSA.Create())
{
rsa.ImportParameters(rsaParameters);
writer.WriteLine("-----BEGIN RSA PRIVATE KEY-----");
writer.WriteLine(
Convert.ToBase64String(
rsa.ExportRSAPrivateKey(),
Base64FormattingOptions.InsertLineBreaks));
writer.WriteLine("-----END RSA PRIVATE KEY-----");
}
PKCS # 8 и зашифрованный PKCS # 8 также доступны.
В существующих версиях это требует использования RSAParameters и кодера ITU-T X.690 DER.
или хотите сохранить его в хранилище сертификатов MS вместе с закрытым ключом
using (RSA rsa = RSA.Create())
{
rsa.ImportParameters(rsaParameters);
using (X509Certificate2 caSigned = GetCASignedCert(rsa))
using (X509Certificate2 withKey = caSigned.CopyWithPrivateKey(rsa))
using (X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
X509Certificate2 persisted = new X509Certificate2(
withKey.Export(X509ContentType.Pkcs12, ""),
"",
X509KeyStorageFlags.PersistKeySet);
using (persisted)
{
store.Open(OpenFlags.ReadWrite);
store.Add(persisted);
}
}
}
или когда я просто хочу иметь в памяти итакже утверждаем HasPrivateKey.
using (RSA rsa = RSA.Create())
{
rsa.ImportParameters(rsaParameters);
using (X509Certificate2 caSigned = GetCASignedCert(rsa))
{
// Yes, this value can outlive both usings
return caSigned.CopyWithPrivateKey(rsa);
}
}