Openssl RHEL7上的RabbitMQ服务器重置SSL连接
我一直在尝试连接到RHEL7上的RabbitMQ服务器,该服务器侦听5671端口进行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
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
$ 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
$ 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,
];