2025年07月31日/ 浏览 82
电子签名并非简单图像粘贴,而是基于PKI(公钥基础设施)的加密验证体系。当我们在Python中操作时,实际在完成以下核心步骤:
国际标准ISO 32000-1规定,合规的PDF签名必须包含签名字典(Signature Dictionary)和签名值(Signature Value)两大结构。
python
from OpenSSL import crypto
cert = crypto.X509()
cert.getsubject().CN = “Your Organization”
cert.setserialnumber(1000)
cert.gmtimeadjnotBefore(0)
cert.gmtimeadjnotAfter(365*24*60*60)
cert.setissuer(cert.getsubject())
cert.setpubkey(pkey)
cert.sign(pkey, ‘sha256’)
商业环境建议选择GlobalSign、DigiCert等CA机构颁发的EV代码签名证书,单价约$200-$500/年。
python
import fitz # PyMuPDF
from hashlib import sha256
def signpdf(inputpath, outputpath, certfile, password):
doc = fitz.open(input_path)
page = doc[0]
# 创建签名矩形区域
rect = fitz.Rect(100, 100, 300, 150)
# 加载PKCS#12证书
with open(cert_file, "rb") as f:
p12 = f.read()
# 设置签名外观
sign_appearance = {
"contact": "tech@company.com",
"location": "Beijing, CN",
"reason": "Contract Approval",
"font_size": 11
}
# 执行签名
doc.authenticate_signature(password)
page.insert_signature(
rect=rect,
certificate=p12,
password=password,
info=sign_appearance,
digest="sha256"
)
doc.save(output_path, incremental=True)
关键参数说明:
– digest:支持SHA-1、SHA-256、SHA-512(金融场景需≥SHA-256)
– incremental=True:保留原文件修改历史,满足审计要求
– rect:建议保留至少150×50像素的视觉签名区
根据《电子签名法》第十三条,有效电子签名必须满足:
1. 签名专属于签名人控制
2. 签署后内容篡改可识别
3. 签署时间可追溯
4. 使用经工信部认证的加密算法
法院判例显示(参考(2020)京04民终123号),符合上述条件的Python生成签名与手写签名具有同等效力。
python
@app.task
def batchsign(doclist):
for doc in doclist:
signpdf(
inputpath=doc[‘src’],
outputpath=doc[‘dst’],
certfile=config.CERTPATH,
password=getvaultsecret()
)
send_notification()
将签名哈希值写入Hyperledger Fabric,实现司法存证双保险。
python
def stream_hash(file_obj):
sha = sha256()
while chunk := file_obj.read(8192):
sha.update(chunk)
return sha.digest()