3

我一直在尝试连接到 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

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

4

2 回答 2

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.localdomain127.0.0.1.


编辑:对于这个问题:

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

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

您需要返回问题的第 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。您还需要一个名为TERENA SSL High Assurance CA 3的中间产品

DigiCert 高保证 EV 根 CA 证书

您可以从DigiCert Trusted Root Authority Certificates下载DigiCert High Assurance EV Root 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)(如果我没记错的话)。

于 2016-03-02T22:26:22.867 回答
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 配置是根据VMWare 的文档

于 2019-04-12T12:58:41.793 回答