Go tls:使用streadway/amqp为RabbitMQ启用tls时握手失败

Go tls:使用streadway/amqp为RabbitMQ启用tls时握手失败,go,ssl,rabbitmq,amqp,Go,Ssl,Rabbitmq,Amqp,我正在尝试使用streadway/amqp通过amqps://in-Go连接到RabbitMQ。我可以成功连接amqp://。启用TLS并使用amqps://时,我会出现以下错误: 紧急:远程错误:tls:握手失败 RabbitMQ使用以下环境变量和设置在docker中运行: 环境: RABBITMQ\u SSL\u CACERTFILE:/ca\u certificate.pem RABBITMQ\u SSL\u证书文件:/server\u certificate.pem RABBITMQ\u

我正在尝试使用streadway/amqp通过amqps://in-Go连接到RabbitMQ。我可以成功连接amqp://。启用TLS并使用amqps://时,我会出现以下错误:

紧急:远程错误:tls:握手失败 RabbitMQ使用以下环境变量和设置在docker中运行:

环境: RABBITMQ\u SSL\u CACERTFILE:/ca\u certificate.pem RABBITMQ\u SSL\u证书文件:/server\u certificate.pem RABBITMQ\u SSL\u密钥文件:/server\u key.pem 端口: -5671:5671请注意,5671表示tls,5672表示非tls 卷数: -./ca_certificate.pem:/ca_certificate.pem:ro -./server\u certificate.pem:/server\u certificate.pem:ro -./server\u key.pem:/server\u key.pem:ro 我尝试了以下方法:

我还尝试读取证书文件,创建密钥对,将证书颁发机构附加到证书池,并在tls.Config{}中以这种方式使用它,具有以下功能:

tls.LoadX509KeyPair x509.NewCertPool.AppendCertsFromPEM 我使用for 127.0.0.1、localhost、rabbitmq生成证书

根据一些与RabbitMQ无关的答案,一些人认为密码可能是错误的。所以我看了一下rabbitmq使用的密码:

$ openssl s_client -connect localhost:5671 -tls1

Protocol  : TLSv1
Cipher    : ECDHE-RSA-AES256-SHA
<etc etc...>
Verify return code: 0 (ok)

我仍然有同样的问题。我非常怀疑这是图书馆,一定是我做错了什么,但这是怎么回事?

我复制了你的设置。它不起作用,因为您需要配置带有客户端证书的AMQP连接

使用:mkcert-client-rabbitmq.test localhost 127.0.0.1::1注意-client标志

在此之后,您只需使用tls.LoadX509KeyPair将客户端证书传递到AMQP tlsConfig中,它就可以正常工作了:

    cert, err := tls.LoadX509KeyPair("./rabbitmq.test+3-client.pem", "./rabbitmq.test+3-client-key.pem")

    // Load CA cert
    caCert, err := ioutil.ReadFile("./rootCA.pem") // The same you configured in your MQ server
    if err != nil {
        log.Fatal(err)
    }
    caCertPool := x509.NewCertPool()
    caCertPool.AppendCertsFromPEM(caCert)

    tlsConfig := &tls.Config{
        Certificates: []tls.Certificate{cert}, // from tls.LoadX509KeyPair
        RootCAs:      caCertPool,
        // ...other options are just the same as yours
    }

    conn, err := amqp.DialTLS("amqps://test:secret@127.0.0.1:5671", tlsConfig)
    if err != nil {
        panic(err) // does not panic!
    }

    // ... application code

PS:在我的设置中,我使用了一些不同于您的用户名/密码/容器,但这些名称应该是无关的

我复制了您的设置。它不起作用,因为您需要配置带有客户端证书的AMQP连接

使用:mkcert-client-rabbitmq.test localhost 127.0.0.1::1注意-client标志

在此之后,您只需使用tls.LoadX509KeyPair将客户端证书传递到AMQP tlsConfig中,它就可以正常工作了:

    cert, err := tls.LoadX509KeyPair("./rabbitmq.test+3-client.pem", "./rabbitmq.test+3-client-key.pem")

    // Load CA cert
    caCert, err := ioutil.ReadFile("./rootCA.pem") // The same you configured in your MQ server
    if err != nil {
        log.Fatal(err)
    }
    caCertPool := x509.NewCertPool()
    caCertPool.AppendCertsFromPEM(caCert)

    tlsConfig := &tls.Config{
        Certificates: []tls.Certificate{cert}, // from tls.LoadX509KeyPair
        RootCAs:      caCertPool,
        // ...other options are just the same as yours
    }

    conn, err := amqp.DialTLS("amqps://test:secret@127.0.0.1:5671", tlsConfig)
    if err != nil {
        panic(err) // does not panic!
    }

    // ... application code
PS:在我的设置中,我使用了一些不同于您的用户名/密码/容器,但这些应该是无关的

    cert, err := tls.LoadX509KeyPair("./rabbitmq.test+3-client.pem", "./rabbitmq.test+3-client-key.pem")

    // Load CA cert
    caCert, err := ioutil.ReadFile("./rootCA.pem") // The same you configured in your MQ server
    if err != nil {
        log.Fatal(err)
    }
    caCertPool := x509.NewCertPool()
    caCertPool.AppendCertsFromPEM(caCert)

    tlsConfig := &tls.Config{
        Certificates: []tls.Certificate{cert}, // from tls.LoadX509KeyPair
        RootCAs:      caCertPool,
        // ...other options are just the same as yours
    }

    conn, err := amqp.DialTLS("amqps://test:secret@127.0.0.1:5671", tlsConfig)
    if err != nil {
        panic(err) // does not panic!
    }

    // ... application code