首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从文件导出数字证书信息

从文件导出数字证书信息
EN

Stack Overflow用户
提问于 2018-04-12 21:45:04
回答 1查看 1.5K关注 0票数 2

如果证书本身没有安装在工作站上,而仅在该特定文件上使用,那么就有可能以某种方式导出文件的数字证书主题?

我需要从一个文件中提取出这些信息并检查它是否正确。最好使用Python/CMD/PowerShell

我目前正在使用这个python脚本(我修改它以运行Python3.6):http://www.zedwood.com/article/python-openssl-x509-parse-certificate来解析我从原始可执行文件中提取的.cer文件。

我用我找到的这个工具提取证书(我也修改了它以使用Python3):https://blog.didierstevens.com/programs/disitool/,然后我将它从一个DER编码的二进制转换为一个基-64和Windows。

但是,用于从文件中提取证书的disitool脚本的问题是,它实际上使用pefile python模块从可执行文件本身删除了“签名”字节数组,这使得提取的.cer文件无效,这与我在尝试用OpenSSL.crypto模块加载证书时遇到的python错误一样:

代码语言:javascript
运行
复制
 [('asn1 encoding routines', 'asn1_check_tlen', 'wrong tag'), ('asn1 encoding routines', 'asn1_item_embed_d2i', 'nested asn1 error'), ('asn1 encoding routines', 'asn1_template_noexp_d2i', 'nested asn1 error'), ('PEM routines', 'PEM_ASN1_read_bio', 'ASN1 lib')] 

但是,解析一个很好的提取证书(使用我在上面发布的第一个脚本)是可行的,如下所示:

TL:我想我只是需要一种从文件中导出证书的方法。此外,如果您发现我的解决方案太复杂了,如果您知道我如何从证书的Subject字段中获得"Redmond“文本,我是very开放给其他想法:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-25 01:57:50

我在寻找类似的解决方案时遇到了这个问题。这就是对我起作用的东西。部分代码是从disitool.py借来的。

代码语言:javascript
运行
复制
import pefile
from OpenSSL import crypto
from OpenSSL.crypto import _lib, _ffi, X509


def get_certificates(self):
    certs = _ffi.NULL
    if self.type_is_signed():
        certs = self._pkcs7.d.sign.cert
    elif self.type_is_signedAndEnveloped():
        certs = self._pkcs7.d.signed_and_enveloped.cert

    pycerts = []
    for i in range(_lib.sk_X509_num(certs)):
        pycert = X509.__new__(X509)
        pycert._x509 = _lib.sk_X509_value(certs, i)
        pycerts.append(pycert)

    if not pycerts:
        return None
    return tuple(pycerts)


SignedFile = "/tmp/firefox.exe"

pe = pefile.PE(SignedFile)

address = pe.OPTIONAL_HEADER.DATA_DIRECTORY[
    pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
].VirtualAddress
size = pe.OPTIONAL_HEADER.DATA_DIRECTORY[
    pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
].Size

if address == 0:
    print("Error: source file not signed")
else:
    signature = pe.write()[address + 8 :]

    pkcs = crypto.load_pkcs7_data(crypto.FILETYPE_ASN1, bytes(signature))
    certs = get_certificates(pkcs)

    for cert in certs:
        c = crypto.dump_certificate(crypto.FILETYPE_PEM, cert)
        a = crypto.load_certificate(crypto.FILETYPE_PEM, c)
        # get data from parsed cert
        print(a.get_subject()) 
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49806340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档