Skip to content

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 配置,其实它分为两部分:

  1. Server 端 SSL (前端 HTTPS)

    • 方向:Client (Browser) -> Gateway。
    • 配置位置server.ssl.*
    • 作用:让网关支持 HTTPS 访问,给用户一把小绿锁。这属于 Spring Boot Web 容器(如 Netty/Tomcat)的标准配置。
  2. Client 端 SSL (后端 HTTPS)

    • 方向:Gateway -> Microservice。
    • 配置位置spring.cloud.gateway.httpclient.ssl.*
    • 作用:网关作为客户端去调用下游的 HTTPS 服务。
    • 常见坑:如果下游服务用的是自签名证书(测试环境常见),网关默认会报错 PKIX path building failed
      • 临时解法:开启 useInsecureTrustManager: true(信任所有,裸奔模式)。
      • 正规解法:把下游的证书导入到网关的 trustedX509Certificates 中。

Based on Spring Framework.