Pure-MoonBit PAdES/CMS PDF signing and verification
当前是 0.11 开发版,功能可用但还不适合直接用于有法律效力的正式签署。
| 能力 | 状态 |
|---|---|
| 签名算法 | RSA PKCS#1 v1.5、ECDSA P-256,SHA-256 |
| 私钥格式 | PEM(PKCS#8/PKCS#1/SEC1);PKCS#12(.p12/.pfx,PBES2 + AES-CBC) |
| 签名格式 | PAdES B-B(ETSI.CAdES.detached),CMS SignedData;可附加 B-T 时间戳 |
| 验签 | 检查字节范围、摘要、签名;文件被改一个字节就失败 |
| 证书链 | --anchors 指定信任根,检查签名者证书能否链到它 |
| 吊销检查 | --crl 指定 CRL(PEM),拒绝已被吊销的证书 |
| OCSP | --ocsp 指定 OCSP 响应(DER),检查在线吊销状态 |
| 命令行 | sign / verify / info |
| 可见签名 | --visible 在页面上画签名框(含文字与日期) |
| 互操作 | OpenSSL 与 pyHanko 双向验证(CI 每次都跑) |
| 时间戳 | RFC 3161:请求、嵌入、校验证书链(B-T);verify --tsa-anchors 可复查 |
| 平台 | Linux / macOS / Windows(CI 三平台跑测试) |
| 发布 | mooncakes.io:Rz-coder8848/moonsign@0.11.0 |
moon run cmd/mkpdf -- blank.pdf
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem \
-days 365 -nodes -subj "/CN=MoonSign Demo"
moon run cmd/moonsign -- sign blank.pdf --key key.pem --cert cert.pem --out signed.pdf
moon run cmd/moonsign -- verify signed.pdf --cert cert.pem
moon run cmd/moonsign -- info signed.pdfmoon run cmd/moonsign -- sign blank.pdf --p12 cert.p12 \
--p12-password 你的密码 --out signed.pdfmoon run cmd/moonsign -- sign blank.pdf --key key.pem --cert cert.pem \
--visible --rect 36,36,300,120 --appearance-text "Digitally signed" --out visible.pdfSigned: signed.pdf
Field: Signature1
Digest: SHA-256Signature 1: Signature1
subfilter: ETSI.CAdES.detached
Result: VALID
The document has not changed since signing.# 签名时把中间证书一起放进去
moon run cmd/moonsign -- sign blank.pdf --key leaf.key --cert leaf.crt \
--chain intermediate.crt --out chain-signed.pdf
# 验签时指定你信任的根证书
moon run cmd/moonsign -- verify chain-signed.pdf --anchors root-ca.crtmoon run cmd/moonsign -- verify signed.pdf \
--anchors root-ca.pem --crl issuer.crl.pemmoon run cmd/moonsign -- verify signed.pdf \
--anchors root-ca.pem --ocsp ocsp-response.der# 1. 从已签名的 PDF 生成时间戳请求
moon run cmd/moonsign -- tsa-request signed.pdf --out req.der
# 2. 把 req.der 发给任意 RFC 3161 时间戳服务(curl 示例)
curl -H "Content-Type: application/timestamp-query" \
--data-binary @req.der https://your-tsa.example/ -o resp.der
# 3. 把响应嵌进 PDF(--anchors 用来验证 TSA 的证书链)
moon run cmd/moonsign -- tsa-embed signed.pdf --response resp.der \
--anchors tsa-ca.pem --out stamped.pdfmoon run cmd/moonsign -- verify stamped.pdf --cert cert.pem --tsa-anchors tsa-ca.pemlet signed = @pades.sign_pdf(
pdf_bytes,
@pades.SigningKey::Rsa(modulus, private_exponent),
certificate,
extra_certificates,
{
field_name: "Signature1",
contents_chars: 16384,
signing_time: None,
hash: @crypto.Hash::Sha256,
},
)
let ok = @pades.verify_pdf(signed, certificate)der/ DER / ASN.1 基础编码(CMS、证书都靠它)
x509/ 证书解析、公钥提取
crypto/ 摘要、RSA、ECDSA(基于 mooncry)
cms/ CMS SignedData 的构造、解析、验签
pdf/ 在 PDF 里放签名域、写 ByteRange、填签名
pades/ 对外入口:sign_pdf / verify_pdf
pem/ 读 PEM 格式的私钥和证书
cmd/ 命令行程序Install
Download zipPure-MoonBit PAdES/CMS PDF signing and verification