【问题标题】:Converting HTTP traffic to HTTPS将 HTTP 流量转换为 HTTPS
【发布时间】:2022-03-13 22:15:13
【问题描述】:

我需要使所有现有的微服务端点连接从 HTTP 转移到 HTTPS,以便它满足业务需求,同时减少开销。

首先,我正在考虑将 Envoy 作为转发代理运行,它将所有来自同一本地主机的传出 HTTP 传输转换为 HTTPS 转发到其预期目的地。在预期的目的地,为避免任何应用程序更改,我还将有一个相应的 Envoy 侧车,但配置为反向代理,以便它将传入的 HTTPS 请求转换为原始 HTTP 端点,以便应用程序无缝工作。

这是迄今为止最好的方法吗,因为我正在尝试在不触及任何现有代码的情况下实现解决方案,以便可以将其扩展到所有 springboot 微服务

【问题讨论】:

  • 您对术语 forward 和 reverse 的使用是从前到后的,尽管可以说两者实际上都是反向代理。您没有解释要求,因此无法说您的解决方案是否合适或最佳

标签: http https proxy reverse envoyproxy


【解决方案1】:

如果我总结了你想要的,你想实现这样的东西:

有两个 Envoy(命名为前端和后端),通过 HTTPS 相互通信。但是,来自前端和来自后端的流量是未加密的 (HTTP)。如果您的应用只支持 HTTP,那很好,因为您不必更改代码中的任何内容。为每个应用添加具有相同配置的 Sidecar(以及相同的 TLS 证书?)可能非常麻烦,但这是要付出的代价。

我不知道你在哪里运行你的应用程序,但是如果你在 Kubernetes 之类的东西上运行它们,那么如果后端 Envoy 和你的应用程序都在一个 pod 中,那么它们之间的未加密流量就可以了(基于此答案:https://stackoverflow.com/a/48520864)。无论如何,只要 sidecar 和应用程序通过localhost 进行通信,那么一切都应该没问题(https://security.stackexchange.com/a/44617)。

在您的网络中添加 HTTPS 非常棒,因为它可以防止恶意用户窃听您的流量。这可能超出了问题的范围,但从我的角度来看,在您的网络中添加 HTTPS only 是不够的。如果有人拦截了从您的客户端到前端 Envoy(HTTP,未加密)的请求,会发生什么?您可能需要考虑将 HTTPS 支持也添加到前端 Envoy。如果设计得当,从 Internet 窃听客户端请求的风险可能比在网络内部更大。

无论如何,如果您想实现上述模式,那么您可以使用 Envoy 轻松做到这一点 :) 它需要一些配置。假设前端 Envoy 监听 8080,后端 Envoy 监听 8443,你的应用监听 5000,下面的配置就可以了:

前端 Envoy 配置:

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 8080
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          codec_type: AUTO
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: envoy-backend
          http_filters:
          - name: envoy.filters.http.router

  clusters:
  - name: envoy-backend
    connect_timeout: 5s
    type: LOGICAL_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: envoy-backend
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: envoy-backend
                port_value: 8443
    transport_socket:
      name: envoy.transport_sockets.tls # required to communicate in HTTPS
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext

后端 Envoy 配置:

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 8443
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          codec_type: AUTO
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: app
          http_filters:
          - name: envoy.filters.http.router
      transport_socket:
        name: envoy.transport_sockets.tls # TLS configuration
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
          common_tls_context:
            tls_certificates:
            - certificate_chain:
                filename: "/etc/https.crt"
              private_key:
                filename: "/etc/key.pem"

  clusters:
  - name: app
    connect_timeout: 5s
    type: LOGICAL_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: app
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 127.0.0.1 # sidecar and app should communicate using localhost
                port_value: 5000

【讨论】:

    猜你喜欢
    • 2019-07-19
    • 2019-12-12
    • 2011-12-22
    • 2018-12-30
    • 2019-02-08
    • 2016-06-27
    • 1970-01-01
    • 2017-06-09
    • 2017-01-10
    相关资源
    最近更新 更多