如何与OpenSSL创建与X509Certificate2兼容的PFX



我正在尝试创建一个可以使用openssl与System.Security.Cryptography.X509Certificates.X509Certificate2一起使用的RSA键盘。

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

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

openssl genrsa -out private.pem 2048

从私钥创建一个公钥

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

从私钥创建证书文件

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 pkcs12 -in cert.pem -inkey private.pem -export -out combined.pfx

提示密码以保护PKCS

尝试使用

实例化X509Certificate2的实例

new X509Certificate2(@"C:pathtocombined.pfx", "password", X509KeyStorageFlags.Exportable);

   at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
   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)
   at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
   at Program.Main()

堆栈跟踪告诉我一切。

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文件中没有证书,因为我在openssl pkcs12命令中使用了-nocerts

在密码学中,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:pathtocombined.pfx", (string)null, X509KeyStorageFlags.Exportable);

我正在使用一些其他代码来加载private.pem和public.pem。由openssl genrsaopenssl rsa生成:https://stackoverflow.com/a/a/32243171/26877。该代码将RAW PEM数据(仅是私有/公共密钥(加载到RSACryptoServiceProvider实例中,可用于加密&解密。

最新更新