Erlang: вводит httpd с SSL
Нелепо смешно, как трудно это настроить. Я пытался в течение 3 дней. Причесал интернет и этот сайт за помощью, но ничего не получилось.
То, что я хочу, концептуально просто. Я хочу, чтобы inets httpd сервер с ssl. Запустить и запустить сервер не проблема... в любом случае, не-ssl. Это когда ssl добавлен в это просто не работает.
Не спрашивайте, какие ошибки, их несколько, и они меняются в зависимости от того, какие изменения я внесу в конфигурацию. В основном это либо ошибка браузера, когда сертификат не дает разрешения на то или иное, либо, если внесены изменения, куча ошибок и сбоев процессов в оболочке erlang.
Я просто хочу знать 1) какие ssl сертификаты мне понадобятся, 2) в каком формате они должны быть, и 3) на стороне сервера httpd, какие именно опции конфигурации ssl мне понадобятся.
Нет Apache-подобной конфигурации или файлов конфигурации. Я хочу параметры конфигурации для этого программно.
Если кто-то может помочь с этим, я весь слух.
2 ответа
Используя Erlang R16B03, у меня работает следующая настройка:
-module(inets_ssl).
-export([start/0]).
start() ->
inets:start(),
{ok, Pid} = inets:start(httpd, [
{port, 22443},
{server_name,"localhost"},
{server_root,"./"},
{document_root,"./"},
{bind_address, any},
{socket_type, {ssl, [{certfile, "./server.crt"},
{keyfile, "./server.key"}]}},
{mimetypes, [
{"html", "text/html"}
]}
]),
Pid.
cert
(server.crt) и key
Файлы (server.key) могут быть созданы с помощью:
$ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048
$ openssl rsa -passin pass:x -in server.pass.key -out server.key
$ openssl req -new -key server.key -out server.csr
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Взято с https://devcenter.heroku.com/articles/ssl-certificate-self
Предполагая index.html
файл существует в document_root
URL https://localhost:22443/index.html
должен быть доступен.
Это сработало для меня, используя Linux OTP Release 22 и Windows OTP Release 23:
Конечно, мой сертификат не был подписан (пришлось добавить исключение для этого в Firefox), и в окнах кажется, что мое соединение было только что сброшено.
Однако curl работал в обоих случаях, и ему удалось установить соединение.
завиток -v -k https://127.0.0.1:9999/db/api:get
-module(api).
-export([start/0, get/3, main_handler/1]).
start() ->
try
inets:start(),
ssl:start()
catch
_ -> erlang:exit("Failed to start inets")
end,
case lists:member(main_handler_pid, registered()) of
false ->
MainPid = spawn_link(api, main_handler, [0]),
register(main_handler_pid, MainPid);
_ -> ok
end,
try start_api_response() of
{State,Pid} -> erlang:display({State,Pid}),
case State of
ok ->
ok;
_ ->
erlang:display(State)
end
catch
_:_ -> {"Error starting server"}
end.
start_api_response() ->
{State,Pid} = inets:start(httpd, [{port, 9999},
{server_name, "localhost"},
{socket_type, {ssl,[{certfile, "./cert.pem"}, {keyfile, "./key.pem"}]}},
{document_root, "./"},
{modules,[mod_esi,ssl,crypto]},
{server_root, "./"},
{bind_address, any},
{mimetypes, [
{"html", "text/html"}
]},
{erl_script_alias, {"/db", [api,io]}}]),
{State,Pid}.
main_handler(N) ->
receive
Pid ->
erlang:display("ping main: " ++ integer_to_list(N)),
Pid ! N
end,
main_handler(N+1).
get(Sid, _Env, Input) ->
main_handler_pid ! self(),
erlang:display(Input),
receive
N ->
mod_esi:deliver(Sid, integer_to_list(N))
end.
Это сработало после того, как я использовал 127.0.0.1 вместо localhost и добавил часть модулей:
{modules,[mod_esi,ssl,crypto]}
После этого я получил несколько отчетов об уведомлениях TLS с сервера, и причина, по которой он, похоже, не работает в Windows, заключается в следующем:
TLS server: In state hello at tls_record.erl:539 generated SERVER ALERT: Fatal - Unexpected Message
- {unsupported_record_type,71}
Мой небольшой код просто увеличивает счетчик.