我正在尝试设置一对使用 SSL 客户端证书进行身份验证的 RabbitMQ 服务器联合。我已生成一组密钥和证书,但当另一台服务器尝试作为客户端进行连接时,我在一台服务器上收到此错误:
=ERROR REPORT==== 7-Mar-2014::16:22:29 ===
SSL: certify: ssl_connection.erl:1678:Fatal error: unknown ca
我可以openssl s_server...
使用与 rabbitmq 服务器配置相同的 CA 证书、服务器证书和密钥来运行。当我这样做时,我可以使用与 rabbitmq 客户端配置相同的 CA 证书openssl s_client...
、客户端证书和密钥来连接到它。这很好用 - 我可以看到验证输出,并且连接可以正常传输数据。
当我将 rabbitmq 客户端连接到正在运行的openssl s_server...
进程时,后者输出此错误:
ACCEPT
ERROR
139939008452264:error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:s3_pkt.c:1256:SSL alert number 48
shutting down SSL
CONNECTION CLOSED
如果我用空文件替换客户端上的 CA 证书,我会收到同样的错误。
以下是联邦参数:
{"uri":"amqps://[HOSTNAME]/%2f?cacertfile=/srv/byteq/config/ca.crt&certfile=/srv/byteq/config/federation_client.crt&keyfile=/srv/byteq/config/federation_client.key&verify=verify_peer&fail_if_no_peer_cert=true","expires":3600000}
这一切都表明联合配置的 CA 证书存在问题,但我不知道该从哪里开始查找。帮忙?
答案1
当您使用 SSL 进行客户端身份验证时,会涉及两个单独的 CA 证书。
一个是服务器作为服务器证书颁发者提供的证书。客户端需要信任这个 CA 才能验证主机的 SSL 证书。
另一个是颁发客户端证书的 CA。服务器需要信任该 CA 才能验证客户端的 SSL 证书。
即使你对两个证书使用相同的实际 CA,你仍然需要通知你的服务器应该使用该 CA 证书两个都获得自己的证书和来验证客户端的。前者通过选项完成cacertfile=/srv/byteq/config/ca.crt
- 为了添加后者,您需要添加cacerts="/srv/byteq/config/ca.crt
。
更多信息请访问https://www.rabbitmq.com/ssl.html在“信任客户端的根 CA”标题下。
答案2
我通过删除我制作的所有证书和密钥并重新开始来解决这个问题。我遵循了以下清单:
- rabbitmq.config中链接的certfile是服务器购买的SSL证书。
- rabbitmq.config中链接的密钥文件是服务器购买的SSL密钥。
- federation 参数中链接的 certfile 是客户端本地生成的 SSL 证书。
- federation 参数中链接的密钥文件是客户端本地生成的 SSL 密钥。
- rabbitmq.config 中链接的 cacertfile 是 SSL 提供程序的中间证书,并验证 federation 参数中的 keyfile 和 certfile。
- federation 参数中链接的 cacertfile 是本地生成的证书颁发机构,它验证购买的 SSL 密钥和证书。