首页 文章

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

提问于
浏览
0

我正在尝试创建一个RSA密钥对,我可以使用OpenSSL与 System.Security.Cryptography.X509Certificates.X509Certificate2 一起使用 .

我设法生成的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 =安全/ CN = mypurpose.contoso.org”

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

openssl pkcs12 -in cert.pem -inkey private.pem -export -out combined.pfx

提示输入密码以保护pkcs

尝试使用实例化 X509Certificate2 的实例

new X509Certificate2(@"C:\path\to\combined.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()

1 回答

  • 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,因为我在 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:\path\to\combined.pfx", (string)null, X509KeyStorageFlags.Exportable);

    有's some additional code I' m用于加载由 openssl genrsaopenssl rsa 生成的private.pem和public.pem:https://stackoverflow.com/a/32243171/26877 . 此代码将原始PEM数据(只是私钥/公钥)加载到 RSACryptoServiceProvider 实例中,该实例可用于加密和解密 .

相关问题