C# Convert.crt+。以C语言编程方式将密钥文件发送到X509Certificate2#
我在Linux机器上有一个.crt证书和一个.key私钥文件。私钥采用加密PKCS#8格式(开始加密私钥…)。我想将这些导入X509Certificate2对象以供进一步使用。因为我们使用的是Linux,所以我们使用的是.NETCore2.2(我们还不能迁移到3.0) 我已经探索了一些可能的解决方案,具体如下:C# Convert.crt+。以C语言编程方式将密钥文件发送到X509Certificate2#,c#,bouncycastle,x509,C#,Bouncycastle,X509,我在Linux机器上有一个.crt证书和一个.key私钥文件。私钥采用加密PKCS#8格式(开始加密私钥…)。我想将这些导入X509Certificate2对象以供进一步使用。因为我们使用的是Linux,所以我们使用的是.NETCore2.2(我们还不能迁移到3.0) 我已经探索了一些可能的解决方案,具体如下: 使用openssl将文件转换为.pfx并使用X509Certificate2导入该文件 我不想使用此选项,因为我不想从C#中执行shell代码。我希望这个解决方案能够完全用C语言编程实
openssl
将文件转换为.pfx并使用X509Certificate2导入该文件
- 我不想使用此选项,因为我不想从C#中执行shell代码。我希望这个解决方案能够完全用C语言编程实现
- 将证书和密钥转换为.pfx(如上所述),或
- 分别导入证书和私钥,并使用组合它们
- 但是,我找不到适用于BouncyCastle C#版本的API,因此我不确定可以使用什么方法来实现这一点
基本上,最终目标是从.crt和.key文件中获取X509Certificate2对象。任何关于使用何种方法的帮助/见解,甚至是有用的BouncyCastle文档的指针,都将不胜感激。谢谢 在.NET Core 3.0中,这是可能的,尽管没有那么友好:
private static byte[] UnPem(string pem)
{
// This is a shortcut that assumes valid PEM
// -----BEGIN words-----\nbase64\n-----END words-----
const string Dashes = "-----";
int index0 = pem.IndexOf(Dashes);
int index1 = pem.IndexOf('\n', index0 + Dashes.Length);
int index2 = pem.IndexOf(Dashes, index1 + 1);
return Convert.FromBase64String(pem.Substring(index1, index2 - index1));
}
...
string keyPem = File.ReadAllText("private.key");
byte[] keyDer = UnPem(keyPem);
X509Certificate2 certWithKey;
using (X509Certificate2 certOnly = new X509Certificate2("certificate.cer"))
using (RSA rsa = RSA.Create())
{
// For "BEGIN PRIVATE KEY"
rsa.ImportPkcs8PrivateKey(keyDer, out _);
certWithKey = certOnly.CopyWithPrivateKey(rsa);
}
using (certWithKey)
{
Console.WriteLine(certWithKey.HasPrivateKey);
}
RSA私钥可以有三种不同的格式,您需要为每种格式调用正确的导入:
- “开始私钥”:ImportPKCS8私钥
- “开始加密私钥”:ImportEncryptedPkcs8PrivateKey
- “开始RSA私钥”:ImportRSAPrivateKey