【发布时间】:2013-10-21 17:47:02
【问题描述】:
我正在尝试使用 OpenSSL.NET 从证书和密钥(也使用 openssl.net 生成)生成 P12 文件。 我的功能如下:
GenerateP12(string pwd, RSA key, string pemcert)
{
BIO certbio = new BIO(pemcert);
X509Certificate x = new X509Certificate(certbio);
CryptoKey crytokey = new CryptoKey(key);
PKCS12 p12 = new PKCS12(pwd, cryptokey, x, ca);
BIO a = BIO.MemoryBuffer();
p12.write(a);
// Write 'a' to some file.
}
但是,当我尝试将该密钥复制到 .NET X509Certificate2 对象中时,我收到“输入数据无法编码为有效证书”。
如果我得到 pem 格式的私钥,使用:
key.PrivateKeyAsPEM
并将其与 cert pem 一起写入文件,然后从终端运行以下 openssl 命令:
openssl pkcs12 -export -aes256 -in cert.pem -inkey key.pem -out outfile.crt
导入 X509Certificate2 对象可以正常工作。
有谁知道我如何使用 OpenSSL.NET 生成 PKCS12,这会给我一个与使用 openssl 命令行工具时生成的文件类似的文件?
谢谢,
更新: 看起来我在代码中生成的 P12 格式不正确;如果我将它导出到一个文件,然后尝试使用 openssl 命令行获取它的信息:
openssl pkcs12 -info -in myp12.p12
我收到以下错误:
140735263351648:error:0D07209B:asn1 encoding routines:ASN1_get_object:too long:asn1_lib.c:142:
140735263351648:error:0D068066:asn1 encoding routines:ASN1_CHECK_TLEN:bad object header:tasn_dec.c:1306:
140735263351648:error:0D06C03A:asn1 encoding routines:ASN1_D2I_EX_PRIMITIVE:nested asn1 error:tasn_dec.c:831:
140735263351648:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:751:Field=version, Type=PKCS12
这解释了为什么尝试将其导入 .NET X509Certificate2 对象会失败。 我还更改了我正在使用的 Openssl.NET API,因此我的代码现在如下所示:
string GenerateP12(string pwd, CryptoKey key, string cert)
{
BIO certbio = new BIO(cert);
BIO a = BIO.MemoryBuffer();
X509Certificate x = new X509Certificate(certbio);
Stack<X509Certificate>ca = new Stack<X509Certificate>();
PKCS12 p12 = new PKCS12(pwd, "test", key, x, ca, SHA1_3DES, SHA1_RC2_40, 0, KEY_DEFAULT);
p12.Write(a);
return a.ReadString();
}
(我使用的是扩展函数,因为我需要指定要使用的算法,并且默认值和我需要的不一样)。
【问题讨论】:
-
您是否尝试过其他库,例如 SecureBlackbox?他们应该能够做你描述的事情。
-
@NickolayOlshevsky 我没有。我使用 openssl 的主要原因是我在其他地方使用它,而且它通过了 FIPS。
-
您可以使用此链接了解如何将证书和密钥转换为 PKCS#12 文件。 sslshopper.com/ssl-converter.html希望对你有帮助! :)
-
我之前确实遇到过那个网站,从使用什么命令行选项的角度来看,它确实很有帮助,但我正在尝试使用 .NET 以编程方式进行
-
好的。如果在 PKCS12 中不包含 CA 怎么办?另外,您可以将带有密码的 PKCS#12 数据上传到某处,以便我可以检查吗?