TLS/SSL Troubleshooting(翻译)

简介

  本文收集了一些信息,以帮助排查 SSL 错误。故障识别的策略是使用其它 SSL 实现来测试相关组件。

  请记住,如果两个指定的组件之间存在相互影响,从而导致了该问题,那么这种方法不能够保证能够识别出该问题。

  我们还介绍了一些你可能在日志中看见的常见错误消息

检查 Erlang 是否支持 SSL

  建立到 broker 的 SSL 连接的第一个需求就是,broker 支持 SSL。通过运行 erl shell 并输入如下内容,确保 Erlang VM 支持 SSL。

ssl:versions().

  上面命令的输出类似于下面的样子(版本号可能有所不同):

[{ssl_app,"5.3.6"},
 {supported,['tlsv1.2','tlsv1.1',tlsv1]},
 {available,['tlsv1.2','tlsv1.1',tlsv1]}]

  如果你运行命令后得到了一个错误,请确保 Erlang 构建的时候使用了 OpenSSL。在基于 Debian 系统上,你可以需要安装 erlang-ssl package。

使用 OpenSSL 检验秘钥和证书

  我们现在将使用另一个 SSL 实现来验证配置文件中指定的证书和秘钥。这个例子使用了 OpenSSL s_clients_server。我们将确保使用的证书和秘钥能够在两个终端之间建立安全的链接。对于下面的例子,我们假设你具有以下内容:

Item                                             Location                                                   
CA certificatetestca/cacert.pem
Server certificateserver/cert.pem
Server keyserver/key.pem
Client certificateclient/cert.pem
Client keyclient/key.pem

  在一个终端窗口执行如下指令:

openssl s_server -accept 8443 -cert server/cert.pem -key server/key.pem -CAfile testca/cacert.pem

  在另一个终端窗口执行:

openssl s_client -connect localhost:8443 -cert client/cert.pem -key client/key.pem -CAfile testca/cacert.pem

  如果证书和秘钥已经被正确创建,一条 SSL 链序列将出现,同时这两个终端将会被相互连接。在一个终端中输入,将会出现在另一个终端上。如果受信任链接建立,第二个终端将出现如下信息:

Verify return code: 0 (ok)
If you receive an error, confirm that the certificates and keys were generated correctly.

检查 broker 是否正在监听

  该步骤是检查 broker 是否正在我们期望的 AMQPS 端口上进行监听。当你使用一个可用的 SSL 配置文件启动 broker 后,在 logfile 中,这个 broker 将打印出 SSL 监听的地址。你可能看到类似于以下的信息:

=INFO REPORT==== 8-Aug-2011::11:51:47 ===
started SSL Listener on 0.0.0.0:5671

  如果你的配置文件中包含 ssl_listeners 配置指令,但是你并没有看见这条信息,最有可能的情况就是 broker 没有读取到你的配置文件。确保被 broker 引用的配置文件包含 SSL 配置选项。

尝试和 broker 进行 SSL 连接

  一旦,你的 rabbitmq broker 在 SSL 端口上进行监听,你可以使用 OpenSSL s_client 检查 SSL 连接,这次是针对于 broker。这样检测可以证实 broker 是否配置正确,而不必配置 AMQPS client。下面的例子假设 broker 设置了 ssl_listeners 选项,并在本地上监听 SSL 连接的 5672 端口。

openssl s_client -connect localhost:5671 -cert client/cert.pem -key client/key.pem -CAfile testca/cacert.pem

  输出类似于使用 8443 端口的情况。当这个连接建立时,broker 的日志文件中应该包含一如下条目。

=INFO REPORT==== 8-Aug-2011::11:55:13 ===
accepting AMQP connection <0.223.0> (127.0.0.1:58954 -> 127.0.0.1:5671)

  现在应该可通过 SSL 链接向 broker 提供 AMQP 连接建立序列。如果你向 broker 提供 8 个随机字节,broker 将在被编码版本号后紧跟 "AMQP" 字符串作为响应。如果你能够识别 “AMQP” 字符串,你可以确信你已经连接到 AMQP broker。

