【python】获取exe文件的数字签名时间戳信息

目录

1 前言

2 环境准备

3 demo代码

4 更多的其他参考


1 前言

最近打算写个python脚本,获取exe文件的数字签名时间戳。

但在网上搜索了许久,基本不是无关信息,就是无法正常运行。搜索大半天,终于发现了 signify 第三方库,特以记录。

(“非主流”的东西,搜索真的费劲……)

2 环境准备

安装 signify 第三方库(需要Python 3.8+):

pip install signify

3 demo代码

from signify.authenticode.signed_pe import SignedPEFile


def get_peFile_digital_signature_times(filename: str):
    """获取pe文件数字签名的时间戳
    
    Args:
      filename: str 文件路径
    
    Returns:
      list 文件的数字签名时间戳列表

    """
    with open(filename, "rb") as f:
        pe_file = SignedPEFile(f)
        sigs = list(pe_file.signed_datas)

    return [sig.signer_infos[0].countersigner.signing_time for sig in sigs]


if __name__ == '__main__':
    # 下面的exe路径,需要替换成自己的文件路径
    exe_filename = r"D:\\Downloads\SafariSetup.exe"
    for s in get_peFile_digital_signature_times(exe_filename):
        print(s)

运行效果:

更进一步:获取数字签名基本信息列表(签名者名称,签名算法,签名时间戳)

from signify.authenticode.signed_pe import SignedPEFile


def get_peFile_digital_signature_times(filename: str):
    """获取pe文件数字签名的时间戳
    
    Args:
      filename: str 文件路径
    
    Returns:
      list 文件的数字签名基本信息列表(签名者名称,签名算法,签名时间戳)

    """
    with open(filename, "rb") as f:
        pe_file = SignedPEFile(f)
        sigs = list(pe_file.signed_datas)

    return [[sig.certificates[-1].subject.rdns[0][1],
               sig.signer_infos[0].digest_algorithm().name,
               str(sig.signer_infos[0].countersigner.signing_time)] for sig in sigs]


if __name__ == '__main__':
    # 下面的exe路径,需要替换成自己的文件路径
    exe_filename = r"D:\\Downloads\SafariSetup.exe"
    for s in get_peFile_digital_signature_times(exe_filename):
        print(s)

运行效果:

与【属性】中的【数字签名】展示的基本信息一致:

4 更多的其他参考

signify库还可以获取 PE类型文件 更多详细的数字签名信息内容,可以查看源码或下面链接,自行探索:

signify库的PyPI链接:signify · PyPIModule to generate and verify PE signaturesicon-default.png?t=O83Ahttps://pypi.org/project/signify

signify库的GitHub链接:

GitHub - ralphje/signify: Module to generate and verify PE signaturesModule to generate and verify PE signatures. Contribute to ralphje/signify development by creating an account on GitHub.icon-default.png?t=O83Ahttps://github.com/ralphje/signify

其他博客的教程:

python3---signify-验证PE文件证书 - rvy - 博客园signify可以用来查看和验证PE文件证书 github地址: https://github.com/ralphje/signifyicon-default.png?t=O83Ahttps://www.cnblogs.com/-rvy-/p/17488228.html

### 如何对 INF 文件进行数字签名或解决相关问题 在 Windows 系统中,驱动程序的数字签名是确保其可信性和完整性的关键步骤。如果驱动程序没有经过数字签名,则可能会导致安装失败,并弹出类似“第三方 INF 不包含数字签名信息”的错误提示[^1]。以下是关于如何实现 INF 文件数字签名以及解决相关问题的详细说明。 #### 1. 数字签名的基本流程 数字签名通常涉及以下步骤: - **申请 EV 代码签名证书**:这是第一步,需要从受信任的证书颁发机构(CA)获取扩展验证(EV)代码签名证书。此证书相当于企业的数字营业执照,用于证明开发者身份的真实性和合法性[^2]。 - **准备驱动程序包**:将驱动程序的所有必要文件(包括 INF 文件、二进制文件等)整理成一个完整的包。 - **测试驱动程序**:使用微软提供的硬件兼容性实验室(HCK)或驱动程序测试平台(DPTF),对驱动程序进行全面测试,确保其符合 WHQL 认证标准。 - **生成测试报告**:完成测试后,生成详细的测试报告,确认所有功能正常且无重大缺陷。 - **签署驱动程序包**:使用已获得的 EV 代码签名证书对驱动程序包进行签名。 - **提交给微软审核**:将通过测试并签署后的文件上传至微软,等待审核。一旦通过,微软将提供交叉签名支持,并授予驱动程序官方认证的徽标[^2]。 #### 2. 使用工具对 INF 文件进行数字签名 要手动对 INF 文件进行数字签名,可以使用微软提供的 `signtool` 工具。以下是具体操作方法: ```cmd signtool sign /a /s My /n "证书名称" /t http://timestamp.digicert.com inf_file_path.inf ``` - `/a`:自动选择最适合的证书。 - `/s My`:从当前用户的个人证书存储区中查找证书。 - `/n "证书名称"`:指定证书的主题名称。 - `/t http://timestamp.digicert.com`:添加时间戳服务器地址,确保签名在证书过期后仍然有效。 - `inf_file_path.inf`:目标 INF 文件的路径。 #### 3. 解决“第三方 INF 不包含数字签名信息”问题 如果遇到上述错误提示,可以尝试以下解决方案: - **检查系统设置**:在某些情况下,Windows 可能被配置为仅允许安装带有数字签名的驱动程序。可以通过以下命令临时禁用此限制(重启后生效): ```cmd bcdedit.exe -set testsigning on ``` - **更新驱动程序**:确保使用的驱动程序是最新的版本,并且已经通过微软认证。 - **重新签名驱动程序**:如果驱动程序未签名签名无效,可以按照前述方法重新对其进行数字签名。 - **使用非安全模式安装**:在 Windows 高级启动选项中选择“禁用驱动程序签名强制”,然后尝试重新安装驱动程序。 #### 4. 注意事项 - **证书有效期**:确保使用的代码签名证书仍在有效期内。如果证书已过期,必须重新申请新的证书。 - **时间戳服务**:建议始终使用时间戳服务,这样即使证书在未来过期,签名仍会被视为有效。 - **测试环境**:在正式发布之前,务必在多种操作系统版本和硬件配置下测试驱动程序的兼容性。 ```python # 示例 Python 脚本:检查系统是否启用了测试签名模式 import os def check_testsigning(): result = os.popen("bcdedit.exe").read() if "testsinging Yes" in result: return True return False if check_testsigning(): print("测试签名模式已启用") else: print("测试签名模式未启用") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值