首页 文章

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

提问于
浏览
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' .

这是我从客户端连接的方式,包括实际的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

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

1 回答

  • 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名称 . 我经常用调试和测试名称填写它们,例如 localhostlocalhost.localdomain127.0.0.1 .


    EDIT :对于这个问题:

    ...和服务器的日志现在说:=错误报告==== 2016年3月3日:: 09:52:41 ===
    SSL:certify:ssl_handshake.erl:1490:致命错误:未知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
    

    don't 需要 ca-cert.pem 文件,其中包含数百个CA,其中大多数是错误的 . 您只需要一个正确的CA,并且它曾经被称为 DigiCert High Assurance EV Root CA . 你还需要一个名为 TERENA SSL High Assurance CA 3 的中间版

    DigiCert High Assurance EV Root 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 High Assurance 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) (如果我没记错的话) .

相关问题