首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

4.使用SSL进行Erlang分发 | 4. Using SSL for Erlang Distribution

本节描述Erlang发行版如何使用SSL来获得额外的验证和安全性。

理论上Erlang分布几乎可以使用任何基于连接的协议作为承载。但是,需要实现连接设置的协议特定部分的模块。默认的分发模块inet_tcp_dist位于内核应用程序中。当分布式Erlang节点启动时,net_kernel使用此模块来设置侦听端口和连接。

在SSL应用程序中,一个额外的分发模块,inet_tls_dist,可以作为一种替代方法。所有分发连接都将使用SSL,分布式系统中所有参与的Erlang节点都必须使用此分发模块。

安全级别取决于为SSL连接设置提供的参数。然而,Erlang节点cookie总是被使用,因为它们可以用于区分两个不同的Erlang网络。

若要在SSL上设置Erlang发行版,请执行以下操作:

  • 步骤1:构建引导脚本,包括SSL应用程序。
  • 步骤2:指定分配模块net_kernel
  • 步骤3:指定安全选项和其他SSL选项。
  • 步骤4:设置环境以始终使用SSL。

以下各节将描述这些步骤。

4.1构建引导脚本,包括ssl应用程序

引导脚本是使用systoolsSASL应用程序中的实用程序构建的。有关更多信息systools,请参阅SASL文档。这只是可以做什么的一个例子。

最简单的引导脚本可能只包括内核和STDLIB应用程序。这样的脚本位于binErlang发行版的目录中。该脚本的源代码位于Erlang安装顶部目录下releases/<OTP version>/start_clean.rel

做以下工作:

  • 将该脚本复制到另一个位置(最好是另一个名称)。
  • 在STDLIB应用程序之后添加应用程序密码、公钥和SSL及其当前版本号。

下面是一个示例.rel添加SSL的文件:

代码语言:javascript
复制
{release, {"OTP  APN 181 01","R15A"}, {erts, "5.9"},
[{kernel,"2.15"},
{stdlib,"1.18"},
{crypto, "2.0.3"},
{public_key, "0.12"},
{asn1, "4.0"},
{ssl, "5.0"}
]}.
   

系统中的版本号不同。每当升级脚本中包含的应用程序之一时,请更改脚本。

做以下工作:

  • 构建启动脚本。假设该.rel file文件存储在start_ssl.rel当前目录的文件中,则可以按如下方式构建引导脚本:1> systools:make_script(“start_ssl”,[])。现在start_ssl.boot目录中有一个文件。请执行以下操作:
  • 测试启动脚本。为此,请使用-boot指定此引导脚本的命令行参数(使用完整路径,但没有.boot后缀)启动Erlang 。在UNIX中,它可以如下所示:
代码语言:javascript
复制
$ erl -boot /home/me/ssl/start_ssl
Erlang (BEAM) emulator version 5.0
 
Eshell V5.0  (abort with ^G)
1> whereis(ssl_manager).
<0.41.0>    

whereis函数调用验证SSL应用程序已启动。

作为构建启动脚本的替代方法,您可以ebin在命令行上明确添加SSL 目录的路径。这是通过命令行选项完成的-pa。由于SSL应用程序的克隆被挂钩到内核应用程序中,因此不需要启动SSL应用程序来启动分发。所以,只要可以到达SSL应用程序代码,分配就会开始。该-pa方法仅建议用于测试目的。

SSL应用程序的克隆必须在需要设置分发的早期引导阶段中使用SSL代码。但是,这使软件无法升级SSL应用程序。

4.2指定网络内核分发模块

用于SSL的分发模块已命名,inet_tls_dist并在命令行上使用选项指定-proto_dist。参数-proto_dist是没有后缀的模块名称_dist。所以,这个分配模块是-proto_dist inet_tls在命令行中指定的。

扩展命令行提供了以下内容:

代码语言:javascript
复制
$ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls    

对于要启动的发行版,也要给模拟器一个名称:

代码语言:javascript
复制
$ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls -sname ssl_test
Erlang (BEAM) emulator version 5.0 [source]
 
Eshell V5.0  (abort with ^G)
(ssl_test@myhost)1>     

