Bouncy Castle C#调用PrivateKeyFactory.CreateKey出现Unknown object报错如何解决
问题排查与解决步骤
1 定位核心错误原因
你遇到的Org.BouncyCastle.Asn1.DerInteger类型报错,核心原因是密钥格式不匹配:
你通过openssl默认生成的私钥是PKCS#1格式(文件头标识为-----BEGIN RSA PRIVATE KEY-----),而BouncyCastle的PrivateKeyFactory.CreateKey()方法仅支持解析PKCS#8格式的私钥(文件头标识为-----BEGIN PRIVATE KEY-----),格式不匹配会直接触发参数类型错误。
你可以直接打开生成的cert_private.key文件查看头部标识确认格式。
2 最简便解决方法:转换密钥为PKCS#8格式
不需要重新导出pfx证书,直接用openssl命令将现有PKCS#1私钥转换为兼容的PKCS#8格式即可:
openssl pkcs8 -topk8 -nocrypt -in cert_private.key -out cert_private_pkcs8.key
转换完成后,去掉新密钥文件头尾的标识行、所有换行、空格字符后,再传入你的解密函数即可正常解析。
3 可选方案:修改代码兼容PKCS#1格式密钥
如果你不想转换密钥,也可以直接修改GetPrivateKeyParameter方法,适配PKCS#1格式的私钥:
private static AsymmetricKeyParameter GetPrivateKeyParameter(string s) { s = s.Replace("\r", "").Replace("\n", "").Replace(" ", "").Trim(); byte[] privateInfoByte = Convert.FromBase64String(s); Asn1Sequence seq = Asn1Sequence.GetInstance(privateInfoByte); RsaPrivateKeyStructure rsaPriv = RsaPrivateKeyStructure.GetInstance(seq); return new RsaPrivateCrtKeyParameters( rsaPriv.Modulus, rsaPriv.PublicExponent, rsaPriv.PrivateExponent, rsaPriv.Prime1, rsaPriv.Prime2, rsaPriv.Exponent1, rsaPriv.Exponent2, rsaPriv.Coefficient ); }
4 通用密钥有效性验证步骤
如果上述方案仍有问题,可以按以下步骤验证私钥本身是否正常:
- 确认传入代码的私钥已经完全剔除了头尾标识行、换行、空格等无关字符后再做Base64解码
- 用openssl命令直接验证私钥完整性:
输出openssl rsa -check -in cert_private.keyRSA key ok即代表私钥本身没有损坏。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

