c# - 在 C# 中以编程方式将 .crt + .key 文件转换为 X509Certificate2

标签 c# bouncycastle x509

我在 Linux 机器上有一个 .crt 证书和一个 .key 私钥文件。私钥采用加密的 PKCS#8 格式(BEGIN ENCRYPTED PRIVATE KEY...)。我想将这些导入到 X509Certificate2 对象中以供进一步使用。由于我们在 Linux 上,我们使用 .NET Core 2.2(我们还不能迁移到 3.0)。

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

  • 使用 openssl将文件转换为 .pfx 并使用 X509Certificate2 导入
  • 我不想使用这个选项,因为我不想从 C# 中执行 shell 代码。我希望该解决方案在 C# 中完全以编程方式实现。
  • 使用 C# BouncyCaSTLe 库执行以下任一操作:
  • 将证书和 key 都转换为 .pfx(如上),或
  • 分别导入证书和私钥并使用 X509Certificate2.CopyWithPrivateKey() 将它们结合起来。
  • 但是,我找不到 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 私钥可以是三种不同的格式,您需要为每一种调用正确的导入:
  • “开始私钥”:ImportPkcs8PrivateKey
  • “开始加密私钥”:ImportEncryptedPkcs8PrivateKey
  • “开始 RSA 私钥”:ImportRSAPrivateKey
  • 关于c# - 在 C# 中以编程方式将 .crt + .key 文件转换为 X509Certificate2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58173433/

    相关文章:

    c# - 为什么 Dns.GetHostAddresses 无法获取 https ://google. com 的 IP 地址?

    java - 通过POM入口运行应用程序时如何避免bcprov-jdk16-1.45.jar

    google-chrome - X509 主题备用名称 (subjectAltName) IP 地址字段

    C# for visual studio 2010 excel 开发

    c# - 获取 DataTemplate 中的元素

    java.lang.IllegalArgumentException : string curve25519 not an OID bouncycaSTLe 1. 52

    java - Java 中 vector 不随 "AES/CBC/pkcs7padding"变化

    c# - 是否可以仅使用 C# 以编程方式生成 X509 证书?

    java - 使用 Java 中的 Bouncy CaSTLe 自签名 X509 证书

    C# 结构到字节数组的编码方式与 Delphi 中的打包记录相同