TLS 和 SSL
网关可以通过遵循常规的 Spring 服务器配置来监听 HTTPS 请求。 以下示例展示了如何进行配置:
application.yml
yaml
server:
ssl:
enabled: true
key-alias: scg
key-store-password: scg1234
key-store: classpath:scg-keystore.p12
key-store-type: PKCS12您可以将网关路由到 HTTP 和 HTTPS 后端。 如果您要路由到 HTTPS 后端,您可以使用以下配置将网关配置为信任所有下游证书:
application.yml
yaml
spring:
cloud:
gateway:
httpclient:
ssl:
useInsecureTrustManager: true使用不安全的信任管理器(useInsecureTrustManager: true)不适合生产环境。 对于生产部署,您可以使用以下配置为网关配置一组它可以信任的已知证书:
application.yml
yaml
spring:
cloud:
gateway:
httpclient:
ssl:
trustedX509Certificates:
- cert1.pem
- cert2.pem如果未向 Spring Cloud Gateway 提供受信任的证书,则使用默认的信任库(您可以通过设置 javax.net.ssl.trustStore 系统属性来覆盖它)。
1. TLS 握手 (TLS Handshake)
网关维护一个客户端池,它使用该池路由到后端。 通过 HTTPS 通信时,客户端会发起 TLS 握手。 有一些超时与此握手相关联。 您可以按如下方式配置这些超时(显示的是默认值):
application.yml
yaml
spring:
cloud:
gateway:
httpclient:
ssl:
# 握手超时时间(毫秒)
handshake-timeout-millis: 10000
# 关闭通知刷新超时时间(毫秒)
close-notify-flush-timeout-millis: 3000
# 关闭通知读取超时时间(毫秒)
close-notify-read-timeout-millis: 0补充教学 —— 网关与 SSL 的两种关系
很多初学者容易搞混网关的 SSL 配置,其实它分为两部分:
Server 端 SSL (前端 HTTPS):
- 方向:Client (Browser) -> Gateway。
- 配置位置:
server.ssl.*。 - 作用:让网关支持 HTTPS 访问,给用户一把小绿锁。这属于 Spring Boot Web 容器(如 Netty/Tomcat)的标准配置。
Client 端 SSL (后端 HTTPS):
- 方向:Gateway -> Microservice。
- 配置位置:
spring.cloud.gateway.httpclient.ssl.*。 - 作用:网关作为客户端去调用下游的 HTTPS 服务。
- 常见坑:如果下游服务用的是自签名证书(测试环境常见),网关默认会报错
PKIX path building failed。- 临时解法:开启
useInsecureTrustManager: true(信任所有,裸奔模式)。 - 正规解法:把下游的证书导入到网关的
trustedX509Certificates中。
- 临时解法:开启