如何使用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格式,也可以先给原文件生成签名,再把原文件和签名一起打包加密,操作更直观:
- 生成原文件的签名
openssl dgst -sha256 -sign SIGNKEY_NAME.pem -out input.sig 你的输入文件名
- 打包并加密原文件+签名
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
相关产品推荐
相关产品推荐

