Help us shape the future of Go! Take the 2026 Go Developer Survey

ofd-seal

command
v0.1.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 21, 2026 License: Apache-2.0 Imports: 12 Imported by: 0

README

ofd-seal

ofd-seal 把一枚印章图片和元数据封装成符合 GB/T 38540-2020 的 SES 电子印章 文件(DER 编码的 ASN.1,通常命名 Seal.esl)。该文件可被 ofd-creator 的 --sign-seal 打入 OFD 包的签名目录,让阅读器从独立印章文件提取印章图片。

用法

go build -o /tmp/ofd-seal ./cmd/ofd-seal
/tmp/ofd-seal --image seal.png --name "示例印章" --esid "seal@example.com" -o seal.esl

选项:

选项 说明
-i, --image 印章图片路径(png/jpeg/gif/bmp),必填
--name 印章名称,默认使用图片文件名
--esid 印章唯一编号(IA5 字符串),默认 name@vid
--vid 印章商标识,默认 ofd-seal
-o, --out 输出文件路径,默认 seal.esl
--key 复用已有 SM2 私钥(PKCS#8 PEM 或 DER),需同时提供 --cert
--cert 复用证书(PEM 或 DER);默认自签生成
--key-out 把新生成的私钥以 PKCS#8 PEM 写到指定路径
--validity-days 证书与印章的有效天数,默认 3650
--width-mm / --height-mm 印章显示宽高,整数毫米,均默认 40,与图片像素无关
--signer-cert 获授权签章者证书(PEM/DER,可重复);缺省授权制章者
--cert-digests 将授权列表保存为 SM3 证书杂凑(certListType=2)
--version 输出工具版本

退出码

退出码 含义
0 印章文件生成成功;--version 输出版本号也算成功
1 生成失败,例如印章图片不存在或无法解码、写出文件失败
2 参数错误,例如缺少必填的 --image、未知选项或非法参数值

说明

  • SES_Header.ID 固定为 "ES",SES_Header.Version 与印章内部签名结构的 版本均为 4;算法固定为 SM2 + SM3。
  • 印章图片格式使用 Go image.DecodeConfig 得到的格式名(png、jpeg、 gif、bmp)。
  • 不带 --key/--cert 时每次运行生成新的随机 SM2 私钥和自签名证书,产出的 印章仅用于演示与测试;生产环境应通过 --key/--cert 接入受信任的证书与 私钥管理。
  • --esid 和 --vid 会写入 SES 的 IA5 字段,包含非 ASCII 字符时会被拒绝。
  • 印章名称始终使用 UTF8String。显示尺寸遵循 GB/T 38540-2020 §6.1.2.5 的毫米单位; 旧工具曾把像素数写入该字段,新产物默认使用 40 × 40 mm,可通过上述参数指定。
  • 导入的制章者证书必须与私钥匹配,且在制作时刻有效、允许数字签名。 制章者可以授权另一张签章者证书;签章时仍需由应用提供证书信任与状态证据, 参见 签署与完整验证接口。

生成测试用印章图片

--generate 只出图片,不封装成印章文件:

ofd-seal --generate -o seal.png
ofd-seal --generate --shape ellipse --size 600 -o seal-ellipse.png

图片由 internal/sealimg 渲染:顶部固定印「OFD 测试专用章」,底部固定印「非正式印章」, 中心是五角星、其下方小字「zc310/ofd」,外框为朱红双线(圆或椭圆),背景透明。

这张图只能用于演示和测试。 底部那行字是刻意印在图片里的——印章图片会被 单独复制传播,脱离本仓库之后就再也看不到文档里的免责声明,图片自带的标识是唯一 还留着的提醒。真实印章图片必须来自单位刻章备案,证书必须来自 CA;用本工具 生成的图去签正式文件属于伪造印章。

需要中文字体。字体按家族名从系统查找(覆盖 Linux/Windows/macOS 常见字体), 也可以用 --font 指定;指定的名字找不到或不含中文字形时会报错,不会静默换一个 字体——换出来的图里底字是方框。

与签名管线的衔接

/tmp/ofd-seal --image seal.png --name "示例印章" -o seal.esl
go run ./cmd/ofd-creator merge \
  --sign-cmd /tmp/ofd-signer-demo \
  --sign-seal seal.esl \
  -o /tmp/signed.ofd \
  --pages 1 \
  testdata/ofd-creator/hello.ofd

ofd-creator 把 seal.esl 复制进 Doc_0/Signatures/,在 Signature.xml 中写入 <Seal BaseLoc="Seal.esl"/>,并把该文件纳入签名引用。阅读器按 Seal@BaseLoc → ExtractSealData → 页面渲染的链路提取印章图片;找不到或无法解析时回退到 SignedValue.dat 中的内嵌印章。

Documentation

Overview

Command ofd-seal 生成符合 GB/T 38540-2020 的 SES 电子印章文件(Seal.esl)。

只负责封装格式:接收印章图片和元数据,生成一份 DER 编码的 SES_Seal 文件。 生成的文件由签名管线(--sign-seal)引用,写入 Signature.xml 的 Seal 元素。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL