【问题标题】:TLS handshake fail. HTTPS request to HAproxy to http and then encrypt it again to forward request to ssl serverTLS 握手失败。对HAproxy的HTTPS请求到http然后再次加密转发请求到ssl服务器
【发布时间】:2021-10-15 12:39:42
【问题描述】:

需要帮助!!! .我有一个 https 请求,需要拦截它、读取值并将相同的 ssl 请求转发到目的地。我有所有必需的crt、key、CA。我知道 Haproxy ACL 不适用于 L4 层,但我正在尝试找到一种解决方法来解密消息、阅读消息、再次加密并转发。读取消息的原因是使用ACL我需要读取carious请求中的路径差异并将请求相应地路由到不同的服务器。我正在尝试拦截客户端对服务器的请求,默认情况下请求是 SSL,服务器期待 SSL 请求

ssl crt:使用新的 crt-key 对创建了一个新用户,并使用服务器的证书签名请求对服务器中的 CA 进行身份验证

场景是我有一个传入的 SSL 请求,我使用服务器证书将其捕获到 haproxy 的前端,同时将该请求转发到测试网络服务器,我可以看到它已从 HTTPS 更改为 HTTP。现在当我尝试重新加密它时,原始目的地无法接受请求,因为它不是 SSL,我试图在后端添加证书但没有用。请检查我当前的 Haproxy 配置,如果可能,请提供帮助。我不是网络通信/加密/HaProxy 方面的专家。

frontend test
    bind IP:6443 ssl crt <location>
    option httplog
    mode http
    default_backend testback
backend testback
    mode http
    balance roundrobin
    option http-check
    server <host> IP:6443 check fall 3 rise 2 ssl verify required ca-file <loc> crt <loc>

要验证我的证书是否有效且正在连接: openssl s_client -connect :6443 -cert myuser.crt -key myuser.key -CAfile ca.crt 输出:

SSL handshake has read 1619 bytes and written 2239 bytes
Verification: OK

所以我认为证书没有问题,使用 Ha 代理进行连接时会出现问题

错误: 无法连接到服务器:x509:证书指定了不兼容的密钥用法

Ha 代理错误: 2021-08-12T14:45:36.930478+02:00 parasilo-27 haproxy[21562]::34672 [12/Aug/2021:14:45:36.927] server/1: SSL 握手失败 2021-08-12T14:45:37+02:00 localhost haproxy[21562]::34674 [12/Aug/2021:14:45:37.438] server/1: SSL 握手失败

【问题讨论】:

  • 几件事:1. 如果该层是 HTTP 并配置为 mode http,haproxy ACL 可以与 L7 一起使用,您可以这样做。 2. config 看起来没问题。 3.添加一些来自haproxy的日志,一些你提出的请求和你得到的错误,这样更容易找出实际问题
  • 嗨@tbielaszewski,谢谢你的回复。我说错了,我的意思是 ACL 不适用于 L4 (TCP),我现在已经编辑了那部分。在测试了一段时间后,我在一些文档中看到了它。 3) 连接将转发到实际的后端服务器。但服务器无法识别此请求。但是在使用 Haproxy 的普通端口转发中,它可以完美运行。它在 Kubernetes 中工作,我正在尝试在 Kubectl CLI 和 Kubeapi 服务器之间实现一个拦截器
  • 嘿再次@tbielaszewski,我已经记录了错误并重新编辑了整个问题。请看一下。
  • certificate specifies an incompatible key usage 表示 SSL 证书有问题。检查openssl x509 -in /path/to/cert.pem -noout -ext extendedKeyUsage 是否显示类似X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication 或您的客户可能需要的任何其他内容 - 这有时是任意的,需要研究软件文档或猜测。我不知道 kubernetes,所以我无法满足它的需求。您也可以尝试在密钥使用方面比较有效证书和无效证书。
  • 嘿@tbielaszewski,谢谢你,我想这肯定给了我工作的机会。我确实得到了“X509v3 Extended Key Usage: TLS Web Client Authentication”。无论如何我们可以使它适合处理请求吗?我已经搜索了文档、git、stackoverflow 以及所有其他内容,但到目前为止还没有找到任何合适的答案。

标签: linux ssl haproxy


【解决方案1】:

按照要求总结在 cmets 中分析的内容。也许有一天它会对某人有用。
Haproxy 的配置结果是正确的,但生成的证书有错误extended key usage(X509v3 扩展)。 命令列出extended key usage:

openssl x509 -in /path/to/cert.pem -noout -ext extendedKeyUsage

通常,当在互联网上购买时,它会显示X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication。原始发布者使用自签名、自生成的证书,他在 haproxy 前端使用的证书只有 TLS Web Client Authentication,如果使用此扩展,前端需要 TLS Web Server Authentication。
这导致了错误消息:

Error: kubectl get po: Unable to connect to the server: x509: certificate specifies an incompatible key usage

因此,haproxy 记录了SSL handshake failure,没有任何详细信息,这是它的习惯。

将TLS Web Server Authentication添加到haproxy前端部分的证书,将TLS Web Client Authentication添加到haproxy后端部分的证书后,原始海报报告成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2016-10-30
    • 2015-05-19
    • 1970-01-01
    • 2022-06-16
    相关资源
    最近更新 更多