Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Convert.crt+。以C语言编程方式将密钥文件发送到X509Certificate2#_C#_Bouncycastle_X509 - Fatal编程技术网

C# Convert.crt+。以C语言编程方式将密钥文件发送到X509Certificate2#

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语言编程实

我在Linux机器上有一个.crt证书和一个.key私钥文件。私钥采用加密PKCS#8格式(开始加密私钥…)。我想将这些导入X509Certificate2对象以供进一步使用。因为我们使用的是Linux,所以我们使用的是.NETCore2.2(我们还不能迁移到3.0)

我已经探索了一些可能的解决方案,具体如下:

  • 使用
    openssl
    将文件转换为.pfx并使用X509Certificate2导入该文件
    • 我不想使用此选项,因为我不想从C#中执行shell代码。我希望这个解决方案能够完全用C语言编程实现
  • 使用C#BouncyCastle库执行以下操作之一:
    • 将证书和密钥转换为.pfx(如上所述),或
    • 分别导入证书和私钥,并使用组合它们
    • 但是,我找不到适用于BouncyCastle C#版本的API,因此我不确定可以使用什么方法来实现这一点
  • C#中的一些其他编程方法,我在这里缺少

  • 基本上,最终目标是从.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

    请参见以下内容:提供的导入方法似乎不允许仅处理证书和私钥。它们要么只获取证书,要么获取证书、密码和keystrageFlags,两者都不适合我的使用情况。看起来您可以只设置属性:当我试图避免将整个项目移动到.NET 3.0时,BouncyCastle最终无法工作。这就是我采用的解决方案。谢谢不幸的是,如果您必须支持.NET标准2.0或更早版本,则此答案将不起作用,因为在2.1(.NET Core 3.0+或.NET 5.0预览版)之前,ImportXXX()方法或CopyWithPrivateKey()都不可用。