Docker环境下Ocelot网关用自签名证书调用.NET Core API出现SSL错误如何解决?
问题判断
你的判断完全正确,报错信息中的RemoteCertificateNameMismatch已经明确说明问题:你生成的自签名证书仅绑定了localhost域名,而Ocelot容器内部通过xplora.api这个容器域名访问下游API时,证书的域名校验无法通过;同时RemoteCertificateChainErrors是因为自签名证书的根证书默认不被系统信任。
安全解决步骤
不用开启不安全的证书忽略配置,按以下步骤操作即可:
1. 重新生成包含多域名的自签名证书
生成证书时将localhost、xplora.api都加入证书的**使用者备用名称(SAN)**字段,保证本地访问和容器内部访问都能通过域名校验。
可以使用openssl生成,示例命令:
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \ -keyout xplora.api.key -out xplora.api.crt \ -subj "/CN=xplora.api" \ -addext "subjectAltName=DNS:localhost,DNS:xplora.api,IP:127.0.0.1"
生成的xplora.api.crt是公钥证书,xplora.api.key是私钥,替换下游API原来使用的自签名证书即可。
2. 将自签名根证书导入Ocelot网关容器的信任存储
因为Ocelot作为客户端发起HTTPS请求,需要信任你生成的自签名证书,所以要把公钥证书挂载到Ocelot容器内并添加到系统信任列表:
调整docker-compose配置,给Ocelot服务添加挂载和启动命令:
xploraapigateway: # 其他原有配置保持不变 volumes: # 把本地的自签名证书挂载到容器内的证书目录 - ./本地证书存放路径/xplora.api.crt:/usr/local/share/ca-certificates/xplora.api.crt # 根据镜像类型选择对应的更新证书命令,示例为Debian系镜像配置 command: > sh -c " update-ca-certificates && # 替换为你原有Ocelot服务的启动命令 dotnet XploraApiGateway.dll "
如果你的容器镜像基于Alpine,需要先安装ca-certificates包,在启动命令开头添加apk add --no-cache ca-certificates即可
3. 验证生效
重启所有容器后再次通过Ocelot网关访问接口,即可正常通过证书校验,不会再报SSL连接错误。
内容的提问来源于stack exchange,提问作者JonR
相关产品推荐
相关产品推荐

