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




  • 相关阅读:
    [Java解惑]数值表达式
    Java使用LdAP获取AD域用户
    LDAP Error Codes
    Excel向上取整
    java中的三种取整函数
    Dwz手册的补充说明和常见问题
    【转】BSON数据格式
    go语言合并两个数组
    vscode远程修改文件('file': A system error occured )
    [转]Linux 桌面玩家指南:20. 把 Linux 系统装入 U 盘打包带走
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6745206.html
Copyright © 2020-2023  润新知