SpringBoot微服务HTTPS通信实践:Nacos注册与Feign自签名证书配置指南
前言
最近笔者有个项目需要从单体后端迁移到微服务架构后端,使用的技术栈是springboot + nacos + openfeign。为了确保通信安全,所有服务都启用了https。前期不使用https的demo很快就跑通了,但是今天在继续搭建启用https的demo时,遇到了很多坑,在此记录一下,希望能帮助到同样遇到此类问题的uu们。
demo环境
- springboot版本:3.4.5
- java版本:17.0.12
- 系统版本:macOS Sequoia
- 包管理工具:maven
- 服务组成:系统目前有2个服务,名字分别为auth-service和business-service
- Feign服务接口
@FeignClient("auth-service")
interface AuthService {
@PostMapping("/auth/renew_jwt")
fun renewJwt(
@RequestParam("loginSessionId") loginSessionId: String
): ActionResult
}
要点记录
- 如果需要服务注册到nacos时声明自己使用https,那么需要在metadata里添加
secure=true,如果不设置这个字段,那么feign在访问时默认会以http协议访问,会直接导致访问失败,同时报错This combination of host and port requires TLS.

- 在注册到nacos时,需要指定feign访问时的ip为https证书里的域名,否则后面会因为域名不对而无法通过证书验证。如果域名错误,会报错
HTTPS hostname wrong: should be <xxxxxx(这里是feign实际访问的ip)>

最终的nacos配置如下所示
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
metadata:
secure: true
ip: 127.0.0.1
- 在本地使用自签名证书进行开发时,需要通过代码配置将自签名证书加入到信任证书列表中,否则feign发送请求时会因为证书无法验证而拒绝请求。
这一步也是坑最多的地方,笔者在这里整整卡了半天,下面本文将展示出笔者遇到的所有报错和解决办法
当没有配置信任自签名证书时,会报feign.RetryableException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target executing POST http://auth-service/xxx

这个报错是因为feign客户端无法验证自签名证书的有效性。 需要注意的是,即使在macos的系统钥匙串里信任了这个证书,即使在浏览器上已经能够使用https://127.0.0.1访问了,在这里仍然会出现无法验证自签名证书有效性的问题,这应该是java的证书库和macos的不通用导致的。
解决方法为,首先把证书导出为crt文件
keytool -exportcert -alias my-service -keystore keystore.p12 -storepass <keystore密码> -file server.crt
然后把server.crt导入到信任证书库中
keytool -importcert -alias my-service -file server.crt -keystore client-truststore.jks -storepass <信任证书库的密码>
最终就会得到client-truststore.jks,这就是信任证书库,把它放到resources目录下备用。
接着还需要配置通过Bean注入FeignClient,如果启用了loadBalancer,直接参考下面的代码即可,添加之后只需要配置dev-config.feignSSLTrustLocalCert为true就会自动配置和注入改造后的FeignClient
@Configuration
open class FeignSSLConfig{
@Bean
@ConditionalOnProperty(name = ["dev-config.feignSSLTrustLocalCert"], havingValue = "true", matchIfMissing = false)
open fun feignClient(
loadBalancerClient: LoadBalancerClient,
loadBalancerClientFactory: LoadBalancerClientFactory,
transformers: List<LoadBalancerFeignRequestTransformer>
): Client {
val sslContext = SSLContexts.custom()
.loadTrustMaterial(ClassPathResource("client-truststore.jks").url, "123456".toCharArray())
.build()
val client = Client.Default(sslContext.socketFactory, DefaultHostnameVerifier())
return FeignBlockingLoadBalancerClient(client, loadBalancerClient, loadBalancerClientFactory, transformers)
}
}
坑点
在启用了loadBalancer的情况下,改造FeignClient时没有使用FeignBlockingLoadBalancerClient
一开始AI给出的改造建议是直接返回Client.Default,代码如下所示
@Bean
public Client feignClient(SSLContext sslContext) {
return new Client.Default(sslContext.getSocketFactory(), new DefaultHostnameVerifier());
}
在实际运行后,会报错UnknownHostException,如下图所示

