使用OpenSSL以编程方式将.PEM证书转换为.PFX
我有一个要转换为PKCS12文件(PFX)的文件,我知道我可以使用以下使用OpenSSL以编程方式将.PEM证书转换为.PFX,openssl,pfx,x509certificate2,pem,pkcs#12,Openssl,Pfx,X509certificate2,Pem,Pkcs#12,我有一个要转换为PKCS12文件(PFX)的文件,我知道我可以使用以下openssl命令轻松完成这一点: 这很好,但我希望通过调用以编程方式实现这一点。不幸的是,OpenSSL的文档并不理想 我已经研究过使用其他库来实现这一点: 使用.NET:我可以从PEM文件创建X509Certificate2对象,但这只获取第一个证书,并忽略PEM文件中的任何中间CA 使用安全库:我可以从PEM文件创建证书对象,但我在文档中看到了以下内容: 评论 此实现仅读取 来自PEM文件的证书。是的 不从数据库读取私钥
openssl
命令轻松完成这一点:
这很好,但我希望通过调用以编程方式实现这一点。不幸的是,OpenSSL的文档并不理想
我已经研究过使用其他库来实现这一点:
使用.NET:我可以从PEM文件创建X509Certificate2对象,但这只获取第一个证书,并忽略PEM文件中的任何中间CA
使用安全库:我可以从PEM文件创建证书对象,但我在文档中看到了以下内容:
评论
此实现仅读取
来自PEM文件的证书。是的
不从数据库读取私钥
证书文件(如果存在)
所以,这对我没有帮助。我也需要那个私钥
我基本上需要重新创建OpenSSL命令行工具操作,以便运行PEM>PFX,但需要代码
有更简单的方法吗?您可以使用(假设是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
,如果您想正确处理证书链,您可能需要一些更微妙的东西。
有关更高级的功能,您可以在中找到更多详细信息
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();
}
}
}