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}

Мой небольшой код просто увеличивает счетчик.

Другие вопросы по тегам