C# BouncyCastle私钥至X509Certificate2私钥(ECC)
使用.NET Core 3.1和BouncyCastle 我有Pkcs12的专用ECC密钥。我如何将其存储在X509Certificate2私钥中? 我尝试这种方式的原因是,当我将Pkcs12作为X509Certificate2加载时,C# BouncyCastle私钥至X509Certificate2私钥(ECC),c#,.net,cryptography,certificate,bouncycastle,C#,.net,Cryptography,Certificate,Bouncycastle,使用.NET Core 3.1和BouncyCastle 我有Pkcs12的专用ECC密钥。我如何将其存储在X509Certificate2私钥中? 我尝试这种方式的原因是,当我将Pkcs12作为X509Certificate2加载时,X509Certificate2.PrivateKey方法抛出一个“未实现/算法不支持的异常” 这就是我到目前为止所做的: using var stream = new MemoryStream(myPkcs12); Pkcs12
X509Certificate2.PrivateKey
方法抛出一个“未实现/算法不支持的异常”
这就是我到目前为止所做的:
using var stream = new MemoryStream(myPkcs12);
Pkcs12Store pstore = new Pkcs12Store(stream, password.ToCharArray());
var name = "";
foreach (string alias in store.Aliases)
{
if (pstore.IsKeyEntry(alias))
{
name = alias;
}
}
var key = pstore.GetKey(name);
var cert = new X509Certificate2(myPkcs12, "mypassword", X509KeyStorageFlags.EphemeralKeySet | X509KeyStorageFlags.Exportable);
cert.PrivateKey = // key? I imagine it is incorrect to use DotNetUtilities.ToRSA()?
谢谢大家!
更新:
此帖子的原因是由于以下问题:
private const string EccTestCert = "MIINbQIBAzCCDSkGCSqGSIb3DQEHAaCCDRoEgg0WMIIN.... 9wQUpQgYbgB7yknIW7Oaz3hogAVihJoCAgfQ";
var cert = new X509Certificate2(Convert.FromBase64String(EccTestCert), "1");
// If you inspect it, the PrivateKey throws an exception. Whilst with an RSA cert, it will not.
源代码显示,根据您运行的平台,会引发异常
开关(GetKeyAlgorithm())
{
案例1.Rsa:
_lazyprovatekey=Pal.getrsaprovatekey();
打破
病例:Dsa:
_lazyprovatekey=Pal.GetDSAPrivateKey();
打破
违约:
//这包括ECDSA,因为可以使用Oids.EcPublicKey密钥
//许多不同的算法种类,不一定是互斥的。
//
//另外,.NET Framework在此属性中仅支持RSA和DSA。
抛出新的NotSupportedException(SR.NotSupported_-KeyAlgorithm);
}
私钥的类型为
非对称gorithm
,需要将其强制转换为RSA或ECDsa。我记得@bartonjs说过应该使用GetXXXPrivateKey()
方法。所以你可以自己做:
string EccTestCert=“{base64-pkcs-12-here}”;
var cert=新的X509Certificate2(将.FromBase64String(ECCTESCERT)转换为“1”);
如果(cert.HasPrivateKey){
变量键=
(非对称算法)证书GetRSAPrivateKey()
??证书GetECDsaPrivateKey()
?抛出新的NotSupportedException(“谁仍在使用DSA?”);
if(键为ECDsa ECDsa){
var ecdsaSignature=ecdsa.SignData(新字节[]{0x00},HashAlgorithmName.SHA256);
}else if(密钥为RSA){
var rsaSignature=rsa.SignData(新字节[]{0x00},HashAlgorithmName.SHA256,rsasignatureadding.Pkcs1);
}否则{
抛出新的NotSupportedException(“谁还在使用DSA?”);
}
}
源代码显示,根据您运行的平台,会引发异常
开关(GetKeyAlgorithm())
{
案例1.Rsa:
_lazyprovatekey=Pal.getrsaprovatekey();
打破
病例:Dsa:
_lazyprovatekey=Pal.GetDSAPrivateKey();
打破
违约:
//这包括ECDSA,因为可以使用Oids.EcPublicKey密钥
//许多不同的算法种类,不一定是互斥的。
//
//另外,.NET Framework在此属性中仅支持RSA和DSA。
抛出新的NotSupportedException(SR.NotSupported_-KeyAlgorithm);
}
私钥的类型为
非对称gorithm
,需要将其强制转换为RSA或ECDsa。我记得@bartonjs说过应该使用GetXXXPrivateKey()
方法。所以你可以自己做:
string EccTestCert=“{base64-pkcs-12-here}”;
var cert=新的X509Certificate2(将.FromBase64String(ECCTESCERT)转换为“1”);
如果(cert.HasPrivateKey){
变量键=
(非对称算法)证书GetRSAPrivateKey()
??证书GetECDsaPrivateKey()
?抛出新的NotSupportedException(“谁仍在使用DSA?”);
if(键为ECDsa ECDsa){
var ecdsaSignature=ecdsa.SignData(新字节[]{0x00},HashAlgorithmName.SHA256);
}else if(密钥为RSA){
var rsaSignature=rsa.SignData(新字节[]{0x00},HashAlgorithmName.SHA256,rsasignatureadding.Pkcs1);
}否则{
抛出新的NotSupportedException(“谁还在使用DSA?”);
}
}
PKCS#12包含证书和私钥。因此,当导入带有新X509Certificate2(myPkcs12…
的pkcs12时,实例是一个带有私钥的证书-因此您可以用它签名或解密。@DanielFisherlennybacon您好,当我尝试使用ECC证书时,X509Certificate无法返回私钥供我使用。我将使用示例Pkcs12进行更新。Pkcs12包含证书和私钥。因此,当导入带有新X509Certificate2(myPkcs12…
的pkcs12时,实例是一个带有私钥的证书-因此您可以用它签名或解密。@DanielFisherlennybacon您好,当我尝试使用ECC证书时,X509Certificate无法返回私钥供我使用。我将更新一个Pkcs12示例。@Pkcs12如果这是你投的赞成票,它回答了你的问题,你能接受它吗?谢谢。您介意移除或扰乱Pkcs12吗?欢迎。数据替换为占位符。“我记得@bartonjs说过应该使用GetXXXPrivateKey()方法。”耶,我终于让人们明白了!到目前为止,我们的道路已经相交不止一次:-)@PKCS12如果是你投了赞成票,它回答了你的问题,你能接受它吗?谢谢。您介意移除或扰乱Pkcs12吗?欢迎。数据替换为占位符。“我记得@bartonjs说过应该使用GetXXXPrivateKey()方法。”耶,我终于让人们明白了!到目前为止,我们的道路已经相交不止一次:-)