如何使用openssl创建与X509Certificate2兼容的pfx

时间:2018-04-25 18:06:19

标签: c# .net openssl

我尝试使用OpenSSL创建一个可以与67一起使用的RSA密钥对。

我设法生成的PFX给了我这个堆栈跟踪

创建一个未加密的私钥(我意识到这不是最佳实践)

System.Security.Cryptography.X509Certificates.X509Certificate2

从私钥

创建公钥

openssl genrsa -out private.pem 2048

从私钥创建证书文件 openssl req -x509 -key private.pem -out cert.pem -days 365 -nodes -subj" / C = US / ST = Colorado / L = Colorado Springs / O = Contoso / OU = Security / CN = mypurpose .contoso.org"

使用自签名证书创建pfx文件

openssl rsa -in private.pem -outform PEM -pubout -out public.pem

  

提示输入密码以保护pkcs

尝试使用

实例化openssl pkcs12 -in cert.pem -inkey private.pem -export -out combined.pfx的实例

X509Certificate2

new X509Certificate2(@"C:\path\to\combined.pfx", "password",  X509KeyStorageFlags.Exportable);

1 个答案:

答案 0 :(得分:0)

堆栈跟踪告诉我一切。

at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags)

这意味着我的PFX文件中没有CERTIFICATE,因为我在-nocerts命令中使用了openssl pkcs12

  

在密码学中,PKCS#12定义了用于存储的存档文件格式   许多加密对象作为单个文件。它常用于   将私钥与其X.509证书捆绑在一起或捆绑所有密钥   信任链的成员。 PKCS 12

pkcs12文件真的想要包含除私有/公共密钥之外的东西,它想要一个X.509证书;这是:

  • 证书版本
  • 序列号
  • 签名算法
  • 发行人
  • 有效性不在之前
  • 有效期不是。

这是我想要的最终命令:

openssl pkcs12 -in cert.pem -inkey private.pem -export -clcerts -out combined.pfx -passout pass:

这允许我使用此代码进行实例化:

new X509Certificate2(@"C:\path\to\combined.pfx", (string)null, X509KeyStorageFlags.Exportable);

还有一些额外的代码用来加载openssl genrsaopenssl rsa生成的private.pem和public.pem:https://stackoverflow.com/a/32243171/26877。 此代码将原始PEM数据(仅私有/公共密钥)加载到RSACryptoServiceProvider实例中,该实例可用于加密&解密。