电子档案签名全流程实操指南 从零到上线可直接落地复用
一、前置物料准备
1. 数字证书准备
测试环境可直接申请免费RSA2048测试证书:https://myssl.com/cert_apply.html,选择“免费SSL证书”即可,申请后可下载p12格式的证书包。生产环境需使用具备《电子认证服务许可证》的CA机构签发的商用证书,需完成企业/个人实名认证后获取。
2. 电子档案规范要求
待签名的原始电子档案需使用PDF/A-3a归档标准格式,禁止使用Word、TXT等易篡改格式,档案需包含完整的归档元数据(档案编号、所属类目、经办人、归档时间)。
3. 工具依赖安装
本指南以Python实现为例,依赖库安装命令如下:
``` pip install pycryptodome==3.19.0 ```如需将签名值嵌入PDF文件,可下载pdftk工具:https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk_free-2.02-win-setup.exe,直接安装即可使用。
二、核心实操步骤
1. 电子档案预处理
首先计算原始档案的SHA256哈希摘要,禁止使用MD5、SHA1等不安全算法,代码如下:
```python import hashlib def calc_file_hash(file_path: str) -> str: sha256 = hashlib.sha256() with open(file_path, 'rb') as f: 分块读取避免大文件内存溢出 for chunk in iter(lambda: f.read(4096), b''): sha256.update(chunk) return sha256.hexdigest() ```
完成哈希计算后,将元数据与哈希值拼接为待签名原文,拼接格式固定如下,避免空格、换行差异导致验签失败:
档案哈希:xxx|归档时间:yyyy-MM-dd HH:mm:ss|档案编号:xxx|经办人:xxx|所属单位:xxx
2. 私钥签名操作
私钥禁止明文存储在代码、配置文件中,生产环境必须存储在加密机/密码模块中,测试环境可临时使用p12证书文件,签名代码如下:
```python from Crypto.Signature import pkcs1_15 from Crypto.Hash import SHA256 from Crypto.PublicKey import RSA from Crypto.IO import PKCS12 import base64 def sign_content(content: str, p12_path: str, p12_password: str) -> str: 读取p12证书文件 with open(p12_path, 'rb') as f: p12_data = f.read() 解析p12证书获取私钥 private_key = PKCS12.load_pkcs12(p12_data, p12_password.encode())[0] 计算待签名内容的哈希 hash_obj = SHA256.new(content.encode('utf-8')) 生成PKCS1_v1_5格式签名 signature = pkcs1_15.new(private_key).sign(hash_obj) 转为Base64格式存储 return base64.b64encode(signature).decode('utf-8') ```生成签名值后,可通过pdftk命令将签名值嵌入PDF附件,命令如下:
``` pdftk 原始档案.pdf attach_files 签名值.txt output 已签名档案.pdf ```3. 验签操作
验签需同时校验内容完整性、证书有效性,代码如下:
```python def verify_sign(content: str, signature: str, pub_key_path: str) -> bool: 读取公钥文件 with open(pub_key_path, 'rb') as f: pub_key = RSA.import_key(f.read()) 解析Base64格式签名 signature_bytes = base64.b64decode(signature) 计算待校验内容的哈希 hash_obj = SHA256.new(content.encode('utf-8')) try: pkcs1_15.new(pub_key).verify(hash_obj, signature_bytes) return True except (ValueError, TypeError): return False ```验签时必须额外校验证书有效期、证书吊销状态,可调用对应CA的OCSP接口查询吊销状态,国内合规CA通用OCSP查询地址为:http://ocsp.cfca.com.cn,传入证书序列号即可获取吊销状态,吊销状态的证书签名视为无效。
三、合规性校验要求
- 签名人身份真实:生产环境所用证书必须为实名认证后签发,禁止使用自签证书,否则不具备法律效应
- 签名行为不可抵赖:私钥必须由签名人本人管控,系统代签需留存完整的授权凭证(授权书、操作日志等)
- 档案不可篡改:验签不通过的档案直接判定为被篡改,不得作为正式归档材料
- 存储要求:已签名档案、签名值、公钥证书、验签记录需同步存储至少30年,符合档案管理年限要求
四、常见问题排查
- 签名验签失败:优先检查待签名内容编码是否统一为UTF-8,拼接格式是否完全一致,哈希计算时是否完整读取全量文件,无截断
- 证书解析失败:检查p12证书密码是否正确,证书文件是否完整;Java环境需额外安装JCE无限制权限策略文件,下载地址:https://www.oracle.com/java/technologies/javase-jce8-downloads.html,否则RSA2048证书解析会报错
- 签名不具备法律效应:检查证书签发机构是否具备国内电子认证服务资质,国外CA、自签证书的签名国内司法机构不予认可