Erlang ssl: опция пароля для закрытого ключа - PullRequest
0 голосов
/ 12 июня 2018

Context

Используя Elixir и Brod (который использует модуль ssl Эрланга), я пытаюсь подключиться к брокеру Kafka с поддержкой SSL.Это работает тогда и только тогда, когда закрытый ключ сертификата клиента не защищен паролем.

Сертификат создан с использованием 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, подходит дляМодуль ssl Эрланга.

Конфигурация

Брод передает параметры SSL вплоть до 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

Согласно Интернет эта ошибка означает, что файл закрытого ключаневозможно проанализировать / загрузить / использовать.Я попытался использовать неправильный пароль, и это то же самое сообщение.Как отмечалось выше, при использовании секретного ключа, который не защищен паролем, он работает нормально.

Идеи

  • Что-то не так с форматированием client.key?
  • Нужно ли указывать пароль по-другому?

В настоящее время изучаю источники OTP, но пока не повезло.

Ответы [ 3 ]

0 голосов
/ 09 июля 2018

Проведя еще несколько исследований, я обнаружил, что реализация Erlang ssl плохо работает с закрытым ключом, созданным openssl req -newkey.В документации openssl я не смог найти точный алгоритм, используемый -newkey, но создание секретного ключа заранее с использованием openssl genrsa -des3 помогло, так что я думаю, что алгоритм по умолчанию не поддерживается в ssl Эрланга.

Я публикую это как ответ, так как это решит мою проблему, но я очень ценю любые дополнительные идеи.

0 голосов
/ 26 июля 2018

У меня была похожая проблема.Оказалось, что закрытый ключ был закодирован с использованием AES-256-CBC, но библиотека public_key в Erlang / OTP не поддерживает его.Это сбой вызова функции:

** 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» не обрабатывается.

0 голосов
/ 18 июня 2018

Это всего лишь предложение.Мне не хватает представителей, чтобы представить это в комментариях.Попробуйте указать пароль в виде двоичной строки.

...