3.使用SSL API | 3. Using SSL API
3使用SSL API
要查看ssl的相关版本信息,请调用ssl:versions/0
。
要查看所有支持的密码套件,请调用ssl:cipher_suites(all)
。可用的连接密码套件取决于您的证书。也可以指定希望连接使用的特定密码套件。默认是使用最强的可用。
3.1建立连接
本节展示了如何使用Erlangshell设置客户机/服务器连接的一个小示例。的返回值。sslsocket
缩写为[...]
因为它可以相当大而且不透明。
极小例子
注
最小设置不是SSL最安全的设置。
若要设置客户端/服务器连接,请执行以下操作:
步骤1:
启动服务器端:
1 server> ssl:start().
ok
步骤2:
创建SSL侦听套接字:
2 server> {ok, ListenSocket} =
ssl:listen(9999, [{certfile, "cert.pem"}, {keyfile, "key.pem"},{reuseaddr, true}]).
{ok,{sslsocket, [...]}}
步骤3:
在SSL侦听套接字上进行传输接受:
3 server> {ok, Socket} = ssl:transport_accept(ListenSocket).
{ok,{sslsocket, [...]}}
步骤4:
启动客户端:
1 client> ssl:start().
ok
2 client> {ok, Socket} = ssl:connect("localhost", 9999, [], infinity).
{ok,{sslsocket, [...]}}
步骤5:
进行SSL握手:
4 server> ok = ssl:ssl_accept(Socket).
ok
步骤6:
通过SSL发送消息:
5 server> ssl:send(Socket, "foo").
ok
步骤7:
刷新shell消息队列,以查看消息是在服务器端发送的:
3 client> flush().
Shell got {ssl,{sslsocket,[...]},"foo"}
ok
升级示例
注
要将TCP/IP连接升级到SSL连接,客户端和服务器必须同意这样做。协议可以通过使用协议来实现,例如,RFC 2817中指定的HTTP所使用的协议。
若要升级到SSL连接,请执行以下操作:
步骤1:
启动服务器端:
1 server> ssl:start().
ok
步骤2:
创建一个正常的TCP侦听套接字:
2 server> {ok, ListenSocket} = gen_tcp:listen(9999, [{reuseaddr, true}]).
{ok, #Port<0.475>}
步骤3:
接受客户端连接:
3 server> {ok, Socket} = gen_tcp:accept(ListenSocket).
{ok, #Port<0.476>}
步骤4:
启动客户端:
1 client> ssl:start().
ok
2 client> {ok, Socket} = gen_tcp:connect("localhost", 9999, [], infinity).
步骤5:
确保active
设置为false
在尝试升级到SSL连接之前,否则SSL握手消息可能传递到错误的进程:
4 server> inet:setopts(Socket, [{active, false}]).
ok
步骤6:
进行SSL握手:
5 server> {ok, SSLSocket} = ssl:ssl_accept(Socket, [{cacertfile, "cacerts.pem"},
{certfile, "cert.pem"}, {keyfile, "key.pem"}]).
{ok,{sslsocket,[...]}}
步骤7:
升级到SSL连接。 客户端和服务器必须同意升级。 在客户端调用ssl:connect/3之前,服务器必须调用ssl:ssl_accept/2。
3 client>{ok, SSLSocket} = ssl:connect(Socket, [{cacertfile, "cacerts.pem"},
{certfile, "cert.pem"}, {keyfile, "key.pem"}], infinity).
{ok,{sslsocket,[...]}}
步骤8:
通过SSL发送消息:
4 client> ssl:send(SSLSocket, "foo").
ok
步骤9:
集active true
在SSL套接字上:
4 server> ssl:setopts(SSLSocket, [{active, true}]).
ok
步骤10:
刷新shell消息队列,以查看消息是在客户端发送的:
5 server> flush().
Shell got {ssl,{sslsocket,[...]},"foo"}
ok