我在Wiktor Zychla(http://www.wiktorzychla.com/2012/12/how-to-create-x509certificate2.html)的博文中使用x509Certificate2
创建CertificateGenerator.GenerateCertificate
Bouncy Castle crypto library用于生成证书文件。我需要使用更强的签名算法,所以我使用SHA1withRSA
而不是SHA256withRSA
(例如一个)。
生成证书并成功导出到.pfx
文件。稍后使用证书时,我收到错误Invalid algorithm specified
。
运行certutil -dump mycert.pfx
时,我看到设置了错误的加密服务提供程序(CSP): Microsoft Base Cryptographic Provider v1.0
...
----------------结束嵌套等级1 ----------------
Provider = Microsoft Base Cryptographic Provider v1.0
...
如何告诉Bouncy Castle API使用不同的CSP? Microsoft增强型RSA和AES加密提供程序,实际上可以处理SHA256withRSA
。< / p>
Bouncy Castle和C#
上的资源很少,因此非常感谢任何文档或相关示例的链接。
CryptoAPI CSP和算法列表,它们支持:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb931357(v=vs.85).aspx
答案 0 :(得分:2)
最简单的方法是在导入生成的pfx时指定CSP。您可以使用此命令
certutil -importPFX -csp "Microsoft Enhanced RSA and AES Cryptographic Provider" -v c:\yourpfx.pfx AT_KEYEXCHANGE,NoExport,NoProtect
将
CSP是PKCS#12(PFX)中特定于Windows的字段,除了Windows之外没有人设置此项。如果您使用文件new X509Certificate2(filename)
中的PFX,则必须更改私钥。将PrivateKey
属性转换为RSACryptoServiceProvider
并修改CspParameters
(我现在没有代码片段)。然后将修改后的RSACryptoServiceProvider
设置回PrivateKey
属性。
-------编辑
以下是更改从文件
读取的PFX上的CSP的示例代码// need to set exportable flag to be able to ... export private key
X509Certificate2 cert = new X509Certificate2(@"d:\test.pfx", "a", X509KeyStorageFlags.Exportable);
var privKey = cert.PrivateKey as RSACryptoServiceProvider;
// will be needed later
var exported = privKey.ToXmlString(true);
// change CSP
var cspParams = new CspParameters()
{
ProviderType = 24,
ProviderName = "Microsoft Enhanced RSA and AES Cryptographic Provider"
};
// create new PrivateKey from CspParameters and exported privkey
var newPrivKey = new RSACryptoServiceProvider(cspParams);
newPrivKey.FromXmlString(exported);
// Assign edited private key back
cert.PrivateKey = newPrivKey;
// export as PKCS#12/PFX
var bytes = cert.Export(X509ContentType.Pfx, "a");