这是愚蠢可笑的,这是多么困难的设置。我已经试了3天了。我在互联网和这个网站上寻找帮助,但是什么都没有用。
我想要的在概念上很简单。我想要一个带有ssl的inets httpd服务器。让服务器启动并运行是没有问题的...不管怎样,都不是ssl。当添加ssl时,它就不起作用了。
不要问是什么错误,有多个错误,它们会根据我对配置所做的更改而变化。这主要是浏览器错误导致证书不允许这样或那样做,或者如果进行了更改,erlang shell中会出现一系列错误和进程崩溃。
我只想知道1)我需要什么ssl证书,2)它们需要什么格式,3)在httpd服务器端,我到底需要什么ssl配置选项。
没有类似Apache的配置或配置文件。我想要以编程方式完成此操作的配置选项。
如果有人能帮上忙,我洗耳恭听。
发布于 2014-03-29 04:02:45
使用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
假设document_root中存在index.html文件,则url https://localhost:22443/index.html应该是可访问的。
发布于 2021-02-22 21:54:07
这对我使用linux OTP release 22和windows OTP release 23有效:
https://127.0.0.1:9999/db/api:get
当然,我的证书没有签名(我不得不在火狐中添加一个例外),而且在windows中,我的连接似乎刚刚被重置。
然而,curl在这两种情况下都有效,它设法建立了一个连接
curl -v -k
-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).将使得可以通过get浏览器执行get命令,它似乎默认为旧的tls版本。
https://stackoverflow.com/questions/22708340
复制相似问题