因安全问题,rabbitmq配置了ssl加密,客户端使用加密连接一直报错,经过多番折腾,终于解决。
- 报错问题
1、None of the specified endpoints were reachable
2、The remote certificate is invalid according to the validation procedure
- 解决办法
第一个问题是传入的证书,服务端用户名密码不正确。检查配置值,下面是例子:
"RabbitMQ": {
"host": "127.0.0.1",
"port": 5716,
"username": "admin",
"password": "admin",
"virtualhost": "virtualhost",
"enabledSsl": true,
"servername": "rabbit-server", // 服务端用户名
"certpath": "rabbit-client.keycert.p12", // 证书路径
"certpassphrase": "123456",// 服务端密码
"version": "12" //System.Security.Authentication.SslProtocols
},
第二个问题是服务端生成的证书是不被信任的。客户端忽略错误即可,代码:
AcceptablePolicyErrors = SslPolicyErrors.RemoteCertificateNotAvailable |
SslPolicyErrors.RemoteCertificateChainErrors
- 最终代码,对应的变量从配置文件读取:
try
{
var connectionFactory = new ConnectionFactory
{
HostName = host,
Password = password,
UserName = username,
Port = port,
VirtualHost = virtualHost
};
if (enabledSsl)
{
connectionFactory.Ssl = new SslOption
{
Enabled = enabledSsl,
ServerName = serverName,
CertPath = certPath,
CertPassphrase = certPassphrase,
Version = SslProtocols.Tls12,
AcceptablePolicyErrors = //SslPolicyErrors.RemoteCertificateNameMismatch |
SslPolicyErrors.RemoteCertificateNotAvailable |
SslPolicyErrors.RemoteCertificateChainErrors
};
}
conn = connectionFactory.CreateConnection();
channel = conn.CreateModel();
}
catch (Exception ex)
{
logger.LogError("connect mq error", ex);
}