我有一个应用程序需要的.p12证书文件。Sys admin不希望此文件存储在系统中。他们想将文件的价值放入Azure秘密中。作为一个.pem文件。
-----BEGIN PRIVATE KEY-----
.
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
.....
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
................
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
.................
-----END CERTIFICATE-----加载p12
使用下面的代码,我可以加载P12文件。var certHasPrivateKey是真的,我的代码运行得很好。
// Load the cert as p12
var certificate = new X509Certificate2(pathToCert, certPassword,
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
var certHasPrivateKey = certificate.HasPrivateKey;加载字符串导出的证书。
但是,如果我加载这个导出的基于文本的版本,var certHasPrivateKey是false,它没有加载私钥。
// Load the cert as string
var certificate2 = new X509Certificate2(p12Export, certPassword,
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
var certHasPrivateKey = certificate2 .HasPrivateKey;如何加载导出的证书?用私钥。
问题是
如果没有私钥,我的代码就会失败,因为我无法导出主题信息。
var key = certificate.GetRSAPrivateKey();
var pubKeyBytes = key.ExportSubjectPublicKeyInfo();全例
using System.Security.Cryptography.X509Certificates;
Console.WriteLine("Hello, World!");
var pathToCert = "C:\\Development\\KMDDIMA\\CredsForAuth\\RealP12File.p12";
var certPassword = "Magda2015";
var prem = "C:\\Development\\KMDDIMA\\CredsForAuth\\cert.pem";
// Load the cert as p12 (Works)
var certificate = new X509Certificate2(pathToCert, certPassword,
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
var p1 = certificate.HasPrivateKey;
try
{
// Load the cert prem as just the file (Error: Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Cannot find the requested object.)
var certPremFile = new X509Certificate2(prem, certPassword,
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
var certPremFilePrivateIsSet = certPremFile.HasPrivateKey;
Console.WriteLine(certPremFilePrivateIsSet);
}
catch (Exception e)
{
Console.WriteLine(e);
//throw;
}
try
{
// Load the cert as prem as a byte array (Error: Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Cannot find the requested object.)
var certPremBytes = File.ReadAllBytes(prem);
var certPremLoadedWithBytes = new X509Certificate2(certPremBytes, certPassword,
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
var p2HasPrivateKey = certPremLoadedWithBytes.HasPrivateKey;
Console.WriteLine(p2HasPrivateKey);
}
catch (Exception e)
{
Console.WriteLine(e);
//throw;
}发布于 2022-05-02 15:25:53
构造函数不理解这种格式。PFX是构造函数了解的唯一格式,它返回具有绑定私钥的证书。
要轻松加载此类数据,需要使用X509Certificate2.CreateFromPemFile(prem) (.NET 5+)。如果您使用的是旧版本,则需要加载证书,独立加载密钥,并将它们与certWithKey = cert.CopyWithPrivateKey(key)结合使用。
var key = certificate.GetRSAPrivateKey();
var pubKeyBytes = key.ExportSubjectPublicKeyInfo();如果您只需要SPKI,则可以调用GetRSAPublicKey而不是GetRSAPrivateKey。(如果您使用的是.NET 6+,则可以使用cert.PublicKey.ExportSubjectPublicKeyInfo()更灵活地处理所支持的算法)
我怀疑它实际上并不适用,稍后您还在用私钥做其他事情,但还是觉得值得指出。
https://stackoverflow.com/questions/72084560
复制相似问题