Files
bentopdf/docs/zh/tools/validate-signature-pdf.md
T

100 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 验证签名
description: 验证 PDF 文件中的数字签名。检查证书有效性、签名者身份、文档完整性和信任链状态。
---
# 验证签名
上传已签名的 PDF,此工具会提取每个数字签名,识别签名者,检查证书有效性,并报告文档在签名后是否被修改。您还可以提供受信任的证书来验证签名链。
## 工作原理
1. 上传已签名的 PDF 文件。验证会自动开始。
2. 工具会显示摘要:找到的签名数量,以及其中有效的数量。
3. 每个签名都有一张详细卡片,显示签名者姓名、颁发者、日期和状态。
4. 可选择上传**受信任的证书**(.pem、.crt、.cer、.der),以针对特定信任锚验证签名。系统会自动重新验证。
## 检查内容
### 签名解析
工具会从 PDF 中提取 PKCS#7 签名对象,解码 ASN.1 结构,并取出签名者的 X.509 证书以及签名中嵌入的所有证书链。
### 证书有效性
- **有效期**:证书当前是否在有效日期范围内?
- **自签名检测**:证书是否是自己的颁发者?
- **信任链**:提供受信任的证书后,签名者的证书是否能链接到该证书?
### 密码学验证
- 工具会重建签名 `/ByteRange` 所覆盖的字节,使用签名者声明的算法对其进行哈希,并将结果与签名内的 `messageDigest` 属性进行比较。
- 然后将已签名的属性重新序列化为 DER SET,并使用签名者证书的公钥验证签名。
- <strong>只有以上全部通过,签名才会被报告为有效。</strong>如果 PDF 字节在签名后被修改,或嵌入的签名与签名者的密钥不匹配,状态会显示“无效,密码学验证失败”并给出具体原因。
#### 支持的签名算法
| 算法 | 验证路径 |
| ----------------------- | ----------------------------------------------------------------------------- |
| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`,并以 Web Crypto 作为后备 |
| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` |
| ECDSA P-256/P-384/P-521 | 在 DER → IEEE P1363 签名转换后使用 Web Crypto `verify({name: 'ECDSA', hash})` |
如果签名使用的算法不在此列表中(例如 Ed25519、SM2,或使用不常见摘要 OID 的 RSA),卡片会以黄色显示<strong>“未验证,不支持的签名算法”</strong>,并附上具体的 OID 或原因。这是有意设计的三态区分:
- **有效**:签名已通过签名者公钥的密码学验证。
- **无效**:验证已运行并得出否定结果(字节被更改、密钥不匹配)。
- **未验证**:工具无法对该算法运行验证。证书元数据仍会显示,但您应将该签名视为“未知”,并使用 Adobe Acrobat 或 `openssl cms -verify` 进行验证。
### 不安全的摘要算法
- 使用 **MD5 或 SHA-1** 的签名会被判定为无效,并标记为“不安全的摘要”状态。这两种算法都已有公开的碰撞攻击,因此基于 SHA-1 或 MD5 哈希的签名无法保证完整性。
- SHA-224、SHA-256、SHA-384 和 SHA-512 均被接受。
### 文档覆盖范围
- **完全覆盖**:签名覆盖整个 PDF 文件,意味着签名后没有任何字节被添加或更改。
- **部分覆盖**:签名只覆盖文件的一部分。这可能表示签名后有过修改(不一定是恶意的,增量保存也会产生部分覆盖)。
## 签名详情
每张签名卡片显示:
- **签名者**:签名者证书中的通用名称、组织和电子邮件
- **颁发者**:为签名者证书签发的证书颁发机构
- **签名时间**:签名中嵌入的时间戳
- **有效期起 / 有效期至**:证书的有效期
- **原因**:签署文档的原因(如有提供)
- **地点**:签署地点(如有提供)
- **覆盖状态**:完全或部分
- **信任徽章**:受信任或不在信任链中(仅在提供自定义证书时显示)
### 技术详情
展开技术详情部分可查看:
- 签名者证书的序列号
- 摘要算法(SHA-256、SHA-512 等)
- 签名算法(RSA with SHA-256、ECDSA with SHA-256 等)
- 无效签名的错误信息
## 使用场景
- 在会签之前验证已数字签名的合同
- 审计已签名的文档,确认其未被篡改
- 检查证书在文档签署之后是否已过期
- 使用贵组织的根证书验证签名
- 检查政府或法律文件的签名详情
## 提示
- 自签名证书并不意味着签名无效,只是说明无法通过受信任的第三方验证签名者的身份。这在内部文档中很常见。
- 部分覆盖并不总是意味着被篡改。许多 PDF 工作流会添加增量更新(例如第二个签名),从而产生部分覆盖。
- 将贵组织的根证书或中间证书作为受信任的证书上传,即可获得信任链验证。
## 相关工具
- [PDF 数字签名](./digital-sign-pdf):使用您自己的证书签署 PDF
- [扁平化 PDF](./flatten-pdf):签名前先扁平化 PDF,以防止签名后的修改
- [移除元数据](./remove-metadata):在应用签名之前清理 PDF