【问题标题】:Https config dosn't work in zuul routingHttps 配置在 zuul 路由中不起作用
【发布时间】:2017-11-25 07:44:22
【问题描述】:

我有一个带有 zuul 的路由器应用程序和许多在后端运行的服务,来自客户端的请求由 zuul 路由到他们的服务。

一切都在 http 上运行良好,但是当我将路由器和所有服务配置为 https 时,出现以下错误:

javax.net.ssl.SSLPeerUnverifiedException: Certificate for <127.0.0.1> doesn't match any of the subject alternative names: []
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.verifyHostname(SSLConnectionSocketFactory.java:467) ~[httpclient-4.5.3.jar:4.5.3]
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:397) ~[httpclient-4.5.3.jar:4.5.3]
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:355) ~[httpclient-4.5.3.jar:4.5.3]
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142) ~[httpclient-4.5.3.jar:4.5.3]

zuul yml 文件:

zuul:
  ignoredPatterns: /reza,/we
  routes:
    trp:
      path: /micro1/**
      sensitiveHeaders:
      url: https://127.0.0.1:8080/micro1
server:
    compression:
        enabled: true
    port: 80
    ssl:
        key-store: classpath:keystore.jks
        key-store-password: password
        key-password: matin1234  

以及其中一项服务的 yml 文件:

server:
    compression:
        enabled: true
    port: 8080
    ssl:
        key-store: classpath:keystore.jks
        key-store-password: password
        key-password: matin1234

首先我想知道 https over zuul 的概念是否正常工作,其次我想知道如何解决我的问题。

注意:我没有 Eureka 服务器注册。

【问题讨论】:

  • 这个错误是否与主机名验证有关?
  • 你用的是什么版本的Spring Cloud?
  • 它的版本是1.5.2
  • 1.5.2 不是一个版本。您使用的是 Angel、Brixton、Camden 还是 Dalston?

标签: https routing microservices spring-cloud netflix-zuul


【解决方案1】:

这是因为您的证书使用“主题名称 (DN)”自签名,与 127.0.0.1 不匹配。您有两种选择:

更新:

刚刚注意到你的问题:

想知道https over zuul的概念

通常没有人支持 zuul 和底层微服务之间的 HTTPS,因为:

  • 影响性能。想象一下,您所有的微服务都使用 HTTPS 进行内部通信。与纯 HTTP 通信相比,HTTPS 加密、解密、握手等更消耗资源。
  • 所有微服务都支持 HTTPS 会让人哭笑不得。在大型系统中,您有数百个(或数千个微服务)更改证书,因为其中一些证书已过期。

一个常见的用例是让您的 API 网关通过 HTTPS 运行。但是从网关到底层服务的通信以及微服务之间的相互通信应该是通过 HTTP 进行的。问题是,无论如何您必须专注于微服务的安全网络,而不是它们之间的安全通信。网关下的系统应使用任何人都不应访问的专用网络。

在某些情况下,您必须在微服务之间使用 HTTPS 才能增加一层安全性,但这并不常见,并且主要与银行业务相关。另一方面,您可以将 HTTPS 添加到具有非常敏感数据的服务中,而其余的可以保留在 HTTP 上。这更多是您的要求的问题。

【讨论】:

  • 必须创建路由器的Dn或服务应用程序的Dn?
  • 要解决这个问题,我猜应该是服务应用程序。
  • 我已经用关于 HTTPS、API 网关和微服务概念的信息更新了我的答案。希望对您有所帮助。
  • @dzatorsky:假设 API 网关部署在公共网络上,例如:Heroku。这将如何与托管在专用网络上的服务交互?服务注册中心需要托管在哪里,以便它可以在专用网络上注册服务并帮助 API 网关识别它​​们?
【解决方案2】:
  1. 为了使用 https 服务,如果他们使用自签名证书,您必须信任该服务提供的证书。为此,您必须配置信任库,而不是密钥库

  2. 如果服务的自签名证书 DN 和域名不匹配,则必须配置 zuul 以禁用该验证 - 但请注意,不建议在生产中这样做 配置如下:

    zuul.sslHostnameValidationEnabled=false
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2017-12-23
    • 2016-06-05
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多