金融级接口必须启用Nginx双向SSL认证(mTLS):配置ssl_verify_client on、指定服务端证书与私钥、加载私有CA根证书、启用CRL检查,并透传客户端DN供后端白名单校验及时间有效性验证。

要让Nginx支撑金融级安全接口,双向SSL认证(mTLS)不是可选项,而是必须项。它确保调用方身份真实可信,从网络层就切断非法访问,比单纯依赖API Key或Token更底层、更可靠。
构建可信的私有CA体系
金融场景严禁使用公网CA签发客户端证书——公信力模型不适用,且无法控制签发策略和生命周期。必须自建私有CA:
- 用OpenSSL或HashiCorp Vault生成根CA密钥(ca.key)和自签名根证书(ca.crt),有效期建议10年
- 服务端证书需含SAN字段,精确匹配域名或IP;客户端证书Subject中CN或OU字段须唯一可识别,如
CN=core-banking-prod,OU=backend,O=BankX - 所有证书统一采用SHA256签名、RSA 2048或ECDSA P-256算法,禁用MD5/SHA1和RSA 1024
Nginx核心配置要点
配置必须落在server块内,不可仅放于location(除非做灰度降级):
-
ssl_certificate和ssl_certificate_key指向服务端证书与私钥 -
ssl_client_certificate /path/to/ca.crt——只加载CA根证书(PEM格式,不含私钥) -
ssl_verify_client on——生产环境禁止设为optional,否则失去认证意义 -
ssl_verify_depth 2——支持根CA+中间CA两级链,满足企业PKI架构 - 启用CRL检查:
ssl_crl /path/to/crl.pem,并定期更新吊销列表
安全加固与后端协同
Nginx完成TLS层校验只是第一步,业务层仍需深度鉴权:
- 通过
proxy_set_header X-Client-DN $ssl_client_s_dn将客户端DN透传给后端 - 后端提取
CN或OU,比对白名单;同时校验证书Not Before/After时间,防系统时钟漂移 - 禁用弱协议:
ssl_protocols TLSv1.2 TLSv1.3;限定强套件:ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 - 添加错误拦截:
error_page 495 496 = @deny_access,返回明确403而非泄露握手细节
验证与上线前必检项
用curl模拟真实调用,确认全流程闭环:
- 成功请求:
curl --cert client.crt --key client.key https://api.bankx.com/v1/transfer - 缺证书应返回400或495;证书过期/吊销应返回495/496;DN不匹配应由后端返回403
- 检查响应头是否含
X-Client-Verify: SUCCESS,确认Nginx已执行校验 - 抓包验证:TLS握手阶段Client Certificate消息存在,且Server Hello含Certificate Request











