无法将 HAProxy 实现为 HTTPS 的转发代理

2024-04-20

我正在尝试使用 HAProxy 作为转发代理。它适用于 HTTP,但不适用于 HTTPS。
下面是我的 HTTP HAProxy 配置

listen forward_http_proxy
    bind *:80

    http-request do-resolve(txn.dstip,mydns) hdr(Host),lower
    http-request set-dst var(txn.dstip)
    
    server proxy_server *

使用上面的配置我得到正确的结果如下

> requests.get("http://api.ipify.org?format=json", proxies={'http': 'http://myproxy.server:80'}).text
> '{"ip":"15.12.XX.XX"}'

我的HTTPS配置如下

listen forward_https_proxy
    bind *:5248 ssl crt /etc/ssl/my.domain.combined.pem

    http-request do-resolve(txn.dstip,mydns) hdr(Host),lower
    http-request set-dst var(txn.dstip)
    http-request set-dst-port hdr(x-port)

    server proxy_https_server * ssl verify none

现在,当我尝试如下所示的 HTTPS 时,会出现错误

> requests.get("https://api.ipify.org?format=json", proxies={'http': 'https://myproxy.server:5248'}, verify=False).text
HAProxy Error Log >> Jul  9 17:56:40 ip-12-2-XX-XXX haproxy[3996]: XXX.XX.XXX.XX:26306 [09/Jul/2021:17:56:40.345] forward_https_proxy/1: SSL handshake failure

cURL 输出如下

> curl -X GET https://api.ipify.org --proxy https://myproxy.server:5248 --verbose
Note: Unnecessary use of -X or --request, GET is already inferred.
*   Trying XX.X.X.XX:5248...
* TCP_NODELAY set
* Connected to myproxy.server (XX.X.X.XX) port 5248 (#0)
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256
* ALPN, server did not agree to a protocol
* Proxy certificate:
*  subject: OU=Domain Control Validated; CN=*.myproxy.server
*  start date: Jun  7 07:00:34 2021 GMT
*  expire date: Jul  7 10:24:05 2022 GMT
*  subjectAltName: host "myproxy.server" matched cert's "*.myproxy.server"
*  issuer: C=US; ST=Arizona; L=Scottsdale; O=GoDaddy.com, Inc.; OU=http://certs.godaddy.com/repository/; CN=Go Daddy Secure Certificate Authority - G2
*  SSL certificate verify ok.
* allocate connect buffer!
* Establish HTTP proxy tunnel to api.ipify.org:443
> CONNECT api.ipify.org:443 HTTP/1.1
> Host: api.ipify.org:443
> User-Agent: curl/7.68.0
> Proxy-Connection: Keep-Alive
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):

在最后一行之后,它只是继续等待,什么也没有发生。

的输出haproxy -vv如下

HA-Proxy version 2.2.14-1ppa1~focal 2021/04/29 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2025.
Known bugs: http://www.haproxy.org/bugs/bugs-2.2.14.html
Running on: Linux 5.8.0-1038-aws #40~20.04.1-Ubuntu SMP Thu Jun 17 13:25:28 UTC 2021 x86_64
Build options :
  TARGET  = linux-glibc
  CPU     = generic
  CC      = gcc
  CFLAGS  = -O2 -g -O2 -fdebug-prefix-map=/build/haproxy-3dgaC8/haproxy-2.2.14=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wall -Wextra -Wdeclaration-after-statement -fwrapv -Wno-address-of-packed-member -Wno-unused-label -Wno-sign-compare -Wno-unused-parameter -Wno-clobbered -Wno-missing-field-initializers -Wno-stringop-overflow -Wno-cast-function-type -Wtype-limits -Wshift-negative-value -Wshift-overflow=2 -Wduplicated-cond -Wnull-dereference
  OPTIONS = USE_PCRE2=1 USE_PCRE2_JIT=1 USE_OPENSSL=1 USE_LUA=1 USE_ZLIB=1 USE_SYSTEMD=1
  DEBUG   = 

Feature list : +EPOLL -KQUEUE +NETFILTER -PCRE -PCRE_JIT +PCRE2 +PCRE2_JIT +POLL -PRIVATE_CACHE +THREAD -PTHREAD_PSHARED +BACKTRACE -STATIC_PCRE -STATIC_PCRE2 +TPROXY +LINUX_TPROXY +LINUX_SPLICE +LIBCRYPT +CRYPT_H +GETADDRINFO +OPENSSL +LUA +FUTEX +ACCEPT4 -CLOSEFROM +ZLIB -SLZ +CPU_AFFINITY +TFO +NS +DL +RT -DEVICEATLAS -51DEGREES -WURFL +SYSTEMD -OBSOLETE_LINKER +PRCTL +THREAD_DUMP -EVPORTS

