在 Linux 下使用 OpenSSL 进行签名,通常分为三种常见场景:
下面按常见用法一步步说明。
openssl genrsa -out private.key 2048
openssl rsa -in private.key -pubout -out public.key
openssl dgst(标准做法)openssl dgst -sha256 -sign private.key -out file.sig file.txt
说明:
-sha256:摘要算法(也可用 sha1、sha512)file.sig:生成的签名文件file.txt:被签名文件openssl dgst -sha256 -verify public.key -signature file.sig file.txt
输出:
Verified OK
⚠️ 注意:这不是标准签名方式,只是“用私钥加密”
openssl rsautl -sign -in file.txt -inkey private.key -out file.sig
验证:
openssl rsautl -verify -in file.sig -inkey public.key
openssl dgst -sha256 -sign private.key file.txt | base64 > file.sig.b64
验证:
base64 -d file.sig.b64 | openssl dgst -sha256 -verify public.key -signature /dev/stdin file.txt
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
openssl cms -sign -signer cert.pem -inkey key.pem -in file.txt -out file.p7s -binary
验证:
openssl cms -verify -in file.p7s -CAfile cert.pem -out verified.txt
| 问题 | 原因 |
|---|---|
unable to load Private Key |
密钥格式不对 |
Verification Failure |
文件被改动或算法不一致 |
| 签名文件很大 | 使用了 rsautl 对大文件直接签名 |
✅ 永远对“摘要”签名,不要对大文件直接加密
标准签名方式:
openssl dgst -sha256 -sign private.key -out file.sig file.txt
openssl dgst -sha256 -verify public.key -signature file.sig file.txt
如果你有具体用途(如:代码签名、JWT、PDF、固件、HTTPS 证书),我可以给你更精确的示例。