SpringBoot + Nacos/Apollo
一、核心安全前提
支付敏感信息:支付宝私钥、商户 APPID、微信 mchId、APIv3 密钥、支付证书序列号、回调地址等禁止硬编码在 yml、代码、Git,统一存放配置中心,配套加密存储、权限隔离、环境隔离。 两种配置中心通用安全原则:
- 敏感字段加密存储,明文不落地数据库 / 磁盘;
- 开发 / 测试 / 生产三套环境配置完全隔离;
- 细粒度权限管控,仅支付服务能读取支付配置;
- 服务本地不缓存明文密钥日志输出;
- 区分普通明文配置、加密密钥配置两套读取逻辑。
第一部分 Nacos 存储支付敏感参数
1. Nacos 前置准备
1.1 开启 Nacos 内置加密功能
Nacos 2.2.3 + 自带 RSA 加密插件,无需额外组件;低版本需接入第三方加解密工具。
- 登录 Nacos 后台,命名空间划分:
- namespace-dev:开发环境(支付宝沙箱、微信测试商户)
- namespace-test:测试环境
- namespace-prod:生产正式商户(隔离最重要)
- 新建分组
PAY_GROUP,所有支付配置统一放该分组,区分商品、用户模块配置。
1.2 生成加密密钥(后台工具生成密文)
- Nacos 后台 → 配置管理 → 加密工具
- 加密类型选择
RSA,输入敏感明文:微信 v3 密钥、支付宝商户私钥 - 生成密文格式固定:
{RSA}xxxxxx,以标记该字段为加密内容。
1.3 新建支付配置文件(DataId:pay-config.yaml)
命名空间选择对应环境,分组 PAY_GROUP,配置内容:
yaml
# 支付宝配置(普通明文) alipay: app-id: 2021001117648123 gateway-url: https://openapi.alipay.com/gateway.do notify-url: https://xxx.com/api/pay/alipay/notify return-url: https://xxx.com/order/success charset: utf-8 sign-type: RSA2 # 加密存储,禁止明文 private-key: {RSA}cxxxxxxxxxxxxxxx public-key: {RSA}dxxxxxxxxxxxxxxx # 微信支付V3配置 wechat-pay: mch-id: 1603212345 mch-serial-no: 34F97A6C081234567890ABCDEF notify-url: https://xxx.com/api/pay/wxpay/notify private-key-path: classpath:cert/apiclient_key.pem platform-cert-path: classpath:cert/platform_cert.pem # 32位v3密钥加密存储 api-v3-key: {RSA}exxxxxxxxxxxxxxxx证书文件 pem 无法文本存储,仍放在服务器本地,配置中心只存文件路径。
2. SpringBoot 项目接入 Nacos,自动解密敏感配置
2.1 Maven 引入 Nacos 依赖
xml
<!-- Nacos配置中心 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- nacos加密解析依赖,自动识别{RSA}前缀 --> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> </dependency>2.2 bootstrap.yml 配置 Nacos 连接(必须 bootstrap,优先加载配置)
yaml
spring: cloud: nacos: config: server-addr: 127.0.0.1:8848 # 对应环境命名空间ID namespace: prod-namespace-id group: PAY_GROUP # 加载支付配置文件 extension-configs: - data-id: pay-config.yaml refresh: true # Nacos加密RSA私钥(项目本地配置,不存nacos) encryption: rsa: private-key: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDxxx关键点:Nacos 解密用的 RSA 私钥放在项目本地 bootstrap,不存入配置中心,形成双向隔离。
2.3 支付配置读取类(自动解密)
java
运行
@Data @Configuration @ConfigurationProperties(prefix = "alipay") public class AlipayConfig { private String appId; private String gatewayUrl; private String notifyUrl; private String returnUrl; private String charset; private String signType; // Nacos客户端自动解析{RSA}密文,注入明文 private String privateKey; private String publicKey; }无需手动写解密代码,nacos-client 识别{RSA}前缀自动解密注入字段。
3. Nacos 配套安全管控
- 权限隔离
- 生产 namespace 仅运维、支付开发账号可读,普通开发无查看权限;
- 关闭匿名访问 Nacos,所有登录开启账号密码。
- 配置变更审计Nacos 记录每一条配置修改人、修改时间、版本,密钥修改自动钉钉告警。
- 禁止本地 yml 写支付密钥application.yml 只保留通用业务配置,所有支付参数统一从 Nacos 拉取。
- 动态刷新
refresh: true,修改商户密钥无需重启服务自动生效。 - 日志脱敏自定义日志拦截器,打印 AlipayConfig、WechatPayConfig 时过滤 privateKey、apiV3Key 明文。
4. 微信证书文件配套方案
- 生产服务器新建加密目录
/opt/pay-cert,权限chmod 600; - 部署脚本从加密文件服务器拉取 pem 证书,不提交代码库;
- Nacos 仅配置文件路径,密钥文件脱离配置中心独立管控。
第二部分 Apollo 配置中心存储支付敏感参数
Apollo 无内置加密,采用Apollo 加密组件 + 独立加解密工具实现敏感密钥加密存储。
1. Apollo 环境与命名空间规划
- 环境划分:dev/test/pro;生产环境独立 Apollo 集群,不和测试共用;
- 新建私有 Namespace:
PayConfig,权限仅支付负责人可编辑; - 关闭公共 Namespace 写入权限,防止其他人篡改支付参数。
2. Apollo 加密组件接入(apollo-crypto)
2.1 引入加密依赖
xml
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> </dependency> <!-- Apollo加密扩展包 --> <dependency> <groupId>com.github.liuweijw</groupId> <artifactId>apollo-crypto-spring-boot-starter</artifactId> <version>1.2.0</version> </dependency>2.2 本地 application.yml 配置加解密密钥
加解密主密钥保存在服务器环境变量,不存入 Apollo:
yaml
apollo: crypto: # 从服务器环境变量读取,不写死文件 secret-key: ${PAY_CRYPTO_SECRET}2.3 Apollo 后台配置参数(明文转密文存储)
- 使用工具类将支付宝私钥、微信 v3 密钥加密,密文前缀自定义
crypto:; - Apollo PayConfig 命名空间配置:
properties
# 明文普通配置 alipay.app-id=2021001117648123 alipay.notify-url=https://xxx.com/api/pay/alipay/notify # 加密敏感配置,前缀标记 alipay.private-key=crypto:xxxxxxxxxxxx wechat-pay.api-v3-key=crypto:yyyyyyyyyyyy2.4 自定义注解自动解密字段
自定义@CryptoValue注解,配合 Apollo 加密 starter 自动解密:
java
运行
@Data @Configuration @ConfigurationProperties(prefix = "wechat-pay") public class WechatPayConfig { private String mchId; private String mchSerialNo; private String notifyUrl; private String privateKeyPath; private String platformCertPath; @CryptoValue private String apiV3Key; }框架自动识别crypto:前缀,使用本地密钥解密后注入明文。
3. Apollo 安全增强方案
- 生产 Apollo 开启管理员审批流:修改支付密钥必须运维审批才能发布;
- 开启配置推送日志,密钥变更实时推送告警;
- 生产 Apollo 数据库加密存储所有配置,防止拖库泄露密钥;
- 服务启动时校验环境变量
PAY_CRYPTO_SECRET,缺失直接拒绝启动,避免无密钥解密。
第三部分 Nacos / Apollo 通用生产安全规范
1. 环境严格隔离(资金安全核心)
- 开发:支付宝沙箱、微信测试号,独立一套密钥;
- 生产:企业正式商户,独立命名空间 / 集群,禁止测试环境读取生产配置;
- 禁止通过配置中心切换网关地址,线上网关硬编码固定正式地址。
2. 密钥分层隔离逻辑
- 配置中心存储:加密后的支付业务密钥(支付宝私钥、微信 v3 key);
- 项目本地 / 服务器环境变量存储:配置中心解密主密钥(RSA/AES 密钥);
- 证书 pem 文件:服务器独立加密目录存放,完全脱离配置中心; 三层密钥分离,单一节点泄露不会导致支付资金被盗。
3. 禁止的危险操作
- ❌ 配置中心存放明文私钥、API 密钥;
- ❌ 开发环境复用生产商户配置;
- ❌ 解密主密钥写入代码、提交 Git;
- ❌ 日志直接打印完整支付配置实体类;
- ❌ 匿名访问配置中心后台。
4. 故障兜底方案
- 配置中心宕机兜底:服务器本地备用配置文件(全部加密),服务启动降级读取本地密文;
- 密钥定期轮换:每 90 天更换支付宝 RSA 密钥、微信 APIv3 密钥,配置中心动态刷新无需重启;
- 配置备份:每日自动导出加密配置备份,不导出明文。
第四部分 两种配置中心选型对比
表格
| 特性 | Nacos | Apollo |
|---|---|---|
| 内置加密 | 自带 RSA 加密,开箱即用 | 无内置,需第三方加密组件 |
| 权限管控 | 命名空间 + 分组双层隔离 | Namespace 独立权限 + 审批流 |
| 推荐场景 | 微服务 SpringCloud 电商,简单快速接入 | 大型多团队、严格配置变更审批企业 |
| 敏感参数维护成本 | 低,后台直接生成密文 | 高,需本地工具加密后录入后台 |
| 支付场景首选 | 中小型电商 SP 项目 | 中大型集团电商多商户支付系统 |
