本文目录导读:

- 场景一:为 Windows 可执行文件/动态库批量签名(使用
signtool.exe) - 场景二:为 PDF 文档批量签名(使用 iText 或 Python)
- 场景三:为 Android APK 批量签名(使用
apksigner) - 场景四:为多个代码/脚本文件签名(如 PowerShell 脚本)
- 通用注意事项
是的,实用脚本可以批量签名,这在很多场景下都非常有用,
- 软件发布: 为多个
.exe、.dll、.msi或.app文件签名。 - 文档处理: 为大量 PDF 或 Office 文档添加数字签名或图片签名(如合同、证书)。
- 代码签名: 为脚本(如 PowerShell、Python 打包的 exe)或驱动程序签名。
- 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
使用方式:
- 将上述脚本保存为
BatchSign.ps1。 - 修改脚本开头的变量(证书路径、密码、时间戳服务器、目标文件夹)。
- 在 PowerShell 中运行:
.\BatchSign.ps1(需先执行Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass)。
为 PDF 文档批量签名(使用 iText 或 Python)
如果需要对大量合同、报告添加数字签名,可以用 Python 脚本。
工具: PyMuPDF (fitz), cryptography, m2crypto 或商用库如 iText。
核心思路:
- 遍历文件夹中的所有 PDF。
- 加载 PDF 和签名证书/图片。
- 在指定位置绘制签名(图片签名)或添加数字签名。
- 保存新 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"
}
通用注意事项
- 密码安全: 不要在脚本中硬编码敏感密码,建议使用:
- 环境变量(
$env:MY_PASSWORD) - 提示输入(
Read-Host -AsSecureString) - 凭证管理(Windows Credential Manager)
- 环境变量(
- 时间戳: 强烈建议添加时间戳(
/t参数),这样即使证书过期,已经签名的文件依然可信。 - 错误处理: 批量签 name 应该检查退出码(exit code),记录成功/失败日志。
- 证书: 确保证书私钥可导出(如果使用 PFX),或使用 HSM(硬件安全模块)。
可以批量签名。 最实用的方法是:
- Windows 程序 → 用
SignTool+ PowerShell/Batch 循环。 - PDF 文档 → 用
PyMuPDF/iText+ Python 脚本。 - Android APK → 用
apksigner+ Bash 脚本。 - PowerShell 脚本 → 用
Set-AuthenticodeSignature。
你可以根据你的具体需求(签名对象、操作系统、技术栈)选择相应的脚本方案,如果需要更针对性的代码片段,欢迎补充说明你的具体场景(如:是什么文件?用什么证书?在什么系统上运行?)。