RHEL7上的RabbitMQ服务器重置SSL连接

时间:2016-03-01 10:56:51

标签: openssl rabbitmq rhel7

我一直在尝试连接到RHEL7上的RabbitMQ服务器,该服务器侦听5671端口以进行SSL连接。

RabbitMQ server's SSL listener has been configured like this:
[
  {rabbit, [
     {ssl_listeners, [5671]},
     {ssl_options, [{cacertfile,"/etc/pki/tls/certs/samqp.dcu.ie.chain"},
                {certfile,"/etc/pki/tls/certs/samqp.dcu.ie.crt"},
                {keyfile,"/etc/pki/tls/private/samqp.dcu.ie.key"},
                {verify,verify_peer},
                {fail_if_no_peer_cert,false}]}
   ]}
]

在客户端,我收到此异常消息:

客户端计算机是Ubuntu 14.04 LTS。

客户端是一个Moodle自定义插件,使用'videlalvaro / php-amqplib'库与服务器进行通信。

以下是根据以下文档创建的自签名证书的实际路径和文件名:https://www.rabbitmq.com/ssl.html

$sslOptions = array(
            'cafile' => '/home/duro/testca/cacert.pem',
            'local_cert' => '/home/duro/client/key-cert.pem',
            'peer_name'=>'samqp.dcu.ie',
            'verify_peer_name' => true
            );

PHP显然需要使用连接到一个文件的证书和密钥,因此需要'key-cert.pem'。

这是我从客户端连接的方式,包括实际网址:

$connection = new AMQPSSLConnection('samqp.dcu.ie.crt', 5671, 'rMQUsername', 'rMQPasswd', '/', $sslOptions)

在客户端,我收到此异常消息:

"stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed" 

在服务器端,查看/var/log/rabbitmq/rabbit@sphinx.log,我看到了这个错误:

=ERROR REPORT==== 3-Mar-2016::14:08:26 ===
SSL: certify: ssl_alert.erl:93:Fatal error: unknown ca

那么,如何使这种连接起作用?

2 个答案:

答案 0 :(得分:1)

  

...错误:14090086:SSL例程:ssl3_get_server_certificate:证书验证失败“

您正在使用名称 sphinx.dcu.ie 连接到服务器:

$connection = new AMQPSSLConnection('sphinx.dcu.ie', 5671, ...)

但是,证书中的主机名为 samqp.dcu.ie

X509v3 Subject Alternative Name: 
    DNS:samqp.dcu.ie

你需要做两件事之一。首先,针对证书中指定的服务器发出RabbitMQ请求。或者第二,获取一个使用您要使用的DNS名称颁发的新证书。

您可以在主题备用名称(SAN)中放置任意数量的DNS名称。我经常用调试和测试名称填写它们,例如 localhost localhost.localdomain 127.0.0.1

编辑 :对于此问题:

  

...服务器的日志现在说:

=ERROR REPORT==== 3-Mar-2016::09:52:41 ===
SSL: certify: ssl_handshake.erl:1490:Fatal error: unknown ca

您需要返回问题Revision 9左右的信息以及此信息:

depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert  High Assurance EV Root CA
verify return:1
depth=1 C = NL, ST = Noord-Holland, L = Amsterdam, O = TERENA, CN =   TERENA SSL High Assurance CA 3
verify return:1
depth=0 businessCategory = Government Entity, jurisdictionC = IE,   serialNumber = Government Entity, street = Glasnevin, street = Dublin City   University, postalCode = IE, C = IE, ST = Ireland, L = Dublin, O = Dublin  City University, OU = ISS, CN = samqp.dcu.ie
verify return:1

需要ca-cert.pem文件,其中包含数百个CA,其中大多数是错误的。您只需要一个正确的CA,以及曾经称为 DigiCert High Assurance EV Root CA 的CA.您还需要一个名为 TERENA SSL High Assurance CA 3

的中间版本

DigiCert高保证EV根CA 证书

您可以从DigiCert Trusted Root Authority Certificates下载 DigiCert High Assurance EV根CA 。它具有以下属性:

  • 序列号:02:AC:5C:26:6A:0B:40:9B:8F:0B:79:F2:AE:46:25:77
  • 指纹:5FB7EE0633E259DBAD0C4C9AE6D38F1A61C7DC25

下载时,它采用DER格式。您需要将其转换为PEM格式:

$ openssl x509 -inform der -in DigiCertHighAssuranceEVRootCA.crt \
    -outform PEM -out DigiCertHighAssuranceEVRootCA.pem

然后:

$ cat DigiCertHighAssuranceEVRootCA.pem 
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
...
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
+OkuE6N36B9K
-----END CERTIFICATE-----

TERENA SSL高保证CA 3 证书

现在您需要使用 TERENA SSL High Assurance CA 3 执行相同的操作。我相信你可以在TERENA SSL High Assurance CA Root Certificates找到它。它是具有属性的那个:

  • 序列号0b:5c:34:35:67:5b:24:67:c0:d7:32:37:f9:0d:5f:94
  • 指纹SHA1 A7:8A:AB:DE:7F:5B:77:15:40:D3:33:B5:05:87:4C:82:04:AA:D2:06

<强> MY-CACERT.pem

现在您已拥有路径构建所需的CA,请执行以下操作:

$ cat DigiCertHighAssuranceEVRootCA.pem > my-cacert.pem
$ cat TERENA_SSL_High_Assurance_CA_3.pem >> my-cacert.pem
$ echo "" >> my-cacert.pem

然后:

$ cat my-cacert.pem 
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
...
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
+OkuE6N36B9K
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIE4DCCA8igAwIBAgIQC1w0NWdbJGfA1zI3+Q1flDANBgkqhkiG9w0BAQsFADBs
...
dnnqz5SeAs6cbSm551qG7Dj8+6f/8e33oqLC5Ldnbt0Ou6PjtZ4O02dN9cnicemR
1B0/YQ==
-----END CERTIFICATE-----

最后,使用 my-cacert.pem

您应该能够使用OpenSSL的 s_client 进行测试。但我似乎无法与外界联系:

$ openssl s_client -connect sphinx.dcu.ie:5671 -tls1 \
    -servername sphinx.dcu.ie -CAfile my-cacert.pem 

如果你可以联系,那么你应该得到 Verify Ok (0) (如果我没记错的话)。

答案 1 :(得分:0)

从PHP客户端连接到RabbitMQ服务器时,我遇到了同样的问题。错误是

"stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed"

我按照以下一系列步骤对其进行了调试

使用提供的证书文件确保客户端和服务器正在握手。

在一个终端中,运行以下命令以在8443端口上启动服务器。

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

然后,在另一个终端中,运行以下命令进行连接。

openssl s_client -connect YOUR_SERVER:8443 -key /rabbitmq/client/key.pem -CAfile /rabbitmq/client/key-cert.pem

如果客户端能够连接并且由于超时而没有返回提示,则说明您的连接成功。尝试使用证书/密钥,直到成功建立连接。

  

注意:假定密钥证书是串联文件。

# cd /etc/rabbitmq/client
# cat key.pem cert.pem > key-cert.pem

PHP客户端中的SSL选项

我在PHP数组下面通过了$ssl_options参数。

$ssl_options =  [
                        'cafile' => '/rabbitmq/testca/cacert.pem',
                        'local_cert' => '/rabbitmq/client/key-cert.pem',
                        'verify_peer' => false,
                        'verify_peer_name' => false,
            ];

我的RabbitMQ配置符合docs of VMWare