我最近发现了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
我知道这部分工作正常,因为如果我指定任何其他密码类型,它会导出私钥。有人有什么建议吗?
答案 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密码中的空密码 套房。空密码允许明文 (未加密的信息)遍历 电线。空密码不提供 机密性,不鼓励 用于生产系统。