为Consul、网关和微服务配置HTTPS导致ZuulException: Forwarding error
Configuring HTTPS for Consul, gateway and microservice results in ZuulException: Forwarding error
情况
我用一个微服务网关、一个微服务应用程序和用于服务发现的 Consul 实现了一个 JHipster 微服务应用程序。只要我使用 HTTP,它就可以完美运行,但考虑到在生产中使用未加密的连接是不可行的选择。
因此我修改了所有配置文件以使用 TLS/HTTPS,如下所示:
Gateway/Microservice, 应用-tls.yml:
server:
ssl:
key-store: classpath:config/tls/keystore.jks
key-store-type: JKS
key-alias: selfsigned
key-store-password: password
ciphers: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
enabled-protocols: TLSv1.2
jhipster:
http:
version: V_2_0
spring:
cloud:
consul:
discovery:
scheme: https
网关和微服务 TLS 配置除了密钥库的内容外是相同的(它们都有自己的密钥对)。
问题
Consul 和两个 Spring 引导应用程序启动时没有任何错误,并且在 Consul 中正确注册。
但是,通过网络浏览器访问网关应用程序会导致网关应用程序出现以下错误:
图形界面
Http failure response for https://localhost:8080/<MICROSERVICE-NAME>/api/<RESOURCE-NAME>: 500 OK
堆栈跟踪
com.netflix.zuul.exception.ZuulException: Forwarding error
...
at de.<MY-ORG>.<MY-PROJECT>.gateway.security.jwt.JWTFilter.doFilter(JWTFilter.java:38)
...
Caused by: com.netflix.client.ClientException: null
...
Caused by: java.lang.RuntimeException: org.apache.http.NoHttpResponseException: <MY-IP>:8081 failed to respond
8081 是我的微服务应用的端口。
因此,无法访问微服务的任何 API,也无法使用任何功能(例如 CRUD)。
自己解决了。使用的是旧版本的 JHipster (5.8.2)。升级到 6.2.0 就成功了。
情况
我用一个微服务网关、一个微服务应用程序和用于服务发现的 Consul 实现了一个 JHipster 微服务应用程序。只要我使用 HTTP,它就可以完美运行,但考虑到在生产中使用未加密的连接是不可行的选择。
因此我修改了所有配置文件以使用 TLS/HTTPS,如下所示:
Gateway/Microservice, 应用-tls.yml:
server:
ssl:
key-store: classpath:config/tls/keystore.jks
key-store-type: JKS
key-alias: selfsigned
key-store-password: password
ciphers: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
enabled-protocols: TLSv1.2
jhipster:
http:
version: V_2_0
spring:
cloud:
consul:
discovery:
scheme: https
网关和微服务 TLS 配置除了密钥库的内容外是相同的(它们都有自己的密钥对)。
问题
Consul 和两个 Spring 引导应用程序启动时没有任何错误,并且在 Consul 中正确注册。
但是,通过网络浏览器访问网关应用程序会导致网关应用程序出现以下错误:
图形界面
Http failure response for https://localhost:8080/<MICROSERVICE-NAME>/api/<RESOURCE-NAME>: 500 OK
堆栈跟踪
com.netflix.zuul.exception.ZuulException: Forwarding error
...
at de.<MY-ORG>.<MY-PROJECT>.gateway.security.jwt.JWTFilter.doFilter(JWTFilter.java:38)
...
Caused by: com.netflix.client.ClientException: null
...
Caused by: java.lang.RuntimeException: org.apache.http.NoHttpResponseException: <MY-IP>:8081 failed to respond
8081 是我的微服务应用的端口。
因此,无法访问微服务的任何 API,也无法使用任何功能(例如 CRUD)。
自己解决了。使用的是旧版本的 JHipster (5.8.2)。升级到 6.2.0 就成功了。