首页 > 解决方案 > 如何获得使用popen传递的“GET /”请求的响应与底层openssl通信

问题描述

我是子进程模块的新手 - 在这种情况下,我想使用 openssl 命令连接安全服务器 url(例如:wikipedia),我可以连接网络服务器并且握手成功。

但是在请求 GET / 或 HEAD 请求时,我无法接收或处理输出。

获得的输出:

SSL 握手已读取 3708 字节并写入 405 字节 验证:OK 新,TLSv1.3,密码为 TLS_AES_256_GCM_SHA384 服务器公钥为 256 位 不支持安全重新协商 压缩:NONE 扩展:NONE 未协商 ALPN 未发送早期数据 验证返回码:0(好)

import time
import subprocess

cmd ="C:\\cygwin64\\bin\\openssl.exe s_client -connect wikipedia.org:443"
popen = subprocess.Popen(cmd,stdin=subprocess.PIPE,universal_newlines=True,stdout=subprocess.PIPE,,stderr=subprocess.PIPE)
input1 = "echo -en HEAD / HTTP/1.1\r\nHost: www.wikipedia.org\r\n\r\n"
(test_stdout,test_stderr)= popen.communicate(input=input1)
popen.wait()
print(test_stdout)
print(f"return value of popen %r "% popen.returncode)
popen.terminate()

使用 openssl -quiet 或 -ign_eof 更新代码:

cmd1 ="C:\\cygwin64\\bin\\openssl.exe s_client -connect www.wikipedia.org:443 -servername www.wikipedia.org -ign_eof"

popen = subprocess.Popen(cmd3,stdin=subprocess.PIPE,universal_newlines=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
input1 ="echo HEAD / HTTP /1.1\r\nHost: www.wikipedia.org\r\n"
print(input1)
(test_stdout,test_stderr)= popen.communicate(input=input1)
print("value of popen")
print(test_stdout)
print(f"return value of popen %r "% popen.returncode)
popen.terminate()

请找到不同的结果:1/左 - Py charm 的结果
2/右 - 在 openssl s_client 命令中执行的结果 在此处输入图像描述

标签: getopensslsubprocesshead

解决方案


据我所知,该脚本没问题,并且做了它应该做的事情:
它为您提供服务器密码和 TLS 配置。

但是从您的文本来看,您想要做的是不同的事情:
您想要发送一些 HTTP 请求并显示它们的响应。

为此,您必须将您的替换cmd为 some curl https://www.wikipedia.orgorwget -O- https://www.wikipedia.org并将其输入您的subprocess.Popen命令,而不是openssl cmd。


推荐阅读