JHipster中Feign对接HTTPS网关失败问题求助
我来帮你分析下这个问题——从报错信息来看,核心原因是SSL握手时证书的主题备用名称(SAN)不匹配Docker容器的内部IP,再加上Feign客户端可能还在使用HTTP协议调用已经切换到HTTPS的网关,双重因素导致了通信失败。下面是具体的解决步骤:
1. 先让Feign客户端用HTTPS协议调用网关
你当前的FeignClient只指定了服务名g,默认会使用HTTP协议发起请求,但网关已经改成HTTPS了,要么会被重定向到HTTPS,要么直接拒绝HTTP请求。我们需要强制Feign用HTTPS:
推荐方式:通过配置文件统一设置
在微服务的application.yml(或application.properties)里添加针对网关服务的Feign配置:
feign: client: config: g: # 这里要和FeignClient注解里的name值一致 url: https://g:443
这样Feign就会用HTTPS访问网关的443端口。
2. 解决证书SAN不匹配的核心问题
Let's Encrypt的证书是绑定你的公网域名的,而Docker容器内部通信用的是容器IP(比如报错里的172.18.0.10),这个IP不在证书的SAN列表里,所以SSL握手会失败。有两种方案可选:
方案一:用公网域名进行内部调用(简单但性能略差)
如果你的Docker容器能访问公网,可以让微服务直接通过网关的公网域名调用,这样证书是完全匹配的:
feign: client: config: g: url: https://你的公网域名.com
缺点是内部服务调用会绕公网,对性能有一定影响,适合测试或小型项目。
方案二:配置内部自签名证书(生产推荐)
如果希望内部通信走Docker内网且保持HTTPS安全,可以给网关添加一个针对内部服务名/IP的自签名证书,同时保留Let's Encrypt证书处理外部请求:
- 生成一个自签名证书,指定Docker内部网关的服务名(
g)或IP(172.18.0.10)作为SAN。 - 给网关配置双SSL端口:一个用Let's Encrypt证书对外,一个用自签名证书对内。
- 把自签名证书导入微服务的JVM信任存储:
将证书文件复制到微服务容器的JDK安全目录(比如/usr/local/openjdk-11/lib/security/),然后执行导入命令:keytool -import -alias internal-gateway -keystore cacerts -file 你的内部证书.crt -storepass changeit -noprompt - 最后修改微服务的Feign配置,指向网关的内部HTTPS端口:
feign: client: config: g: url: https://g:8443 # 假设内部HTTPS端口是8443
3. 排查网关的HTTPS配置
确认网关的application-prod.yml里HTTPS配置正确,比如:
server: port: 443 ssl: key-store-type: PKCS12 key-store: classpath:keystore.p12 key-store-password: 你的证书密码 key-alias: 你的证书别名
如果网关配置了HTTP到HTTPS的重定向,也要确保内部调用不会被强制重定向到公网地址。
临时排查技巧:关闭Hystrix(仅用于调试)
如果还是无法定位问题,可以临时关闭Hystrix的熔断和超时,直接查看原始的SSL错误信息:
hystrix: command: default: execution: timeout: enabled: false circuitBreaker: enabled: false
调试完成后记得重新开启Hystrix保障服务稳定性。
内容的提问来源于stack exchange,提问作者Chris

