使用openssl子进程文件的Python STDOUT

我正在尝试编写一个
python脚本来自动执行通过openSSL检查SSL重新协商的过程,并将结果输出到文件.我遇到了两个问题.

我的第一个问题是初始握手的输出被写入文件,但实际的重新协商部分没有.它显示在控制台上.

subprocess.call("echo \"R\" | openssl s_client -connect example.com:443", 
        shell=True, stdout=FILE)

我的另一个问题(虽然这可能是错误的地方)是我无法使用openSSL命令来发送GET命令.

subprocess.call("echo -e \"GET / HTTP/1.1\r\n\r\n\" | openssl s_client -connect
        example.com:443", shell=True)   

同样,初始连接已设置,但随后存在openSSL,它不处理GET请求.

任何帮助将不胜感激.谢谢.

最佳答案 对于输入,没有理由使用shell = True.相反,使用stdin = subprocess.PIPE.另请注意,您的请求无效,因为HTTP 1.1需要Host标头.另外,我想不出使用命令行openssl而不是
ssl module的原因.

话虽如此,这是一个有效的例子:

import subprocess

f = open('http_answer', 'w')
_,log = subprocess.Popen(
    ['openssl', 's_client', '-quiet', '-connect', 'twitter.com:443'],
    stdout=f, stderr=subprocess.PIPE, stdin=subprocess.PIPE
).communicate('GET / HTTP/1.0\r\n\r\n')
print('Output of SSL:\n' + log)
点赞