OpenSSL.NET可以';t使用空密码导出私钥

OpenSSL.NET可以';t使用空密码导出私钥,.net,openssl,private-key,.net,Openssl,Private Key,我最近发现了一个非常可爱的小包装 我正在尝试执行以下代码: public static void DoSomething(byte[] buf) { OpenSSL.Core.BIO input = new OpenSSL.Core.BIO(buf); OpenSSL.X509.X509Certificate b = OpenSSL.X509.X509Certificate.FromPKCS12(input, "passphrase");

我最近发现了一个非常可爱的小包装

我正在尝试执行以下代码:

    public static void DoSomething(byte[] buf)
    {
        OpenSSL.Core.BIO input = new OpenSSL.Core.BIO(buf);
        OpenSSL.X509.X509Certificate b = OpenSSL.X509.X509Certificate.FromPKCS12(input, "passphrase");
        OpenSSL.Core.BIO outs = OpenSSL.Core.BIO.MemoryBuffer(false);
        b.PrivateKey.WritePrivateKey(outs, OpenSSL.Crypto.Cipher.Null, "passphrase");
        outs.SetClose(OpenSSL.Core.BIO.CloseOption.Close);
        Console.WriteLine(outs.ReadString());
    }
问题出现在“b.PrivateKey.WritePrivateKey(..)行。我想在不加密的情况下写出私钥。根据规范,如果我使用空密码类型,这应该可以解决问题,但不管我在buf中使用的证书是什么,它都不会起作用

例外情况如下:

错误:0D0A706C:asn1编码例程:PKCS5\u pbe2\u集:密码没有对象标识符 错误:2307D00D:PKCS12例程:PKCS8_加密:ASN1 lib


我知道这部分很好用,因为如果我指定任何其他密码类型,它会毫无疑问地导出私钥。有人有什么建议吗?

我并不真正使用它,但这可能会有所帮助:

如果正在为 SSL将在其中运行的开发系统 在协议级别进行调试, 省略命令 -DSSL禁止\u ENULLis是可接受的。-DSSL禁止\u ENULL导致OpenSSL在SSL密码中省略空密码 空密码允许明文 (未加密的信息)遍历 wire.Null密码不提供任何 不鼓励保密和保密 用于生产系统


我并不真的使用它,但这可能会有所帮助:

如果正在为 SSL将在其中运行的开发系统 在协议级别进行调试, 省略命令 -DSSL禁止\u ENULLis是可接受的。-DSSL禁止\u ENULL导致OpenSSL在SSL密码中省略空密码 空密码允许明文 (未加密的信息)遍历 wire.Null密码不提供任何 不鼓励保密和保密 用于生产系统

为什么不能使用:

    OpenSSL.Core.BIO outs = OpenSSL.Core.BIO.MemoryBuffer(false);
    outs.Write(b.PrivateKey.ToString());
    outs.SetClose(OpenSSL.Core.BIO.CloseOption.Close);
    Console.WriteLine(outs.ReadString());
这样您就可以编写未加密的密钥

我明白了,换成:

    OpenSSL.Core.BIO outs = OpenSSL.Core.BIO.MemoryBuffer(false);
    outs.Write(b.PrivateKey.GetRSA().PrivateKeyAsPEM);
    outs.SetClose(OpenSSL.Core.BIO.CloseOption.Close);
    Console.WriteLine(outs.ReadString());
为什么不能使用:

    OpenSSL.Core.BIO outs = OpenSSL.Core.BIO.MemoryBuffer(false);
    outs.Write(b.PrivateKey.ToString());
    outs.SetClose(OpenSSL.Core.BIO.CloseOption.Close);
    Console.WriteLine(outs.ReadString());
这样您就可以编写未加密的密钥

我明白了,换成:

    OpenSSL.Core.BIO outs = OpenSSL.Core.BIO.MemoryBuffer(false);
    outs.Write(b.PrivateKey.GetRSA().PrivateKeyAsPEM);
    outs.SetClose(OpenSSL.Core.BIO.CloseOption.Close);
    Console.WriteLine(outs.ReadString());
PrivateKey.ToString()创建私钥的ascii(人类可读)表示形式。所有数据都存在,但我希望获得原始/未加密的二进制私钥数据。PrivateKey.ToString()创建ascii(人类可读)私钥的表示。所有数据都存在,但我希望获得原始/未加密的二进制私钥数据。