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