【问题标题】:Certificate chain contained within the public key exposed by RabbitMQRabbitMQ 公开的公钥中包含的证书链
【发布时间】:2018-06-07 16:24:19
【问题描述】:

我有一个 c# .net 客户端使用来自使用 TLS 保护的 RabbitMQ 实例(使用 RabbitMQ.Client)的消息。我使用自签名证书让一切正常运行。

我们已从经认可的 CA 购买了通配符证书以供以后使用。此证书实际上已由根 CA 本身信任的根 CA 的中介机构签署。

由于客户端计算机不信任中间 CA(证书不会安装到本地计算机证书存储中),我们下载了一个 PEM 文件,其中包含构成信任链的所有证书。但是,.net 客户端不会验证此证书,因为它无法建立信任链而失败。

我环顾四周,找不到任何说 .net 无法验证本身包含多个证书的 PEM 证书。如果我将自定义委托分配给 RabbitMQ ConnectionFactory 的 CertificateValidationCallback 属性,我可以看到证书链仅包含一个证书,即由中间 CA 签名的证书。

客户端最终将部署到数百台机器上,因此我们宁愿不必将中间证书部署到所有机器上,然后再继续管理它们。我知道我可以通过将 AcceptablePolicyErrors 属性设置为 SslPolicyErrors.RemoteCertificateChainErrors 来设置关闭链验证,但在我看来这会让事情变得不那么安全。

所以,我有两个主要问题:

  1. .net 加密验证是否根本不支持包含链中所有其他证书的证书(至少如果该证书是 PEM)?
  2. 有没有办法解决这个问题?

我使用的是 .net 4.5.2,尽管 .net 4.6.2 和 .net 4.7.1 中也出现了同样的问题。

我在 Windows 7 机器上运行它。 RabbitMQ 节点在 Windows 2012 服务器上运行。

【问题讨论】:

    标签: c# .net cryptography rabbitmq


    【解决方案1】:

    RabbitMQ 团队会监控rabbitmq-users 邮件列表](https://groups.google.com/forum/#!forum/rabbitmq-users),并且有时只在 StackOverflow 上回答问题。


    您应该将根 CA 证书和中间 CA 证书(pem 格式)连接到一个文件中,并将其用作 RabbitMQ 的 cacertfile。然后,Erlang VM 应该在会话建立的握手阶段提供这两个证书,并且应该由 .NET TLS/SSL 代码使用它们来验证服务器的证书。

    您可以使用these instructions 来帮助您对环境进行故障排除。如果仍有问题,请跟进邮件列表,我们会提供帮助。谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多