OpenSSL.NET无法使用null Cipher导出私钥

时间:2010-06-11 23:14:47

标签: .net openssl private-key

我最近发现了OpenSSL.NET,这是一个非常可爱的小包装。

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

    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(..”行。我想在没有任何加密的情况下写出私钥。根据规范,如果我使用Null密码类型,这应该可以做到,但它无论我在buf中使用哪种证书,都行不通。

以下是例外:

错误:0D0A706C:asn1编码例程:PKCS5_pbe2_set:cipher没有对象标识符 错误:2307D00D:PKCS12例程:PKCS8_encrypt:ASN1 lib

我知道这部分工作正常,因为如果我指定任何其他密码类型,它会导出私钥。有人有什么建议吗?

2 个答案:

答案 0 :(得分:1)

为什么不能使用:

    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());

答案 1 :(得分:0)

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

  

如果正在为a编译OpenSSL   SSL将开发系统   在协议级调试,   省略命令   -DSSL_FORBID_ENULL可以接受。 -DSSL_FORBID_ENULL导致OpenSSL省略SSL密码中的空密码   套房。空密码允许明文   (未加密的信息)遍历   电线。空密码不提供   机密性,不鼓励   用于生产系统。