使用 stunnel 验证 client 连接

  最终的检查是验证 AMQPS clients。我们将使用 stunnel 来提供 SSL 能力。在此配置文件中,AMQPS clients 将建立一条到 stunnel 的安全连接,它将传递解密后的数据给 broker 的 AMQP 端口。这提供了一些信心,因为独立于 broker 的 SSL 配置,客户端的 SSL 配置是正确的。 

  stunnel 将以守护进程的方式运行与 broker 相同的主机上。在下面的讨论中,假设 stunnel 将仅被临时使用。当然,也可以永久地使用 stunnel 提供 SSL 能力,但是随着 broker 集成的缺乏,这将意味着管理报告能力和使用 SSL 信息的认证插件将不能够这样工作。

  在下面的例子中,stunnel 将连接到 broker 的非加密 AMQP 端口(5672),并且在端口 5679 接受 SSL-capable client 的 AMQPS 链接。

cat client/key.pem client/cert.pem > client/key-cert.pem
stunnel -r localhost:5672 -d 5679 -f -p client/key-cert.pem -D 7

  stunnel 需要证书和相应的秘钥。使用生产的客户端证书和相应的秘钥,并且应该紧跟在如上的 cat 命令之后。Stunnel 需要不受密码保护的秘钥。

  SSL-capable clients 现在应该能够连接上 5679 端口了,当启动 stunnel 后,任何 SSL 错误将出现在控制台上。

连接 client 和 broker

  如果前面的步骤没有发生任何错误,那么你可以自信地将 tested AMQPS client 连接到 broker 的 AMQPS 端口,请先确保已经停止了任何正在运行的 OpenSSL 或者 stunnel sessions。

证书链和验证深度

  当使用中间 CA 签名的 client 证书时,为了使用更高的验证深度,可能需要配置 RabbitMQ server。验证深度是指,在有效证书路径下,遵循 peer 证书的非自颁发中间证书的最大数目。

  参考 TLS/SSL 指南了解如何配置验证深度.

理解 TLS 连接日志错误

  在前面的很多步骤中,都将生成新的 broker 日志文件条目。这些条目和在控制台上执行命名后的动态输出将有助于确定与 TLS 相关的错误原因。以下是最常见的错误条目列表:

{undef, [{crypto,hash,...

  在使用的 Erlang/OTP 中没有安装加密模块,或者加密模块以及过期了。在 Debian、Ubuntu 和其它 Debian 派生出的分布式操作系统中,上面的错误通常意味着没有安装 erlang-ssl package。

{ssl_upgrade_error, ekeyfile} or {ssl_upgrade_error, ecertfile}

  这意味着 broker 秘钥文件或者证书文件不可用。请确认秘钥文件和证书相匹配,并且都是 PEM 格式。利用可识别的分隔符,PEM 格式是可一种可打印编码。(PEM 实质上是 Base64 编码的二进制内容,再加上开始和结束行)。证书以 -----BEGIN CERTIFICATE----- 开始,以 -----END CERTIFICATE----- 结束。秘钥文件类似地以 -----BEGIN RSA PRIVATE KEY----- 作为开始行,以 -----END RSA PRIVATE KEY----- 作为结束行。

{ssl_upgrade_failure, ... certify ...}

  此错误与客户端验证有关。client 提供了无效的证书或者没有提供证书。如果 ssl_options 设置 verify 选项为 verify_peer,请临时尝试使用 verify_none 作为 verify 的值。请确保 client 证书已经正确生成,并且 client 提供了正确的证书。

{ssl_upgrade_error, ...}

  这是一个容易出现的错误,造成这种错误的原因有很多。请确保你使用了我们推荐的 Erlang 版本。

{tls_alert,"bad record mac"}

  server 已经尝试验证其收到的一条数据的完整性,但是检查失败了。这可能是由于网络设置、unintentional socket sharing in the client (e.g. due to the use of fork(2))或者 TLS client 的 bug 导致的问题。

  http://www.cnblogs.com/pengsir

转载于:https://www.cnblogs.com/pengsir/p/6497650.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值