当前位置: 首页 > 知识库问答 >
问题:

使用PEM和not加载X509Certificate2。p12页

后树
2023-03-14

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

-----BEGIN PRIVATE KEY-----
.
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
.....
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
................
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
.................
-----END CERTIFICATE-----

使用以下代码,我可以加载P12文件。var certHasPrivate ateKey为真,我的代码运行良好。

// Load the cert as p12
var certificate = new X509Certificate2(pathToCert, certPassword,
    X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet  | X509KeyStorageFlags.Exportable);

var certHasPrivateKey = certificate.HasPrivateKey;

但是,如果我加载此导出的基于文本的版本,则var certHasPrivate ateKey为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;
}

共有1个答案

乐正嘉瑞
2023-03-14

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

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

var key = certificate.GetRSAPrivateKey();
var pubKeyBytes = key.ExportSubjectPublicKeyInfo();

如果您只需要SPKI blob,您可以调用GetRSAPublicKey而不是GetRSAPrivate ateKey。(如果您在. NET 6上,您可以通过使用cert. PublicKey. ExportSubjectPublicKeyInfo()来更灵活地使用支持的算法)

我怀疑它实际上并不适用,并且您稍后会使用私钥做其他事情,但尽管如此,它仍然值得指出。

 类似资料:
  • 这是个新手问题。我正在尝试使用以下方法加载.der证书: 有效吗?我如何在代码中得到它?

  • 我希望加载/使用Java应用程序中提供给我的加密私钥。请找到密钥(加密的私有密钥、解密的私有密钥和公钥如下所示)。 加密的私钥密码:“AWCTJPET9FL7UBTP97HX99GDOFEWKUF5TUXSUJEST2SEKYVKYINRFRJ6EISUTERF” 密钥是在NodeJS中使用加密生成的,使用: 我正在使用:运行时版本:11.0.7+10-B765.64amd64,OpenJDK 6

  • 我有一个属性文件: 当我启动应用程序显示此错误: 我将p12复制到另一个文件夹(/mnt/d/KeyStores/): 我使用以下方法进行测试:密钥库:/mnt/d/密钥库/密钥库.p12 密钥库: D:\密钥库\密钥库.p12 密钥存储:文件:/mnt/d/KeyStores/keystory.p12 密钥存储:文件:D:\KeyStores\keystore. p12 密钥库:file:///

  • 我需要向服务器发出请求。此请求需要证书才能访问服务器。 如果我加载P12文件并将其注册为http客户端上的证书。它工作得很好。 但是,如果我使用CreateFromPemFile从pem文件加载证书。 我在向服务器发送请求时收到。 注意,如果在文本编辑器中打开pem文件,则其外观如下所示。

  • 所以,接下来我需要的是: 创建用于开发的证书,分别为客户端和服务器获取一个证书 通过从客户端编码并在服务器上解码的API检索密码 现在,我按照这个链接创建了certifiactes。那里的女孩一步一步地给出了如何获得自己签名的证书、将其存放在商店等方面的指导。现在,我有问题的部分是: 真的会有人帮我。

  • 问题内容: 我试图从下面的文件中提取RES公钥 这是我做的代码.. 但是它抛出了 java.security.InvalidKeyException:IOException:ObjectIdentifier()-数据不是对象ID 从文件中提取RES公钥的合适方法是什么。 问题答案: X.509证书和X509EncodedKeySpec具有完全不同的结构,并且尝试将证书解析为密钥是行不通的。Java