Default settings :
  bufsize = 16384, maxrewrite = 1024, maxpollevents = 200

Built with multi-threading support (MAX_THREADS=64, default=1).
Built with OpenSSL version : OpenSSL 1.1.1f  31 Mar 2020
Running on OpenSSL version : OpenSSL 1.1.1f  31 Mar 2020
OpenSSL library supports TLS extensions : yes
OpenSSL library supports SNI : yes
OpenSSL library supports : TLSv1.0 TLSv1.1 TLSv1.2 TLSv1.3
Built with Lua version : Lua 5.3.3
Built with network namespace support.
Built with zlib version : 1.2.11
Running on zlib version : 1.2.11
Compression algorithms supported : identity("identity"), deflate("deflate"), raw-deflate("deflate"), gzip("gzip")
Built with transparent proxy support using: IP_TRANSPARENT IPV6_TRANSPARENT IP_FREEBIND
Built with PCRE2 version : 10.34 2019-11-21
PCRE2 library supports JIT : yes
Encrypted password support via crypt(3): yes
Built with gcc compiler version 9.3.0
Built with the Prometheus exporter as a service

Available polling systems :
      epoll : pref=300,  test result OK
       poll : pref=200,  test result OK
     select : pref=150,  test result OK
Total: 3 (3 usable), will use epoll.

Available multiplexer protocols :
(protocols marked as <default> cannot be specified using 'proto' keyword)
            fcgi : mode=HTTP       side=BE        mux=FCGI
       <default> : mode=HTTP       side=FE|BE     mux=H1
              h2 : mode=HTTP       side=FE|BE     mux=H2
       <default> : mode=TCP        side=FE|BE     mux=PASS

Available services : prometheus-exporter
Available filters :
    [SPOE] spoe
    [COMP] compression
    [TRACE] trace
    [CACHE] cache
    [FCGI] fcgi-app

我已经经历过这个帖子 https://stackoverflow.com/questions/49433417/setup-https-forward-proxy-with-haproxy还有更多其他帖子,但没有成功。

我这样做是因为我不想同时管理 Squid 和 HAProxy。
如果我做错了什么,或者 HAProxy 不适合我想要实现的目标,请告诉我。

UPDATE:我将改变我的方法来解决这个问题。参考HAProxy 问题回复 https://github.com/haproxy/haproxy/issues/1447#issuecomment-963675990


您需要添加sni http://cbonte.github.io/haproxy-dconv/2.4/configuration.html#5.2-sni到服务器线。
文档中的建议是使用ssl_fc_sni http://cbonte.github.io/haproxy-dconv/2.4/configuration.html#7.3.4-ssl_fc_sni

Untested

server proxy_https_server * ssl verify none sni ssl_fc_sni 

or

