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

问题描述:

我一直试图连接到RHEL7上的RabbitMQ服务器,该服务器监听5671端口进行SSL连接。RHEL7上的RabbitMQ服务器重置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的LTS 14.04。

客户端是使用'videlalvaro/php-amqplib'库与服务器通信的Moodle定制插件。

下面是根据上创建的文档我的自签名证书的实际路径和文件名: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显然必须使用证书和密钥连接起来以一个文件的要求,因此“键 - 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/[email protected],我看到这个错误:

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

那么,如何使这个连接工作?

+1

请张贴您用于连接服务器的确切URL,并发布openssl s_client -connect -tls1 -servername 的输出。 openssl x509 -text -noout'。点击*编辑*(不要将其作为评论发布),将其添加到您的问题中。否则,我们无法复制它,并且没有足够的信息来帮助排除故障。 – jww

+0

我在$连接实例化代码中提供了实际的URL。我还发布了命令输出,并将文件名和路径更新为真实的。 –

+0

谢谢@Djuro。这些信息很容易诊断。我希望每个人都提供它。 – jww

... error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed"

您正在连接到服务器的名称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名称。我经常填充它们了调试和测试的名称,如localhostlocalhost.localdomain127.0.0.1


编辑:对于这个问题:

... and server's log now says:

=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根CA。您还需要中间一个叫TERENA SSL高可信CA 3

DigiCert高保障EV根CA证书

您可以下载DigiCert高保障EV根CADigiCert Trusted Root Authority Certificates。它具有以下属性:

  • 序列号: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高保证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

现在,你有你需要的pathbuilding的的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)(如果我没有记错)。

+0

不,它不起作用。我更新了这个问题。 –

+0

再次更新,如果这是你的意思。 –

+0

我通过从$ sslOptions中删除'cafile'和'local_cert'来解决问题,我保留'peer_name'和'verify_peer_name'。消息去和日志条目看起来不错。你可以修改你的答案或添加一个新的答案,我会接受它。那有意义吗? –