【问题标题】:Convert a .PEM certificate to .PFX programmatically using OpenSSL使用 OpenSSL 以编程方式将 .PEM 证书转换为 .PFX
【发布时间】:2011-03-07 01:46:22
【问题描述】:

我有一个 .PEM file,我想将其转换为 PKCS12 文件 (PFX),我知道我可以使用以下 openssl 命令轻松完成此操作:

Create a PKCS#12 file:

 openssl pkcs12 -export -in file.pem -out file.p12 -name "My Certificate"

这很好,但我想使用OpenSSL 调用以编程方式执行此操作。不幸的是,OpenSSL 的文档并不理想。

我已经研究过使用其他库来做到这一点:

使用 .NET:我可以从 PEM 文件创建 X509Certificate2 对象,但这只会获取第一个证书并忽略 PEM 文件中的任何中间 CA。

使用Mentalis.org 安全库:我可以从 PEM 文件创建证书对象,但我在文档中看到以下内容:

备注 此实现仅读取 PEM 文件中的证书。它确实 不读取私钥 证书文件,如果有的话。

所以,这对我没有帮助。我也需要那个私钥。

我基本上需要重新创建 OpenSSL 命令行工具操作来进行 PEM>PFX,但是在代码中。

有更简单的方法吗?

【问题讨论】:

    标签: openssl pfx x509certificate2 pem pkcs#12


    【解决方案1】:

    您可以使用BouncyCastle(假设是 C#,因为您提到了 .NET)。

    假设localhost.pem 包含证书和私钥,这样的东西应该可以工作:

    using System;
    using System.Collections;
    using System.Linq;
    using System.Text;
    using System.IO;
    
    using Org.BouncyCastle.Crypto;
    using Org.BouncyCastle.OpenSsl;
    using Org.BouncyCastle.Pkcs;
    using Org.BouncyCastle.X509;
    using Org.BouncyCastle.Security;
    
    namespace TestApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                StreamReader sr = File.OpenText("localhost.pem");
                IPasswordFinder passwordFinder = new PasswordStore("testtest".ToCharArray());
                PemReader pemReader = new PemReader(sr, passwordFinder);
    
    
                Pkcs12Store store = new Pkcs12StoreBuilder().Build();
                X509CertificateEntry[] chain = new X509CertificateEntry[1];
                AsymmetricCipherKeyPair privKey = null;
    
                object o;
                while ((o = pemReader.ReadObject()) != null)
                {
                    if (o is X509Certificate)
                    {
                        chain[0] = new X509CertificateEntry((X509Certificate)o);
                    }
                    else if (o is AsymmetricCipherKeyPair)
                    {
                        privKey = (AsymmetricCipherKeyPair)o;
                    }
                }
    
                store.SetKeyEntry("test", new AsymmetricKeyEntry(privKey.Private), chain);
                FileStream p12file = File.Create("localhost.p12");
                store.Save(p12file, "testtest".ToCharArray(), new SecureRandom());
                p12file.Close();
            }
        }
    
        class PasswordStore : IPasswordFinder
        {
            private char[] password;
    
            public PasswordStore(
                        char[] password)
            {
                this.password = password;
            }
    
            public char[] GetPassword()
            {
                return (char[])password.Clone();
            }
    
        }
    }
    

    如果您想正确处理证书链,您可能需要为IPasswordFinder 提供一些更微妙的东西。 如需更多高级功能,您可以在BouncyCastle examples 中找到更多详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2010-10-22
      • 2011-09-24
      • 2013-02-15
      • 2013-06-02
      • 1970-01-01
      相关资源
      最近更新 更多