server proxy_https_server * ssl verify none sni %[ssl_fc_sni]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法将 HAProxy 实现为 HTTPS 的转发代理 的相关文章

  • 是否可以为 IP 地址而不是域名提供 SSL 证书? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望我的网站使用类似的 URLhttp 192 0 2 2 and https 192 0 2 2 用于静态内容 以避免请求中不必要的
  • 使用节点http代理转发http代理

    我正在使用 node http proxy 库来创建转发代理服务器 我最终计划使用一些中间件来动态修改 html 代码 这就是我的代理服务器代码的样子 var httpProxy require http proxy httpProxy c
  • 如何通过 SSL 将文件直接上传到 S3?

    我已经使用基于浏览器的 Amazon S3 直接 POST 上传有一段时间了 最 近想开始通过 HTTPS 发布 普通的 HTTP 帖子就可以正常工作 但是 当我将相同的表格发布到https s3 amazonaws com https s
  • Spring AOP生成的代理类的位置

    只是为了学习和理解代理 我想看看Spring AOP生成的代理类 它不存在于 Eclipse 生成的类文件夹中 有人可以告诉我它的位置吗 如果您使用基于接口的代理 默认 Spring 使用Proxy http docs oracle com
  • 如何在不更改源代码的情况下禁用 TLSv1?

    我编写了一个测试代码 不是 HTTPS 来使用 JDK8 测试 TLS 当测试代码运行时 我使用nmap工具扫描并得到结果如下 D softwares nmap 7 12 gt nmap p xxxx script ssl x x x x
  • SSL 连接在 MySQL Workbench 中有效,但在 DBeaver 中无效

    为当今读者编辑 这是旧版本 DBeaver 中的一个错误 随后已修复 我尝试在 DBeaver 中使用 SSL 连接到 Google Cloud SQL MySQL 实例时遇到 访问被拒绝 错误 我能够 在 MySQL Workbench
  • 在node.js中使用socket.io设置服务器-服务器SSL通信

    我正在尝试使用 socket io 通过 ssl 连接来设置服务器到服务器的链接 这是我的例子 Server var app require express var config require config var https requi
  • tomcat 7 + ssl 不工作 - ERR_SSL_VERSION_OR_CIPHER_MISMATCH

    Ubuntu 14 tomcat 7 java 7 our crt our key 和 gd bundle g2 g1 crt 由 godaddy 提供 该捆绑包中有 3 个证书 通过查看文件可以看出 请注意 我们的密钥和 crt 在 no
  • SSL 握手警报:升级到 Java 1.7.0 后出现 unrecognized_name 错误

    我今天从 Java 1 6 升级到 Java 1 7 从那时起 当我尝试通过 SSL 与我的网络服务器建立连接时 就会发生错误 javax net ssl SSLProtocolException handshake alert unrec
  • 双向 SSL 说明

    我对双向 SSL 的工作原理有些困惑 客户端如何创建其证书以发送到服务器 是从服务器生成并分发给客户端吗 另外 双向 SSL 相对于单向 SSL 有何优势 两个证书在连接之前都应该存在 它们通常由证书颁发机构创建 不一定相同 在其他情况下
  • C# 自动检测代理设置

    C 2008 SP1 我正在使用代码来检测是否已在 Internet 选项 下设置代理 如果有代理 那么我将在我的网络客户端中设置它 所以我只是检查代理的地址是否存在 如果没有 则说明 Web 客户端中没有要设置的代理 这是执行此操作的正确
  • Tomcat 托管具有多个 SSL 证书的多个虚拟主机

    例如 我有一台使用 Tomcat 7 托管多个网站的服务器 a abc com b abc com c def com d def com 使用tomcat的虚拟主机功能 因此它们各自可能属于不同的webapps文件夹 我们现在正在尝试为每
  • Android:从 https url 获取响应

    问候 我正在开发一个 Android 应用程序 需要通过 https 打开一个 url 带有 POST 参数 并获取响应 我有一个自签名证书 这让情况更加复杂 我还需要接受cookies 有人知道从哪里开始吗 提前谢谢了 Android 附
  • 在 Spring Boot application.properties 中指定信任存储信息

    我在用springBoot版本1 2 0 RELEASE 我正在尝试通过配置我的密钥库和信任库application properties 当我添加以下设置时 我可以使密钥库正常工作 但不能使信任库正常工作 server ssl key s
  • 无对等证书例外 - Volley 和具有自签名证书的 Android

    我正在尝试让我的应用程序通过 https 与我的服务器通信 由于我不想付费让受信任的 CA 签署我的服务器证书 解决方案是使用自签名证书 因此 我创建了 caconfig cnf 如下所示 ca default ca CA default
  • 使用单个“proxyServer”将 Websocket 代理到多个目标

    我正在开发一个nodeJS websocket代理服务器 用例是当 websocket 请求到来时 我将检查其凭据 添加新标头 然后根据其组 来自用户 ID 将 websocket 连接重定向到其目标 webscoket 服务器 我发现大多
  • if 不是 localhost 语句 htaccess

    我目前强迫访问者通过 https 访问我的所有网站 主要是 Wordpress 我使用以下代码 RewriteEngine On RewriteCond HTTPS on RewriteRule https SERVER NAME REQU
  • 通过 HTTPS 加载页面但请求不安全的 XMLHttpRequest 端点

    我有一个页面 上面有一些 D3 javascript 该页面位于 HTTPS 网站内 但证书是自签名的 当我加载页面时 我的 D3 可视化效果不显示 并且出现错误 混合内容 页面位于 https integration jsite com
  • nginx代理认证拦截

    我有几个服务 它们支持 nginx 实例 为了处理身份验证 在 nginx 中 我拦截每个请求并将其发送到身份验证服务 在那里 如果凭据正确 我将设置一个包含用户相关信息的 cookie 现在 请求应该被路由到适当的服务 并设置 cooki
  • 使用 Connect 和 node-http-proxy 的 HTTP 代理

    在开发过程中 我需要一个 HTTP 代理来访问外部 API 以绕过跨域安全限制 我在这里找到了一些示例代码 http nthloop com blog local dev with nodejs proxy http nthloop com