这是因为把auth-service解析到具体的ip是在loadBalancer里面完成的,直接返回Client.Default会导致Feign请求没有经过loadBalancer,从而导致无法把auth-service正确解析到具体的ip上面。
tricks
- 可以设置feign日志为FULL来观察具体的请求情况
@Bean
fun feignLoggerLevel(): Logger.Level {
return Logger.Level.FULL
}
- 可以通过添加
-Djavax.net.debug=ssl:handshake参数来观察具体的https握手过程
SpringBoot微服务HTTPS通信实践:Nacos注册与Feign自签名证书配置指南的更多相关文章
- SpringBoot微服务
在企业级软件的架构模型上,我们主要讨论下SOA与微服务架构. SOA的全称是Service-Oriented Architecture,可译为“面向服务的架构”,它是一个组件模型,将应用程序的不同功能 ...
- .NET Core 微服务学习与实践系列文章目录索引(2019版)
参考网址: https://archy.blog.csdn.net/article/details/103659692 2018年,我开始学习和实践.NET Core,并开始了微服务的学习,以及通过各 ...
- 从Uber微服务看最佳实践如何炼成?
导读:Uber成长非常迅速,工程师团队快速扩充,据说Uber有2000名工程师,8000个代码仓库,部署了1000多个微服务.微服务架构是Uber应对技术团队快速增长,功能快速上线很出色的解决方案.本 ...
- 基于Spring Boot、Spring Cloud、Docker的微服务系统架构实践
由于最近公司业务需要,需要搭建基于Spring Cloud的微服务系统.遍访各大搜索引擎,发现国内资料少之又少,也难怪,国内Dubbo正统治着天下.但是,一个技术总有它的瓶颈,Dubbo也有它捉襟见肘 ...
- gRPC-微服务间通信实践
微服务间通信常见的两种方式 由于微服务架构慢慢被更多人使用后,迎面而来的问题是如何做好微服务间通信的方案.我们先分析下目前最常用的两种服务间通信方案. gRPC(rpc远程调用) 场景:A服务主动发起 ...
- CAP-微服务间通信实践
微服务间通信常见的两种方式 由于微服务架构慢慢被更多人使用后,迎面而来的问题是如何做好微服务间通信的方案.我们先分析下目前最常用的两种服务间通信方案. gRPC(rpc远程调用) gRPC-微服务间通 ...
- Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务
本篇为Docker从入门到掉坑第二篇:基于Docker构建SpringBoot微服务,没有看过上一篇的最好读过 Docker 从入门到掉坑 之后,阅读本篇. 在之前的文章里面介绍了如何基于docker ...
- 基于Openshift的SpringBoot微服务
基于Openshift的SpringBoot微服务 OpenShift是红帽的云开发平台即服务(PaaS).自由和开放源码的云计算平台使开发人员能够创建.测试和运行他们的应用程序,并且可以把它们部署到 ...
- SpringBoot微服务架构下的MVC模型总结
SpringBoot微服务架构下的MVC模型产生的原因: 微服务概念改变着软件开发领域,传统的开源框架结构开发,由于其繁琐的配置流程 , 复杂的设置行为,为项目的开发增加了繁重的工作量,微服务致力于解 ...
- springboot微服务的简单小结
springboot微服务的简单小结 近来公司用springboot微服务,所以小结一下. 基础: 什么是SpingBoot微服务? 如何创建SpringBoot微服务? 如何管理和完善SpringB ...
随机推荐
- Java从小白到老白⑥
一. 1.抽象类vs接口 相同 两者都不能实例化,不能new操作 不同 抽象类abstract 接口interface 抽象类可以用部分方法实现 接口所有方法不能有实现 一个类只能继承(extends ...
- Merge Two Binary Trees——LeetCode进阶路
原题链接https://leetcode.com/problems/merge-two-binary-trees/ 题目描述 Given two binary trees and imagine th ...
- Java catch多重异常捕获
摘要:Java中多重异常捕获机制可以更加简洁.有效地处理多个异常,提高了程序的鲁棒性,是编写高质量代码的重要技巧之一. 小编在<浅谈Java异常处理机制>中梳理了异常处理机制,在< ...
- Java安全_SQL注入
[!NOTE] 本次学习使用开源项目: https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou ...
- AI智能体介绍与典型应用场景分析
一.什么是AI智能体 AI智能体(AI Agent)是一种软件,指能够接入AI,实现感知环境.进行自主决策并执行任务的系统.与AI大模型不同,AI智能体具备一定程度的自治性,能够根据输入的信息进行推理 ...
- DeepSeekMath -- GRPO
Deepseek系列博客目录 Model 核心 Date DeepSeekLLM 探究LLM Scalling Law 2024.01 DeepSeekMath 提出GRPO 2024.04 Deep ...
- MySQL查询优化的步骤
本文由 ChatMoney团队出品 MySQL查询优化是提高数据库性能的关键步骤之一.通过优化查询,可以减少数据库的负载,提高查询速度,从而提高整个应用程序的性能. 选择合适的索引 索引是数据库中用于 ...
- 对S4的看法
我是12年开始接触SAP的,13年还没毕业就进入了某个项目做CRM...在这个项目之前,我学习了abap开发基础,还有web dynpro开发基础,以及CRM UI开发基础. 后来我入职了甲方,那时候 ...
- Apache NiFi C2 Client 实现详解
项目标题与描述 Apache NiFi C2 Client 是Apache NiFi项目中的Command and Control (C2)协议客户端实现,主要用于与C2服务器进行通信,实现远程管理和 ...
- 使用 cursor 来 review 代码
使用 cursor 来 review 代码 前言 code review review 单个文件 针对提交进行 code review 总结 使用 cursor 来 review 代码 前言 curs ...