首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PEM而不是.p12加载.p12

使用PEM而不是.p12加载.p12
EN

Stack Overflow用户
提问于 2022-05-02 09:09:03
回答 1查看 408关注 0票数 0

我有一个应用程序需要的.p12证书文件。Sys admin不希望此文件存储在系统中。他们想将文件的价值放入Azure秘密中。作为一个.pem文件。

代码语言:javascript
复制
-----BEGIN PRIVATE KEY-----
.
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
.....
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
................
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
.................
-----END CERTIFICATE-----

加载p12

使用下面的代码,我可以加载P12文件。var certHasPrivateKey是真的,我的代码运行得很好。

代码语言:javascript
复制
// Load the cert as p12
var certificate = new X509Certificate2(pathToCert, certPassword,
    X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet  | X509KeyStorageFlags.Exportable);

var certHasPrivateKey = certificate.HasPrivateKey;

加载字符串导出的证书。

但是,如果我加载这个导出的基于文本的版本,var certHasPrivateKey是false,它没有加载私钥。

代码语言:javascript
复制
// Load the cert as string
var certificate2 = new X509Certificate2(p12Export, certPassword,
    X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

var certHasPrivateKey = certificate2 .HasPrivateKey;

如何加载导出的证书?用私钥。

问题是

如果没有私钥,我的代码就会失败,因为我无法导出主题信息。

代码语言:javascript
复制
 var key = certificate.GetRSAPrivateKey();
 var pubKeyBytes = key.ExportSubjectPublicKeyInfo();

全例

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-02 15:25:53

构造函数不理解这种格式。PFX是构造函数了解的唯一格式,它返回具有绑定私钥的证书。

要轻松加载此类数据,需要使用X509Certificate2.CreateFromPemFile(prem) (.NET 5+)。如果您使用的是旧版本,则需要加载证书,独立加载密钥,并将它们与certWithKey = cert.CopyWithPrivateKey(key)结合使用。

代码语言:javascript
复制
var key = certificate.GetRSAPrivateKey();
var pubKeyBytes = key.ExportSubjectPublicKeyInfo();

如果您只需要SPKI,则可以调用GetRSAPublicKey而不是GetRSAPrivateKey。(如果您使用的是.NET 6+,则可以使用cert.PublicKey.ExportSubjectPublicKeyInfo()更灵活地处理所支持的算法)

我怀疑它实际上并不适用,稍后您还在用私钥做其他事情,但还是觉得值得指出。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72084560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档