首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Erlang:使用SSL的inets httpd

Erlang:使用SSL的inets httpd
EN

Stack Overflow用户
提问于 2014-03-28 17:08:19
回答 2查看 828关注 0票数 2

这是愚蠢可笑的,这是多么困难的设置。我已经试了3天了。我在互联网和这个网站上寻找帮助,但是什么都没有用。

我想要的在概念上很简单。我想要一个带有ssl的inets httpd服务器。让服务器启动并运行是没有问题的...不管怎样,都不是ssl。当添加ssl时,它就不起作用了。

不要问是什么错误,有多个错误,它们会根据我对配置所做的更改而变化。这主要是浏览器错误导致证书不允许这样或那样做,或者如果进行了更改,erlang shell中会出现一系列错误和进程崩溃。

我只想知道1)我需要什么ssl证书,2)它们需要什么格式,3)在httpd服务器端,我到底需要什么ssl配置选项。

没有类似Apache的配置或配置文件。我想要以编程方式完成此操作的配置选项。

如果有人能帮上忙,我洗耳恭听。

EN

回答 2

Stack Overflow用户

发布于 2014-03-29 04:02:45

使用Erlang R16B03时,我可以使用以下设置:

代码语言:javascript
复制
-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)文件:

代码语言:javascript
复制
$ 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应该是可访问的。

票数 3
EN

Stack Overflow用户

发布于 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

代码语言:javascript
复制
-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并添加了模块部分后,它就可以工作了:

代码语言:javascript
复制
{modules,[mod_esi,ssl,crypto]}

在那之后,我收到了一些来自服务器的TLS通知报告,它在Windows中似乎不起作用的原因是:

代码语言:javascript
复制
TLS server: In state hello at tls_record.erl:539 generated SERVER ALERT: Fatal - Unexpected Message
 - {unsupported_record_type,71}

我的小代码只是增加了一个计数器。

编辑:

代码语言:javascript
复制
ssl:cipher_suites(all,'tlsv1.3).

将使得可以通过get浏览器执行get命令,它似乎默认为旧的tls版本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22708340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档