# 安全说明

> MoonSign 0.1 尚未经过独立安全审计。请不要把它用于有法律效力的正式签署，直到 1.0 发布并完成审计。

## 验签结论到底意味着什么

`moonsign verify` 输出 `VALID`，只说明两件事：

1. 文件里记录的签名覆盖范围内的字节，和签名时一致（没有被改过）；
2. 签名值能被你提供的那张证书的公钥验证通过。

它**不**说明：

- 这张证书是不是可信的（有没有被伪造、是不是真的属于某家公司）；
- 签名时间是否可信（0.1 没有时间戳）；
- 证书有没有被吊销（CRL 已支持，OCSP 还没有）。

所以：**"签名有效" ≠ "这份文件可信"**。从 0.2 开始，`verify --anchors <根证书>` 会检查签名者证书能否链到你指定的根；这仍然只代表"你信任这个根"，不代表"全世界都信任"。CRL 与 OCSP 吊销检查都已支持（OCSP 需要自备响应文件）。

时间戳（B-T）默认只校验"时间戳确实对应这次签名"；给 `tsa-embed --anchors` 时会进一步验证 TSA 签名、timeStamping EKU 和证书链，但不会检查 TSA 的运营资质或吊销状态。

PKCS#12 密码可以放在 `--p12-password` 或环境变量 `MOONSIGN_P12_PASSWORD`；命令行参数会进入 shell 历史，敏感环境建议用环境变量。旧式 RC2/3DES 加密的 `.p12` 会被明确拒绝。

## 威胁模型

| 攻击 | MoonSign 的表现 |
| --- | --- |
| 改 PDF 内容 | 验签失败（摘要不匹配） |
| 改签名值 | 验签失败（签名不匹配） |
| 删掉签名 | `verify` 报 "no signature found" |
| 用自己的证书重新签 | 用原证书验签会失败；必须核对证书指纹/信任链 |
| 替换证书 | 同上，取决于调用方是否固定了可信证书 |

## 密钥处理

- 目前只支持**未加密**的 PEM 私钥（PKCS#8 / PKCS#1 / SEC1）。
- 加密私钥（`-----BEGIN ENCRYPTED PRIVATE KEY-----`）暂不支持。
- 私钥只在内存中使用，不写日志、不落盘。
- 正式使用时建议把私钥放在受控环境（HSM、密钥管理服务），不要提交到仓库。

## 报告问题

如果发现安全问题，请开一个 Issue 并标注 `security`，或直接联系仓库维护者。请不要在公开 Issue 里贴真实的私钥或证书。
