当前位置: 首页 > 知识库问答 >
问题:

通过HTTPS代理传输控制协议

蒋嘉实
2023-03-14

以下是我试图实现的目标:我有一个TCP客户端,需要连接到我们的服务器应用程序,但我需要通过HTTPS进行通信。据我所知,这可以通过反向(或正向?)代理如下:

TCP client <--- HTTPS ---> myproxy.com:443 <------> tcp server app that listen port 7999

我使用以下vhost配置成功创建了一个不带SSL的代理:

<VirtualHost *:80>
    ServerName myproxy.com
    SetEnv proxy-nokeepalive 1
    ProxyErrorOverride off
    ProxyRequests On
    ProxyBadHeader Ignore
    ProxyVia Full
    AllowCONNECT 80 443 7999
</VirtualHost>

(我不确定这些参数中是否有任何一个是不必要的tbh)

使用该vhost,我可以像这样启动与服务器的tcp连接:

telnet myproxy.com 80

> Connected to myproxy.com.

CONNECT myproxy.com:7999 HTTP/1.1
Host: myproxy.com:7999

> HTTP/1.0 200 Connection Established
> Proxy-agent: Apache/2.4.18 (Ubuntu)

一旦我添加SSL并使用端口443,我就无法再连接了:

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName myproxy.com
    SetEnv proxy-nokeepalive 1
    ProxyErrorOverride off
    ProxyRequests On
    ProxyBadHeader Ignore
    ProxyVia Full
    AllowCONNECT 80 443 7999

    SSLProxyEngine On
    SSLEngine On
    SSLCertificateFile...
</VirtualHost>
</IfModule>

如果我尝试连接到此vhost,我会得到以下结果:

telnet myproxy.com 443

> Connected to myproxy.com.

CONNECT myproxy.com:7999 HTTP/1.1
Host: myproxy.com:7999

> Connection closed by foreign host.

我做错了什么,只有使用端口443才能做到这一点吗?键入此命令时,我尝试使用SSL打开的端口80(与上一个vhost相同,但使用<代码>

非常感谢。

共有1个答案

梁丘凯定
2023-03-14

您首先做的是创建一个HTTP代理并向其发出一个普通连接请求。这正如预期的那样。

然后,您所做的是为连接到此代理启用SSL,但再次发出普通连接。由于显式配置了到代理的连接应为SSL而非普通连接,因此此操作如预期的那样失败。这意味着代理期望连接以TLS握手(即客户端发送的ClientHello)开始,而不是一些纯文本HTTP请求。

如果您想使用HTTPS连接到代理,那么您不能使用简单的telnet,因为telnet只使用普通的TCP。您需要使用支持TLS的客户端,例如openssls_client。然后你会得到类似的东西

$ openssl s_client -connect myproxy:443
CONNECTED
...
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ...
---
CONNECT myproxy:7999 HTTP/1.0

HTTP/1.0 200 Connection established
 类似资料:
  • 我正在尝试创建一个bukkit插件,当事件触发时,它将连接到tcp服务器并发送消息。 我已经掌握了基础知识,但我错过了一些东西,我不知道从这里开始。我可以看到该插件与服务器建立了连接,但随后抛出错误并且没有发送任何消息。 我正在尝试理解当事件发生时如何向tcp客户端发送字符串。为了测试,我使用了玩家移动事件。 当我启动时,我在craftbukkit服务器日志中看到以下内容: 当我与我的世界客户端连

  • 问题内容: 我面临着Java6 / 8的奇怪行为。我尝试通过需要基本用户身份验证的代理进行隧道传输。通过标准的Java身份验证器执行此操作。如果我尝试访问https网址作为第一个网址,则会引发异常: java.io.IOException:无法通过代理隧道。代理返回“需要HTTP / 1.1 407代理身份验证” 但是,如果我先访问http URL,然后再访问https URL,则https访问正

  • 我们在部署在k8s集群上的Java应用程序中使用okhttp。我们的源应用程序没有启用istio,并通过特使sidecar连接到目的地。连接链如下所示: SRC-------- 因此,实际上SRC应用程序并不是直接与DST应用程序建立连接,而是与它前面的代理建立连接。当DST应用程序关闭时,它会终止DST和特使之间的所有连接,但SRC和特使之间的连接保持打开状态。这就是为什么SRC应用程序开始收到

  • 问题内容: 我在完全冻结JVM的应用程序中发现一个错误。产生的stacktrace将为开发人员提供有价值的信息,我想从Java控制台中检索它。JVM崩溃时,控制台被冻结,我无法再复制包含的文本。 是否可以将Java控制台直接通过管道传输到文件,或通过其他某种方式访问​​Java应用程序的控制台输出? 更新:我忘记提了,没有更改代码。我是手动测试仪。 更新2:这是在Windows XP下,它实际上是

  • 我有一个由Python构建的API服务器。我需要一组客户端/计算机通过发出http post请求将数据发送到API服务器。 这里的数据实际上是html内容。(注意:我没有将合法数据转换为HTML/XML格式,数据本身就是我从web上收集的HTML),通常每页约200KB。我正试图通过使用串行/串行和压缩来尽可能减轻网络负载。 我正在考虑通过网络发送原始超文本标记语言。有没有类似序列化html对象的

  • 嗨,我一直在尝试代理解决方案,以避免在myapp中的cors问题,但它似乎不起作用,我重启了我的机器这么多次,这没有什么区别。基本上,myapp使用ftchApi调用另一个域(localhost:8080),这是一个SpringBoot应用程序终结点。我添加了package.json"代理":"http://localhost:8080/",但api仍然返回与localhost:3000调用,我尝