使用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来源,但到目前为止还没有运气。
答案 0 :(得分:2)
我有类似的问题。原来,私钥是使用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”。
答案 1 :(得分:1)
经过更多调查,我发现Erlang ssl实现与openssl req -newkey创建的私钥不能很好地配合使用。在openssl文档中,我找不到-newkey使用的确切算法,但是事先使用openssl genrsa -des3创建私钥就可以了,所以我认为默认算法不受Erlang的ssl支持。
我将其发布为答案,因为它可以解决我的问题,但是非常感谢您提供其他见解。
答案 2 :(得分:0)
这只是一个建议。我没有足够的代表在评论中提供这个。 尝试将密码作为二进制字符串。