[Erlang]怎样在Erlang中使用SSL

Posted wgwyanfs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Erlang]怎样在Erlang中使用SSL相关的知识,希望对你有一定的参考价值。

原创文章,转载请注明出处:server非业余研究http://blog.csdn.net/erlib 作者Sunface


   近期准备写一个SSLserver,结果发现网上相关的资料非常少,由于特地在此给大家分享一下SSL的基本用法.

SSL在使用上跟Tcp非常像,可是也由差别。

首先须要一个SSL证书。能够在參考这篇文章创建。

以下的代码实现了服务端和客户端。对于有经验erlang同学,应该非常easy理解了,就不赘述了。


server端

  1. -module(s).
  2. -export([start/0, client/1, accept/1]).

  3. start() ->
  4.    ssl:start(),
  5.    server(4000).

  6. server(Port) ->
  7.     {ok, LSocket} = ssl:listen(Port, [{certfile,"certificate.pem"}, {keyfile, "key.pem"}, {reuseaddr, true}, {active, false}]),
  8.     spawn(fun() -> accept(LSocket) end).
  9.    
  10. accept(LSocket) ->
  11.    {ok, Socket} = ssl:transport_accept(LSocket),
  12.    Pid = spawn(fun() ->
  13.         io:format("Connection accepted ~p~n", [Socket]),
  14.         loop(Socket)
  15.    end),
  16.    ssl:controlling_process(Socket, Pid),
  17.    accept(LSocket).

  18. loop(Socket) ->
  19.    ssl:setopts(Socket, [{active, once}]),
  20.    receive
  21.    {ssl,Sock, Data} ->
  22.         io:format("Got packet: ~p~n", [Data]),
  23.         ssl:send(Sock, Data),
  24.         loop(Socket);
  25.    {ssl_closed, Sock} ->
  26.         io:format("Closing socket: ~p~n", [Sock]);
  27.    Error ->
  28.         io:format("Error on socket: ~p~n", [Error])
  29.    end.

客户端:

  1. client(N) ->
  2.     {ok, Socket} = ssl:connect("localhost", 4000,  []),
  3.     io:format("Client opened socket: ~p~n",[Socket]),
  4.     ok = ssl:send(Socket, N),
  5.     Value = receive
  6.             {ssl,{sslsocket,new_ssl,_}, Data} ->
  7.                 io:format("Client received: ~p~n",[Data])
  8.             after 2000 ->
  9.                 0
  10.             end,
  11.     ssl:close(Socket),
  12.     Value.


  1. $ erl
  2. Eshell V5.8.5  (abort with ^G)
  3. 1> c(s).
  4. {ok,s}
  5. 2> s:start().
  6. <0.52.0>
  7. Connection accepted {sslsocket,new_ssl,<0.54.0>}
  8. Got packet: "Hello"
  9. Closing socket: {sslsocket,new_ssl,<0.54.0>}

别忘了在客户端进程启动ssl服务

  1. $ erl
  2. Eshell V5.8.5  (abort with ^G)
  3. 1> ssl:start().
  4. ok
  5. 2> s:client("Hello").
  6. Client opened socket: {sslsocket,new_ssl,<0.49.0>}
  7. Client received: "Hello"
  8. ok


由于是SSL。所以须要安全验证:

1.option中得 verify设置,验证peer(对端)的合法性

  • 0 - 不验证
  • 1 -  验证 
  • 2 - 验证。同一时候peer假设没有证书,验证失败
2.depth验证,此选项指定了同意验证几个证书,同意值0-N
  • 0 - 仅仅验证peer证书
  • 1 -  验证CA证书
  • 2 - 验证多本CA证书




以上是关于[Erlang]怎样在Erlang中使用SSL的主要内容,如果未能解决你的问题,请参考以下文章

配置 Erlang 以使用 SSL

Erlang 接受 SSL 连接真的很慢(与 C++ 相比)

Elixir/Erlang: :ssl.start 在使用 :reuseaddr, true 在不同的 IP 上启动时返回 :error, :already_listening

寻找一个简单的 ssl erlang 示例

使用 Erlang 进行 https 帖子的简单示例

Erlang SSL TCP 服务器和垃圾收集