You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用OpenSSL创建附加签名 实现类似GPG的文件加密加签效果

在GPG中,我们可以通过如下命令轻松对输入文件执行加密并生成附加签名:

gpg --batch --no-tty --default-key SIGNKEY_NAME --cipher-algo AES256 --symmetric --passphrase-file ENCRYPTIONKEY_FILE --sign --force-mdc --output out.bin

请问在OpenSSL中是否有方案可以实现类似GPG的效果,对文件同时完成加密和附加签名的创建?

有可行方案,OpenSSL虽然没有单条命令原生支持同时完成对称加密和嵌入签名,但可以通过CMS命令组合或者两步打包的方式实现完全等价的效果。


方案1:单条CMS命令实现(最贴近GPG输出逻辑)

直接通过管道组合两次CMS命令,输出单个加密+嵌入签名的文件,对应你原GPG命令的参数可以直接用如下格式:

注:如果没有现成的签名用证书,可以快速生成自签证书和私钥,命令如下:

openssl req -x509 -newkey rsa:4096 -keyout SIGNKEY_NAME.pem -out SIGNCERT.pem -days 3650 -nodes -subj "/CN=你的签名标识"
openssl cms -sign -in 你的输入文件名 -signer SIGNCERT.pem -inkey SIGNKEY_NAME.pem -nodetach -binary | openssl cms -encrypt -aes256 -pass file:ENCRYPTIONKEY_FILE -binary -out out.bin

参数说明:

  • -sign + -nodetach 对应GPG的--sign逻辑,签名会直接嵌入到内容中,不会生成独立的签名文件
  • -encrypt -aes256 对应GPG的--cipher-algo AES256 --symmetric,使用AES256算法做对称加密
  • -pass file:ENCRYPTIONKEY_FILE 对应GPG的--passphrase-file ENCRYPTIONKEY_FILE,从指定文件读取加密口令,不需要交互输入

解密验证的命令也很简单:

openssl cms -decrypt -in out.bin -pass file:ENCRYPTIONKEY_FILE | openssl cms -verify -signer SIGNCERT.pem -out 解密后的输出文件名

方案2:两步打包方案(兼容性更好)

如果不想用CMS格式,也可以先给原文件生成签名,再把原文件和签名一起打包加密,操作更直观:

  1. 生成原文件的签名
openssl dgst -sha256 -sign SIGNKEY_NAME.pem -out input.sig 你的输入文件名
  1. 打包并加密原文件+签名
tar cf - 你的输入文件名 input.sig | openssl enc -aes-256-cbc -pbkdf2 -pass file:ENCRYPTIONKEY_FILE -out out.bin

解密验证流程:

openssl enc -d -aes-256-cbc -pbkdf2 -pass file:ENCRYPTIONKEY_FILE -in out.bin | tar xf -
openssl dgst -sha256 -verify 签名公钥.pem -signature input.sig 你的输入文件名

两种方案都可以实现和你给出的GPG命令完全一致的效果:AES256对称加密、绑定签名、单文件输出、支持非交互批量操作。


内容的提问来源于stack exchange,提问作者alireza sadeghpour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:57:00