本来运行好好的 dotnet 微服务,某个服务突然502。
查服务中心 Consul ,后端服务正常注册,健康返回OK。
查到网关报错:RemoteCertificateNameMismatch。
后端服务使用了 gRPC,必须使用 http2.0 ,而 http2.0 要求使用 https,因此 Ocolet 网关配置该服务为 https 协议。
问题就出在这个 https 上,百思不得其解,之前一直正常的,怎么突然就不认了?
最后开启了 Ocolet 日志:
// appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Ocelot": "Debug",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
查到 Ocolet 调用的下游服务是主机名,而证书是IP地址,破案了。
解决:重新生成证书,把别名,主机地址写入证书别名中。
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
创建文件v3.ext:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = {hostname}
DNS.2 = {hostname}.local
IP.1 = 192.168.0.131
这里 {hostname} 做脱敏处理,在实际项目中替换为真实主机名。
制作证书:
openssl x509 -req -in server.csr -signkey server.key -out server.crt -days 365 -extfile v3.ext
最后在服务中使用证书,在客户端(gateway)安装信任证书,问题解决。