2

我最近发现了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:密码没有对象标识符错误:2307D00D:PKCS12 例程:PKCS8_encrypt:ASN1 lib

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

4

2 回答 2

2

为什么不能使用:

    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());
于 2010-06-21T15:58:25.950 回答
0

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

如果正在为将在协议级别调试 SSL 的开发系统编译 OpenSSL,则可以忽略命令 -DSSL_FORBID_ENULL。-DSSL_FORBID_ENULL 导致 OpenSSL 在 SSL 密码套件中省略空密码。空密码允许明文(未加密的信息)通过线路。空密码不提供保密性,也不鼓励在生产系统上使用。

于 2010-06-19T05:50:21.780 回答