RabbitMq Broker not accepting PFX



在使用OpenSSL生成的证书获得RabbitMqSSL的工作解决方案后,我们的客户向我提出了一个要求,即我们不能使用OpenSSL来生成证书。服务器管理员通过IIS创建了证书链。

我们在创建后对证书进行了以下操作:

  1. 将服务器证书导出到PFX并提取Cert.PemCert.Key
  2. 将客户端证书导出到PFX并提取Cert.pemCert.Key
  3. 将根 CA 导出到rootca.pem
  4. 更新了RabbitMq的配置文件

为了测试是否正确创建了连接和证书,我们完成了此处的故障排除步骤。

一切都过得很好。我们能够使用客户端的cert.pem和从client.pfx生成的cert.key按预期在端口5671上使用openssl s_client进行连接。我们可以在管理控制台以及日志中看到建立的连接,并且它们来回通信。

现在,在 .NET 客户端中使用client.pfx,我们收到有关证书验证的错误:

MassTransit.RabbitMqTransport.RabbitMqConnectionException: 连接失败: admin@mitvs-atm01:5671/---> RabbitMQ.Client.Exceptions.BrokerUnreachableException: 系统安全.Authentication.Authentication异常--->无法访问任何指定的端点异常: 根据验证过程,远程证书无效。

如何使用client.pfx收到错误,但在使用从中提取的 cert.pem 和cert.key时没有收到错误

此错误消息表示客户端无法验证服务器证书。您的问题可能与rootca.pem在客户端计算机上不受信任有关。按照相应的操作系统指南使根 CA 证书受信任。

使用s_client通过OpenSSL测试连接时,它不执行任何验证或非常基本的验证,.NET 应用程序可以提供应用任何逻辑的功能。最常见的验证类型是将证书的CN与服务器的主机名匹配,但它实际上可以是任何东西。

因此,即使在受信任的根 CA 上,CN 仍需要匹配主机名,而不会使用OpenSSL命令获取主机名。

重新生成证书并修改该证书解决了问题。

此外,您可以有效地添加下面的代码,它将忽略此错误:

h.UseSsl(s =>
{
s.ServerName = SslHostName;
s.CertificatePath = SslFileLocation;
s.CertificatePassphrase = SslPassphrase;
// The below allows the Root CA's CN to be different than the others, but adds vulnerability
s.AllowPolicyErrors(System.Net.Security.SslPolicyErrors.RemoteCertificateNameMismatch);
});

请注意 - 忽略错误会带来使您的系统暴露在 MITM 攻击的风险(当然,除非您实现自己的验证逻辑,该逻辑不基于 CN/主机名匹配)。

最新更新