这对我使用 linux OTP 版本 22 和 Windows OTP 版本 23 有效:
https://127.0.0.1:9999/db/api:get
当然,我的证书没有签名(必须在 Firefox 中添加一个例外),在 Windows 中,我的连接似乎刚刚被重置。
然而 curl 对这两种情况都有效,它设法建立了连接
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}
我的小代码只是增加一个计数器。
编辑:
ssl:cipher_suites(all,'tlsv1.3).
将使通过网络浏览器获取命令成为可能,似乎它默认为旧的 tls 版本。