随机推荐

  • 我可以在外部 DLL 中使用 ASP.NET Session[] 变量吗

    我有两个项目 一个是 DLL 项目 其中包含我所有的逻辑和数据访问内容 另一个是 ASP NET 项目 它负责我的表单等 我有一点困惑 我想如果我将 System Web 命名空间引用添加到 DLL 项目中 我将能够引用 ASP NET 页
  • ios swift - 关闭导航控制器的根视图控制器

    我通过单击主视图控制器的按钮打开导航控制器 我以编程方式在导航控制器上创建一个左栏按钮项目 我想关闭导航控制器并返回到我的主控制器 我本质上是回到导航控制器的根视图控制器 我试过了 navigationController dismissV
  • 无效的源反射宏:has_many:through

    我有这样愤怒的联想 融资 gt 事件 gt 子项目 gt 项目 我想通过所有程序访问last financings 所以代码是 class Fcp lt Program has many fcp subprograms foreign ke
  • 对齐 Google 地图标记片段中的文本

    我希望片段中的字符串与中心对齐 另外 代码片段中的换行符 n 被转换为空格 有没有办法插入换行符 我的相关代码 GoogleMap map map addMarker new MarkerOptions position pos title
  • MediaPlayer 的状态更改侦听器

    这张图中有很多states http developer android com reference android media MediaPlayer html StateDiagram 但使用标准监听器我只能监听一些基本状态 那么是否可
  • Excel 不应用 HTML 中的 mso-number-format

    这是我的情况 我有简单的 Excel OOXML 文件 http www filedropper com excel 1通过 Web 查询连接到我的服务器 所有带有日期的单元格都具有 常规 水平对齐方式 无对齐方式 和 MM DD YYYY
  • 如何在 json 文件中插入现有的 php 字符串文字?

    我有一个 php 脚本 它通过使用访问 json 文件file get contents 在 json 文件中 我们声明了一个 php 变量 请让我知道是否有任何方法可以解析 json 文件中的 php 变量 下面是代码 测试 json r
  • 在django中批量创建模型对象

    我有很多对象要保存在数据库中 所以我想用它来创建模型实例 使用 django 我可以创建所有模型实例 MyModel data 然后我想把它们全部保存下来 目前 我有类似的东西 for item in items object MyMode
  • 如何获取 ActionMailer 的 after_action 过滤器中的操作名称

    在下面的课程中 如何获取当前操作名称 即email confirmation password reset 在 的里面after action打回来add mandril headers class UserMailer lt Action
  • 是否有同时支持 RSS 和 ATOM 的 PHP 提要阅读器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何跨多个域重用代码?

    我只是使用 Yii 框架构建了一个 CMS 框架 我想将 CMS 部署到多个域 home root www domain1 com home root www domain2 com home root www domain3 com ho
  • linux 多端口监听socket

    我正在用 C linux 编写一个多线程服务器应用程序 它必须侦听 2 个不同的端口号 例如侦听端口号 3000 和 4000 以便连接到它的不同客户端提供不同的功能 实际功能由工作人员执行 线程 主线程无限期运行并在新连接上产生新工作线程
  • 跨域属性的目的...?

    在图像和脚本标签中 我的理解是您可以访问其他域上的脚本和图像 那么什么时候使用这个属性呢 这是当您想要限制其他人访问您的脚本和图像的能力时吗 Images https developer mozilla org en US docs Web
  • 使用 java 构建 wsdl 的框架或工具

    JAVA中有没有什么优秀的工具来处理webservice或wsdl 是的 有一个标准化的API JAX WS http en wikipedia org wiki JAX WS 甚至集成到 Java 标准 API javax xml ws包
  • 延迟加载 Facebook Like 按钮脚本

    Google pagespeed 正在抱怨我的 facebook 之类的按钮脚本 我怎样才能推迟脚本 在初始页面加载期间解析了 45KiB 的 JavaScript 延迟解析 JavaScript 用于减少页面渲染的阻塞 http stat
  • 如何使用多个 ssh 密钥 [重复]

    这个问题在这里已经有答案了 GitHub 用户 我是 github 的新手 并且在 git 设置方面遇到一些问题 我在 github 上有 2 个不同用户的帐户 并且我在系统上设置了 git 2 次 First ssh文件夹 像往常一样 包
  • Hibernate @Enumerated 似乎被忽略

    我有课Person使用带有枚举的注释进行映射Sex指的是性别 是男性还是女性 让我们来看看 Entity Table name PERSON public class Person Id GeneratedValue strategy Ge
  • 无需切换 selenium webdriver 即可获取窗口标题

    有没有办法在不进行任何硒切换的情况下获取窗口标题 目前我正在使用下面的代码 public boolean switchToWindowByTitle String title String currentWindow driver getW
  • 是否可以打开 regedit 并使用 process.start 直接导航到特定键?

    我正在制作一个小工具 可以在注册表中写入一个密钥 其中一小部分只是为了方便起见 只需单击一个按钮即可立即导航到该密钥 我已经知道如何打开 regedit exe 但是有没有办法立即导航到我需要的密钥 我正在尝试与 System Diagno
  • 无法将 HAProxy 实现为 HTTPS 的转发代理

    我正在尝试使用 HAProxy 作为转发代理 它适用于 HTTP 但不适用于 HTTPS 下面是我的 HTTP HAProxy 配置 listen forward http proxy bind 80 http request do res