然而,以这种方式启动的节点拒绝与其他节点通话,因为没有提供SSL参数(请参阅下一节)。

4.3指定ssl选项

要使SSL工作,必须为服务器端指定至少一个公钥和证书。在下面的示例中,PEM-文件由两个条目组成,即服务器证书及其私钥。

erl命令行,您可以指定SSL发行版在创建套接字时添加的选项。

可以通过添加前缀来指定以下列表中最简单的SSL选项server_client_到选项名:

  • certfile
  • keyfile
  • password
  • cacertfile
  • verify
  • verify_fun(写为{Module, Function, InitialUserState}
  • crl_check
  • crl_cache (写成Erlang术语)
  • reuse_sessions
  • secure_renegotiate
  • depth
  • hibernate_after
  • ciphers (使用旧的字符串格式)

请注意verify_fun,由于在命令行上不接受funs ,因此需要使用与相应的SSL选项不同的格式书写。

服务器也可以接受以下选项dhfilefail_if_no_peer_cert%28也以%29为前缀。

client_-prefixed选项用于分发启动到另一个节点的连接。server_-prefixed选项用于接受来自远程节点的连接。

原始套接字选项,例如packetsize不能在命令行中指定。

用于指定SSL选项的命令行参数已命名-ssl_dist_opt,随后是SSL选项对及其值。论据-ssl_dist_opt可以重复任意次数。

一个示例命令行现在可以如下所示(命令中的换行符是为了便于阅读,并且在输入时不在那里):

代码语言:javascript
复制
$ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls
  -ssl_dist_opt server_certfile "/home/me/ssl/erlserver.pem" 
  -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true
  -sname ssl_test
Erlang (BEAM) emulator version 5.0 [source]
 
Eshell V5.0  (abort with ^G)
(ssl_test@myhost)1>     

以这种方式启动的节点是完全功能的,使用SSL作为分发协议。

4.4设置环境以始终使用ssl

为Erlang指定参数的一种方便方法是使用环境变量。ERL_FLAGS使用SSL发行版所需的所有标志都可以在该变量中指定,然后被解释为Erlang所有后续调用的命令行参数。

在Unix(Bourne)shell中,它可以如下所示(换行符是为了便于阅读,当输入时它们不在那里):

代码语言:javascript
复制
$ ERL_FLAGS="-boot /home/me/ssl/start_ssl -proto_dist inet_tls
  -ssl_dist_opt server_certfile /home/me/ssl/erlserver.pem
  -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true"
$ export ERL_FLAGS
$ erl -sname ssl_test
Erlang (BEAM) emulator version 5.0 [source]
 
Eshell V5.0  (abort with ^G)
(ssl_test@myhost)1> init:get_arguments().
[{root,["/usr/local/erlang"]},
 {progname,["erl "]},
 {sname,["ssl_test"]},
 {boot,["/home/me/ssl/start_ssl"]},
 {proto_dist,["inet_tls"]},
 {ssl_dist_opt,["server_certfile","/home/me/ssl/erlserver.pem"]},
 {ssl_dist_opt,["server_secure_renegotiate","true",
                "client_secure_renegotiate","true"]
 {home,["/home/me"]}]    

init:get_arguments()调用将验证是否向仿真器提供了正确的参数。

4.5在IPv 6上使用ssl分发

可以使用IPv6而不是IPv4使用SSL分发。要做到这一点,请传递选项,-proto_dist inet6_tls而不是-proto_dist inet_tls在命令行或ERL_FLAGS环境变量中启动Erlang 。

使用此选项的示例命令行如下所示:

代码语言:javascript
复制
$ erl -boot /home/me/ssl/start_ssl -proto_dist inet6_tls
  -ssl_dist_opt server_certfile "/home/me/ssl/erlserver.pem"
  -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true
  -sname ssl_test
Erlang (BEAM) emulator version 5.0 [source]

Eshell V5.0  (abort with ^G)
(ssl_test@myhost)1>     

以这种方式启动的节点只能通过IPv 6使用SSL分发与其他节点通信。

扫码关注腾讯云开发者

领取腾讯云代金券