带ELB的双向TLS / HTTPS

具有Amazon Elastic Load Balancing的一种方式(或服务器端)TLS / HTTPS已有详细记录

支持双向(或客户端)TLS / HTTPS在文档中不太清楚。

假设ELB正在终止TLS / HTTPS连接:

  • ELB是否支持客户端认证的HTTPS连接?
  • 如果是这样,由ELB服务的服务器是否会收到一个X-Forwarded- *标头来标识由ELB验证的客户端?
  • ELB确实支持TCP转发,因此EC2托管服务器可以建立双向TLS / HTTPS连接,但在这种情况下,我对ELB终止TLS / HTTPS连接和识别客户端感兴趣。


    在双端HTTPS模式下,我不明白它是如何实现的,因为ELB正在建立到后端服务器的第二个TCP连接,并且在内部它正在解密/加密客户端和服务器的有效载荷......所以服务器不会直接看到客户端证书,并且除了-For,-Proto和-Port以外,没有记录的X-Forwarded- *标头。

    另一方面,在ELB运行在TCP模式下的情况下,SSL协商直接在客户端和服务器之间完成,ELB将这些流盲目捆绑在一起。 如果服务器支持PROXY协议,则可以在ELB中启用该功能,以便您可以在服务器上识别客户端的始发IP和端口,并直接识别客户端证书,因为客户端将直接与您协商。但这意味着您不再将SSL卸载到ELB,这可能是您尝试执行操作的一部分。


    更新:

    看起来没有办法做到你想做的一切 - 卸载SSL并识别客户端证书 - 只用ELB。 下面的信息是“为了什么是值得的”。

    很明显,HAProxy在版本1.5中支持客户端证书,并将证书信息传递给X-头。 由于HAProxy也通过配置(通过tcp-request connection expect-proxy )支持PROXY协议......因此,似乎可以想象,您可以在TCP模式ELB后面使用HAProxy,并使用HAProxy终止SSL连接和转发来自ELB的客户端IP /端口信息(通过PROXY协议)以及客户端证书信息发送到应用服务器......因此,您仍然可以保持SSL卸载。

    我提到这一点是因为它似乎是一种补充解决方案,或许比单独的平台更具功能完整性,并且至少在1.4版本中,这两种产品完美地结合在一起 - 我成功地使用了ELB后面的HAProxy 1.4来满足我最大的网络平台(在我的例子中,ELB卸载SSL - 没有客户端证书),尽管级联负载平衡器有明显的冗余,但它似乎是一个坚实的组合。 我喜欢让ELB成为大型互联网上唯一的东西,尽管我没有理由认为直接暴露的HAProxy本身就会有问题。 在我的应用程序中,ELB可以在A / Z中的HAProxies之间取得平衡(我本来也想自动扩展,但即使在繁忙的季节,CPU利用率仍然很低,我从来没有超过一个可用区,我从来没有丢过一个,但......),然后可以在将流量传送到实际平台之前进行一些过滤,转发和消除报头,除了给我一些日志记录,重写和流量 - 我自己没有与ELB分离的控制。


    如果您的后端可以支持客户端身份验证的HTTPS连接本身,您可以使用ELB作为端口443上的TCP到您的后端监听端口上的TCP。 这将使ELB直接将未加密的请求重新发送到您的后端。 此配置也不需要向负载平衡器安装SSL证书。

    更新:使用此解决方案x-forwarded- *标题未设置。


    您可以切换到Elastic Beanstalk上的单个实例,并使用ebextensions上传证书并将nginx配置为相互TLS。

    .ebextensions/setup.config

    files:
      "/etc/nginx/conf.d/00_elastic_beanstalk_ssl.conf":
        mode: "000755"
        owner: root
        group: root
        content: |
          server {
            listen 443;
            server_name example.com;
    
            ssl on;
            ssl_certificate /etc/nginx/conf.d/server.crt;
            ssl_certificate_key /etc/nginx/conf.d/server.key;
            ssl_client_certificate /etc/nginx/conf.d/ca.crt;
            ssl_verify_client on;
    
            gzip on;
    
            send_timeout            300s;
            client_body_timeout     300s;
            client_header_timeout   300s;
            keepalive_timeout       300s;
    
            location / {
              proxy_pass  http://nodejs;
              proxy_http_version  1.1;
              proxy_set_header  Connection "";
              proxy_set_header  Upgrade $http_upgrade;
              proxy_set_header  Host  $host;
              proxy_set_header  X-Real-IP $remote_addr;
              proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    
              proxy_set_header X-SSL-client-serial $ssl_client_serial;
              proxy_set_header X-SSL-client-s-dn $ssl_client_s_dn;
              proxy_set_header X-SSL-client-i-dn $ssl_client_i_dn;
              proxy_set_header X-SSL-client-session-id $ssl_session_id;
              proxy_set_header X-SSL-client-verify $ssl_client_verify;
    
              proxy_connect_timeout   300s;
              proxy_send_timeout      300s;
              proxy_read_timeout      300s;
            }
          }
      "/etc/nginx/conf.d/server.crt":
        mode: "000400"
        owner: root
        group: root
        content: |
          -----BEGIN CERTIFICATE-----
          MIJDkzCCAvygAwIBAgIJALrlDwddAmnYMA0GCSqGSIb3DQEBBQUAMIGJMQswCQYD
          ...
          LqGyLiCzbVtg97mcvqAmVcJ9TtUoabtzsRJt3fhbZ0KKIlzqkeZr+kmn8TqtMpGn
          r6oVDizulA==
          -----END CERTIFICATE-----
      "/etc/nginx/conf.d/server.key":
        mode: "000400"
        owner: root
        group: root
        content: |
          -----BEGIN RSA PRIVATE KEY-----
          MIJCXQIBAAKBgQCvnu08hroXwnbgsBOYOt+ipinBWNDZRtJHrH1Cbzu/j5KxyTWF
          ...
          f92RjCvuqdc17CYbjo9pmanaLGNSKf0rLx77WXu+BNCZ
          -----END RSA PRIVATE KEY-----
      "/etc/nginx/conf.d/ca.crt":
        mode: "000400"
        owner: root
        group: root
        content: |
          -----BEGIN CERTIFICATE-----
          MIJCizCCAfQCCQChmTtNzd2fhDANBgkqhkiG9w0BAQUFADCBiTELMAkGA1UEBhMC
          ...
          4nCavUiq9CxhCzLmT6o/74t4uCDHjB+2+sIxo2zbfQ==
          -----END CERTIFICATE-----
    
    链接地址: http://www.djcxy.com/p/87159.html

    上一篇: way TLS/HTTPS with ELB

    下一篇: Using Primus.io (websockets) behind AWS Elastic Load Balancer