原创文章,转载请注明出处:server非业余研究http://blog.csdn.net/erlib 做者Sunfaceshell
近期准备写一个SSLserver,结果发现网上相关的资料很是少,因为特意在此给你们分享一下SSL的基本用法.安全
SSL在使用上跟Tcp很是像,但是也由差异。socket
首先需要一个SSL证书。可以在參考这篇文章建立。ide
如下的代码实现了服务端和客户端。对于有经验erlang同窗,应该很是easy理解了,就不赘述了。oop
server端spa
- -module(s).
- -export([start/0, client/1, accept/1]).
- start() ->
- ssl:start(),
- server(4000).
- server(Port) ->
- {ok, LSocket} = ssl:listen(Port, [{certfile,"certificate.pem"}, {keyfile, "key.pem"}, {reuseaddr, true}, {active, false}]),
- spawn(fun() -> accept(LSocket) end).
-
- accept(LSocket) ->
- {ok, Socket} = ssl:transport_accept(LSocket),
- Pid = spawn(fun() ->
- io:format("Connection accepted ~p~n", [Socket]),
- loop(Socket)
- end),
- ssl:controlling_process(Socket, Pid),
- accept(LSocket).
- loop(Socket) ->
- ssl:setopts(Socket, [{active, once}]),
- receive
- {ssl,Sock, Data} ->
- io:format("Got packet: ~p~n", [Data]),
- ssl:send(Sock, Data),
- loop(Socket);
- {ssl_closed, Sock} ->
- io:format("Closing socket: ~p~n", [Sock]);
- Error ->
- io:format("Error on socket: ~p~n", [Error])
- end.
客户端:.net
- client(N) ->
- {ok, Socket} = ssl:connect("localhost", 4000, []),
- io:format("Client opened socket: ~p~n",[Socket]),
- ok = ssl:send(Socket, N),
- Value = receive
- {ssl,{sslsocket,new_ssl,_}, Data} ->
- io:format("Client received: ~p~n",[Data])
- after 2000 ->
- 0
- end,
- ssl:close(Socket),
- Value.
- $ erl
- Eshell V5.8.5 (abort with ^G)
- 1> c(s).
- {ok,s}
- 2> s:start().
- <0.52.0>
- Connection accepted {sslsocket,new_ssl,<0.54.0>}
- Got packet: "Hello"
- Closing socket: {sslsocket,new_ssl,<0.54.0>}
别忘了在客户端进程启动ssl服务orm
- $ erl
- Eshell V5.8.5 (abort with ^G)
- 1> ssl:start().
- ok
- 2> s:client("Hello").
- Client opened socket: {sslsocket,new_ssl,<0.49.0>}
- Client received: "Hello"
- ok
因为是SSL。因此需要安全验证:server
1.option中得 verify设置,验证peer(对端)的合法性blog
- 0 - 不验证
- 1 - 验证
- 2 - 验证。同一时候peer假设没有证书,验证失败
2.depth验证,此选项指定了赞成验证几个证书,赞成值0-N
- 0 - 仅仅验证peer证书
- 1 - 验证CA证书
- 2 - 验证多本CA证书