如何在python中捕获openssl的输出

时间:2015-11-13 01:13:06

标签: python openssl

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

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

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

2 个答案:

答案 0 :(得分:0)

您可以使用两个模块来建立您想要的内容:subprocessos

使用subprocess,您可以使用communicate()检查流程的输出,reads data from stdout and stderr until 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() is deprecated

>>> 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个字节写入该文件,您可以通过在您喜欢的文本编辑器中打开它来验证该文件。

答案 1 :(得分:0)

您可以使用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