mirror of
https://github.com/alam00000/bentopdf.git
synced 2026-11-09 09:04:18 +01:00
100 lines
5.1 KiB
Markdown
100 lines
5.1 KiB
Markdown
---
|
||
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
|