我有一个c#.net客户端使用来自使用TLS保护的RabbitMQ实例(使用RabbitMQ.Client)的消息。我使用自签名证书使一切工作顺利。
我们从认可的CA购买了通配符证书,以便继续使用。该证书实际上已由根CA的中间机构签名,该CA由根CA本身信任。
由于客户端计算机不会信任中间CA(证书不会安装到本地计算机证书存储中),因此我们下载了一个PEM文件,其中包含构成信任链的所有证书。但是,.net客户端将不会验证此证书,因为它无法建立信任链而失败。
我已经浏览了一下,并且找不到任何说明.net无法验证自身包含多个证书的PEM证书。如果我将自定义委托分配给RabbitMQ ConnectionFactory的CertificateValidationCallback属性,我可以看到证书链只包含一个证书,该证书是由中间CA签名的证书。
客户端最终将部署到数百台计算机上,因此我们不必将中间证书部署到所有计算机,然后必须继续管理它们。我知道我可以通过将AcceptablePolicyErrors属性设置为SslPolicyErrors.RemoteCertificateChainErrors来设置关闭链验证,但这似乎让我的安全性降低了一些。
所以,我在这里有两个主要问题:
我正在使用.net 4.5.2虽然在.net 4.6.2和.net 4.7.1中也出现了同样的问题。
我在Windows 7机器上运行它。 RabbitMQ节点正在Windows 2012服务器上运行。
答案 0 :(得分:0)
RabbitMQ团队监控rabbitmq-users
邮件列表](https://groups.google.com/forum/#!forum/rabbitmq-users),有时只回答StackOverflow上的问题。
您应该将根CA证书和中间CA证书(两种pem
格式)连接到一个文件中,并将其用作RabbitMQ的cacertfile
。然后,Erlang VM应在会话建立的握手阶段提供两个证书,并且.NET TLS / SSL代码应使用它们来验证服务器的证书。
您可以使用these instructions来帮助解决您的环境问题。如果仍然无法解决问题,请按照邮件列表进行操作,我们会帮忙解决。谢谢!