实用脚本能批量签名吗?

wen 实用脚本 14

本文目录导读:

实用脚本能批量签名吗?

  1. 场景一:为 Windows 可执行文件/动态库批量签名(使用 signtool.exe
  2. 场景二:为 PDF 文档批量签名(使用 iText 或 Python)
  3. 场景三:为 Android APK 批量签名(使用 apksigner
  4. 场景四:为多个代码/脚本文件签名(如 PowerShell 脚本)
  5. 通用注意事项

是的,实用脚本可以批量签名,这在很多场景下都非常有用,

  1. 软件发布: 为多个 .exe.dll.msi.app 文件签名。
  2. 文档处理: 为大量 PDF 或 Office 文档添加数字签名或图片签名(如合同、证书)。
  3. 代码签名: 为脚本(如 PowerShell、Python 打包的 exe)或驱动程序签名。
  4. APK 签名: 在 Android 开发中为多个 APK 文件签名。

具体实现方式取决于你要签名的对象类型使用的工具,以下介绍几种常见场景下的脚本化批量签名方法。


为 Windows 可执行文件/动态库批量签名(使用 signtool.exe

这是最常用的场景,通常用于发布软件前。

工具: Windows SDK 自带的 SignTool.exe

核心命令:

signtool sign /fd SHA256 /a /f "证书路径.pfx" /p "证书密码" /t "时间戳服务器URL" "文件1路径" "文件2路径"

批量脚本示例(PowerShell):

# PowerShell 脚本: BatchSign.ps1
$CertificatePath = "C:\MyCertificate.pfx"
$CertPassword = "YourStrongPassword" # 建议使用安全方式输入,如 Read-Host -AsSecureString
$TimestampServer = "http://timestamp.digicert.com" # 或 http://timestamp.sectigo.com
# 目标文件夹
$TargetFolder = "C:\MyApp\Release"
# 要签名的文件扩展名(可添加更多)
$Extensions = @("*.exe", "*.dll", "*.msi", "*.cab")
Write-Host "开始批量签名..." -ForegroundColor Green
# 遍历所有匹配的文件并签名
Get-ChildItem -Path $TargetFolder -Include $Extensions -Recurse | ForEach-Object {
    $FilePath = $_.FullName
    Write-Host "正在签名: $FilePath"
    # 使用 signtool 签名
    & "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\signtool.exe" sign `
        /fd SHA256 `
        /a `
        /f $CertificatePath `
        /p $CertPassword `
        /t $TimestampServer `
        /v `  # verbose 模式,可看详细信息
        $FilePath
    if ($LASTEXITCODE -eq 0) {
        Write-Host "   成功: $FilePath" -ForegroundColor Green
    } else {
        Write-Host "   失败: $FilePath (错误码: $LASTEXITCODE)" -ForegroundColor Red
    }
}
Write-Host "批量签名完成。" -ForegroundColor Green

使用方式:

  1. 将上述脚本保存为 BatchSign.ps1
  2. 修改脚本开头的变量(证书路径、密码、时间戳服务器、目标文件夹)。
  3. 在 PowerShell 中运行:.\BatchSign.ps1(需先执行 Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass)。

为 PDF 文档批量签名(使用 iText 或 Python)

如果需要对大量合同、报告添加数字签名,可以用 Python 脚本。

工具: PyMuPDF (fitz), cryptography, m2crypto 或商用库如 iText

核心思路:

  1. 遍历文件夹中的所有 PDF。
  2. 加载 PDF 和签名证书/图片。
  3. 在指定位置绘制签名(图片签名)或添加数字签名。
  4. 保存新 PDF。

Python 脚本示例(添加图片签名):

# Python 脚本: batch_sign_pdf.py
import os
from PIL import Image
import fitz  # PyMuPDF
def add_image_signature(pdf_path, output_path, signature_image_path, page_number=0, rect=(100, 100, 200, 150)):
    """
    在 PDF 的指定位置添加图片签名。
    rect: (x0, y0, x1, y1) 签名图片的矩形区域
    """
    try:
        doc = fitz.open(pdf_path)
        page = doc[page_number]  # 第一页 (索引0)
        # 插入图片签名
        rect = fitz.Rect(rect)
        page.insert_image(rect, filename=signature_image_path)
        doc.save(output_path)
        doc.close()
        print(f"签名成功: {pdf_path} -> {output_path}")
        return True
    except Exception as e:
        print(f"签名失败: {pdf_path}: {e}")
        return False
# 配置参数
input_folder = "./pdfs_to_sign"
output_folder = "./signed_pdfs"
signature_image = "./signature.png"  # 透明背景的签名图片
# 确保输出文件夹存在
os.makedirs(output_folder, exist_ok=True)
# 批量处理
for filename in os.listdir(input_folder):
    if filename.lower().endswith(".pdf"):
        input_path = os.path.join(input_folder, filename)
        output_path = os.path.join(output_folder, f"signed_{filename}")
        add_image_signature(input_path, output_path, signature_image)

注意: 真正的数字签名(不是图片)需要遵循 PDF 签名标准,比较复杂,通常建议使用专业库。


为 Android APK 批量签名(使用 apksigner

工具: Android SDK 自带的 apksigner.bat

核心命令:

apksigner sign --ks "keystore.jks" --ks-key-alias "myalias" --ks-pass pass:"密码" --key-pass pass:"密码" app-release-unsigned.apk

批量脚本示例(Bash/Linux/macOS 或 Windows WSL):

#!/bin/bash
# batch_sign_apk.sh
KEYSTORE="mykeystore.jks"
ALIAS="myalias"
STOREPASS="密码"
KEYPASS="密码"
INPUT_DIR="./unsigned_apks"
OUTPUT_DIR="./signed_apks"
mkdir -p "$OUTPUT_DIR"
for apk in "$INPUT_DIR"/*.apk; do
    if [ -f "$apk" ]; then
        filename=$(basename "$apk")
        output_apk="$OUTPUT_DIR/signed_$filename"
        echo "签名: $filename"
        apksigner sign \
            --ks "$KEYSTORE" \
            --ks-key-alias "$ALIAS" \
            --ks-pass "pass:$STOREPASS" \
            --key-pass "pass:$KEYPASS" \
            --out "$output_apk" \
            "$apk"
        if [ $? -eq 0 ]; then
            echo "  成功: $output_apk"
        else
            echo "  失败: $apk"
        fi
    fi
done
echo "批量签名完成。"

为多个代码/脚本文件签名(如 PowerShell 脚本)

工具: PowerShell 的 Set-AuthenticodeSignature

脚本示例:

# 批量签名 PowerShell 脚本
$cert = Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert | Select-Object -First 1
Get-ChildItem -Path "C:\Scripts" -Filter "*.ps1" | ForEach-Object {
    $filePath = $_.FullName
    Write-Host "签名脚本: $filePath"
    Set-AuthenticodeSignature -FilePath $filePath -Certificate $cert -TimestampServer "http://timestamp.digicert.com"
}

通用注意事项

  1. 密码安全: 不要在脚本中硬编码敏感密码,建议使用:
    • 环境变量($env:MY_PASSWORD
    • 提示输入(Read-Host -AsSecureString
    • 凭证管理(Windows Credential Manager)
  2. 时间戳: 强烈建议添加时间戳(/t 参数),这样即使证书过期,已经签名的文件依然可信。
  3. 错误处理: 批量签 name 应该检查退出码(exit code),记录成功/失败日志。
  4. 证书: 确保证书私钥可导出(如果使用 PFX),或使用 HSM(硬件安全模块)。

可以批量签名。 最实用的方法是:

  • Windows 程序 → 用 SignTool + PowerShell/Batch 循环。
  • PDF 文档 → 用 PyMuPDF/iText + Python 脚本。
  • Android APK → 用 apksigner + Bash 脚本。
  • PowerShell 脚本 → 用 Set-AuthenticodeSignature

你可以根据你的具体需求(签名对象、操作系统、技术栈)选择相应的脚本方案,如果需要更针对性的代码片段,欢迎补充说明你的具体场景(如:是什么文件?用什么证书?在什么系统上运行?)。

抱歉,评论功能暂时关闭!