我一直在尝试连接到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
那么,如何使这种连接起作用?
答案 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 。它具有以下属性:
下载时,它采用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找到它。它是具有属性的那个:
<强> 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。