【问题标题】:Erlang ssl: password option for private keyErlang ssl:私钥的密码选项
【发布时间】:2018-11-21 14:49:49
【问题描述】:

上下文

使用 Elixir 和 Brod(依赖于 Erlang 的 ssl 模块),我正在尝试连接到启用 SSL 的 Kafka 代理。当且仅当客户端证书的私钥不受密码保护时,此方法才有效。

证书是使用openssl创建的:

$ openssl req -newkey rsa:2048 -sha256 -passout pass:test1234 -keyout client.key -out client.csr -days $DAYS -subj "$SUBJ"
$ openssl x509 -req -CA ca.crt -CAkey ca.key -in client.csr -out client.crt -days $DAYS -CAserial ca.sr

我确认密码是使用openssl rsa -noout -text -in certs/client.key 设置的。

之后,client.key 看起来像这样:

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFHzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQIttCU1ZmyY2ACAggA
...
6C/BxoJnc6SQODqj+eiZHsCTKQ==
-----END ENCRYPTED PRIVATE KEY-----

..我认为是 PEM 格式,适用于 Erlang 的 ssl 模块。

配置

Brod 将 SSL 选项传递给 Erlang 的 ssl:connect。我正在传递这些选项(Elixir 语法):

[
  certfile: "client.crt",
  keyfile: "client.key",
  password: String.to_charlist("test1234"),
  cacertfile: "ca.crt"
]

错误信息

** (stop) {{{:failed_to_upgrade_to_ssl, {:keyfile, :function_clause}}, [{:brod_sock, :maybe_upgrade_to_ssl, 4, [file: 'src/brod_sock.erl', line: 278]}, {:brod_sock, :do_init, 4, [file: 'src/brod_sock.erl', line: 204]}, {:brod_sock, :init, 5, [file: 'src/brod_sock.erl', line: 176]}, {:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 247]}]}, [localhost: 9193]}
    (brod) src/brod_client.erl:708: :brod_client.start_metadata_socket/5
    (brod) src/brod_client.erl:301: :brod_client.handle_info/2
    (stdlib) gen_server.erl:616: :gen_server.try_dispatch/4
    (stdlib) gen_server.erl:686: :gen_server.handle_msg/6
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3

根据Internet,这个错误意味着无法解析/加载/使用私钥文件。我试过使用错误的密码,它是完全相同的信息。如上所述,当使用不受密码保护的密钥时,它可以正常工作。

想法

  • client.key 的格式有问题吗?
  • 我必须以其他方式指定密码吗?

目前正在研究 OTP 来源,但目前还没有运气。

【问题讨论】:

    标签: ssl erlang elixir


    【解决方案1】:

    我有类似的问题。原来,私钥是使用AES-256-CBC 编码的,但是Erlang/OTP 中的public_key 库不支持它。这是失败的函数调用:

    ** exception error: no function clause matching pubkey_pbe:decode(...,
                 "password","AES-256-CBC", ...) (pubkey_pbe.erl, line 59)
     in function  public_key:do_pem_entry_decode/2 (public_key.erl, line 976)
    

    Erlang/OTP 中的实际代码在github,我们可以看到“AES-256-CBC”没有被处理。

    【讨论】:

    • 感谢您也添加源链接!
    【解决方案2】:

    在调查了更多之后,我发现 Erlang ssl 实现不能很好地与 openssl req -newkey 创建的私钥配合使用。在 openssl 文档中,我找不到 -newkey 使用的确切算法,但是使用 openssl genrsa -des3 预先创建私钥就可以了,所以我认为默认算法是 Erlang 的 ssl 不支持的。

    我将其发布为答案,因为它解决了我的问题,但我非常感谢任何其他见解。

    【讨论】:

      【解决方案3】:

      这只是一个建议。我没有足够的代表在 cmets 中提供这个。 尝试将密码作为二进制字符串提供。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-18
        • 1970-01-01
        • 2015-10-07
        • 2016-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-18
        相关资源
        最近更新 更多