繁体   English   中英

如何在python中捕获openssl的输出

[英]How to capture the output of openssl in python

我正在尝试在python中运行以下openssl命令:

cmd = "openssl x509 -sha1 -in esx.crt -noout -fingerprint"
tmp = os.popen(cmd)
tmp_sha1 = tmp.readline()

该命令应该生成证书的指纹。 我正在尝试通过文件对象捕获输出。 但是,当我读取此文件对象时,其中没有任何内容。 我在命令行上执行了此命令,它运行正常,生成指纹。 你能告诉我如何获得指纹吗?

您可以使用两个模块来建立所需的subprocessos

使用subprocess您可以使用communicate()检查该过程的输出,该过程从stdout和stderr读取数据,直到EOF为止

>>> import subprocess
>>> p = subprocess.Popen("openssl x509 -sha1 -in 17.cert -noout -fingerprint", stdout=subprocess.PIPE)
>>> out, _ = p.communicate() #return a tuple (stdout, stderr)
>>> out
b'SHA1 Fingerprint=87:68:8B:B0:6A:E2:DF:A3:E2:63:76:97:A9:2B:B4:F4:82:4E:0B:D1\n'

使用os模块也可以很好地使用read()readline()方法:(请注意os.popen()已弃用

>>> import os
>>> p = os.popen("openssl x509 -sha1 -in 17.cert -noout -fingerprint")
>>> p.read()
'SHA1 Fingerprint=87:68:8B:B0:6A:E2:DF:A3:E2:63:76:97:A9:2B:B4:F4:82:4E:0B:D1\n'
>>> p = os.popen("openssl x509 -sha1 -in 17.cert -noout -fingerprint")
>>> out = p.readline()
'SHA1 Fingerprint=87:68:8B:B0:6A:E2:DF:A3:E2:63:76:97:A9:2B:B4:F4:82:4E:0B:D1\n'

如果要将值写入文件,那么也可以正常工作,可以通过在当前工作目录中打开文件output.txt进行验证:

>>> with open('./output.txt', 'w') as f:
...     f.write(out)
...
77

77通知我们该文件已写入77个字节,您可以通过在喜欢的文本编辑器中将其打开来进行验证。

您可以使用OpenSSL模块在Python中本地实现此目的。

from OpenSSL.crypto import load_certificate, FILETYPE_PEM

cert_file_string = open("esx.crt", "rb").read()
cert = load_certificate(FILETYPE_PEM, cert_file_string)

sha1_fingerprint = cert.digest("sha1")
print sha1_fingerprint

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM