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

Openssl RHEL7上的RabbitMQ服务器重置SSL连接,openssl,rabbitmq,rhel7,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"}, {cert

我一直在尝试连接到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}]}
   ]}
]
在客户端,我收到以下异常消息:

"stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed" 
客户机是Ubuntu 14.04 LTS

客户端是一个Moodle自定义插件,使用“Videlavaro/php amqplib”库与服务器通信

以下是根据上的文档创建的自签名证书的实际路径和文件名:

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

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

$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
那么,如何使这种连接起作用呢

。。。错误:14090086:SSL例程:ssl3\u获取\u服务器\u证书:证书验证失败”

您正在连接名为sphinx.dcu.ie的服务器:

$connection = new AMQPSSLConnection('sphinx.dcu.ie', 5671, ...)
X509v3 Subject Alternative Name: 
    DNS:samqp.dcu.ie
但是,证书中的主机名是samqp.dcu.ie:

$connection = new AMQPSSLConnection('sphinx.dcu.ie', 5671, ...)
X509v3 Subject Alternative Name: 
    DNS:samqp.dcu.ie
您需要做两件事中的一件。首先,对证书中指定的服务器发出RabbitMQ请求。或者,第二,获得一个使用您要使用的DNS名称的新证书

您可以在Subject Alternate Name(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
您需要返回到您的问题和此信息的信息:

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高保证EV根ca。您还需要中间一个名为TERENA SSL高保证ca 3

DigiCert高保证EV根CA证书

您可以从下载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
然后:

TERENA SSL高保证CA 3证书

现在,您需要对TERENA SSL High Assurance CA 3执行相同的操作。我相信您可以在找到它。它具有以下属性:

  • 序列号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
然后:

最后,使用my cacert.pem


您应该能够使用OpenSSL的
s\u客户端测试东西。但是我似乎无法从外部世界连接:

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

如果您可以连接,那么您应该得到一个
验证Ok(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
如果客户端能够连接,但由于超时而没有返回提示,则表示连接成功。请尝试使用证书/密钥,直到连接成功

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

PHP客户端中的SSL选项

我将下面的PHP数组作为
$ssl\u options
参数传递

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

我的RabbitMQ配置符合。

请发布用于连接到服务器的确切URL,并发布
openssl s_客户端-connect:-tls1-servername | openssl x509-text-noout
的输出。通过单击编辑将其添加到问题中(不要将其作为注释发布)。否则,我们无法复制它,并且没有足够的信息来帮助解决问题。我在$connection实例化代码中提供了实际的URL。我还发布了命令输出,并将文件名和路径更新为真实的。谢谢@Djuro。很容易用信息进行诊断。我希望每个人都提供它。如果这就是你的意思。我通过从$sslOptions中删除“cafile”和“local_cert”解决了这个问题,我保留了“peer_name”和“verify_peer_name”。消息会被发送,日志条目看起来不错。你能这样修改你的答案吗?或者添加一个新的答案,我会接受。这有意义吗?@djuromandic-我试图解决你遇到的其他问题。我可以不要从外部世界连接到sphinx.dcu.ie:5671,所以我不知道它是否完全正确。它暂时不应该接受外部连接。我可以确认服务器在5671端口上通过SSL侦听器接受连接,并且正在接收消息。日志文件显示:
=INFO REPORT==3-Mar-2016:14:48:14==接受AMQP连接(136.206.4.190:23456->136.206.1.29:5671)
=信息报告===2016年3月3日::14:48:14==关闭AMQP连接(136.206.4.190:23456->136.206.1.29:5671)
$ssl_options =  [
                        'cafile' => '/rabbitmq/testca/cacert.pem',
                        'local_cert' => '/rabbitmq/client/key-cert.pem',
                        'verify_peer' => false,
                        'verify_peer_name' => false,
            ];