【问题标题】:Create a X509Certificate2 from RSACryptoServiceProvider fails with Cannot find the requested object从 RSACryptoServiceProvider 创建 X509Certificate2 失败,找不到请求的对象
【发布时间】:2012-02-26 22:04:51
【问题描述】:

示例代码:

        CspParameters cspParameters = new CspParameters();
        cspParameters.ProviderType = 1; // PROV_RSA_FULL

        // Create the crypto service provider, generating a new
        // key.
        mRsaCSP = new RSACryptoServiceProvider(mDefaultKeyLength, cspParameters);
        mRsaCSP.PersistKeyInCsp = true;
        RSAParameters privateKey = mRsaCSP.ExportParameters(true);


        byte[] rsaBytes = mRsaCSP.ExportCspBlob(true);

        try
        {
            X509Certificate2 cert = new X509Certificate2(rsaBytes);                
            mKeyDataPfx = Convert.ToBase64String(cert.Export(X509ContentType.Pkcs12, password));
        }
        catch (Exception ce)
        {
            string error = ce.Message;
        }

【问题讨论】:

  • RSA 密钥与 X509 证书不直接兼容。 X509 证书需要由颁发者签名的密钥,即使它是自签名的。你能告诉我们你真正想要完成什么吗?您是否尝试在代码中动态创建 X509 证书?
  • 是的。这正是我想要做的。这个想法是我将旧的 RSA 证书存储为带有 RSACryptoServiceProvider.ToXmlString(true) 的字符串。这些需要读入并导出为 PFX 文件。需要生成新的 RSA 证书并将其存储为 PFX 文件。
  • 我建议您查看 Bouncy Castle .NET 源代码和示例。我认为示例 bccrypto-net-1.7-src\csharp\crypto\test\src\pkcs\examples\PKCS12Example.cs 应该可以帮助您入门。 bouncycastle.org/csharp

标签: c# .net rsa x509 x509certificate2


【解决方案1】:

这是我的解决方案,使用 BouncyCastle 库。

// create the RSA key from an XML string
RSACryptoServiceProvider key = new RSACryptoServiceProvider();
key.FromXmlString(keyTextBox.Text);

// convert to BouncyCastle key object
var keypair = DotNetUtilities.GetRsaKeyPair(key);

var gen = new X509V3CertificateGenerator();

string certName = Path.GetFileNameWithoutExtension(fileName);
var name = new X509Name("CN=" + certName);
var serial = BigInteger.ProbablePrime(120, new Random());

gen.SetSerialNumber(serial);
gen.SetSubjectDN(name);
gen.SetIssuerDN(name);
gen.SetNotAfter(DateTime.Now.AddYears(10));
gen.SetNotBefore(DateTime.Now);
gen.SetSignatureAlgorithm("MD5WithRSA");
gen.SetPublicKey(keypair.Public);

// generate the certificate
var newCert = gen.Generate(keypair.Private);
// convert back to .NET certificate
var cert = DotNetUtilities.ToX509Certificate(newCert);
// export as byte array
byte[] certData = cert.Export(X509ContentType.Pfx);

File.WriteAllBytes(fileName, certData);

【讨论】:

    猜你喜欢
    • 2016-11-18
    • 2017-10-18
    • 1970-01-01
    • 2011-07-01
    • 2021-07-08
    • 2016-08-25
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多