[Erlang]如何在Erlang中使用SSL

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


   最近准备写一个SSL服务器,结果发现网上相关的资料很少,因为特地在此给大家分享一下SSL的基本使用方法.

SSL在使用上跟Tcp很像,但是也由区别。首先需要一个SSL证书,可以在参考这篇文章创建。

下面的代码实现了服务端和客户端,对于有经验erlang同学,应该很容易理解了,就不赘述了。


服务器端

 
 
  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证书




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值