本文要点
- 对称加密:用
openssl enc -aes-256-cbc -pbkdf2一条命令给文件加密、解密,适合本地敏感文件保护。 - 非对称密钥:
openssl genpkey生成 RSA 私钥,openssl pkey -pubout导出公钥。 - 证书链路:
req -new生成 CSR →x509 -req -signkey自签证书 →x509 -text查看证书内容。 - 自建 HTTPS:内网/测试环境用自签证书,配合 Nginx 即可启用 TLS,无需购买 CA 证书。
- 验证手段:
openssl verify校验证书、-modulus对比私钥与证书是否匹配、-fingerprint查看指纹。
为什么需要 openssl 命令行
日常运维中,SSH 密钥认证、HTTPS 证书、软件包签名校验背后都是 OpenSSL 这套加密库在工作。虽然 Nginx、浏览器会替你处理大多数证书流程,但当你要给内网服务签发一张证书、给配置文件加密、或排查证书为什么报错时,就需要直接面对 openssl 命令行。
本文在 Ubuntu 24.04(OpenSSL 3.0.13)上实测,覆盖四个最常用的场景:对称加解密、密钥生成、CSR 与自签证书、证书查看与验证。
先确认本机版本,不同版本部分参数有差异(3.x 推荐 genpkey 而非旧的 genrsa):
openssl version输出示例:
OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024)对称加密:用 AES 给文件加密解密
最实用的入门场景:把包含密码、API Key 的配置文件加密存放,需要时再解密。openssl enc 使用对称算法(同一把口令既加密也解密),推荐 aes-256-cbc 配合 -pbkdf2(用密钥派生函数,替代已被弱化的旧默认,安全性更高)。
echo "Hello, this is a secret message." > secret.txt
openssl enc -aes-256-cbc -pbkdf2 -salt -in secret.txt -out secret.txt.enc -pass pass:MyPass2026-salt:加密时混入随机盐值,即使相同明文,两次加密结果也不同;-pass pass:xxx:命令行直接给口令(交互式输入则去掉该参数);- 解密时用
-d参数,其他选项保持一致即可,这里直接取别名文件查看结果:
openssl enc -d -aes-256-cbc -pbkdf2 -in secret.txt.enc -out secret.txt.dec -pass pass:MyPass2026
cat secret.txt.dec
从输出可以看到,secret.txt 原文 33 字节,加密后 secret.txt.enc 为 64 字节(多了盐值、IV 与填充);解密出的 secret.txt.dec 与原文完全一致。要点是加解密算法、口令、盐值必须一致,换了口令就解不开。
提示:-pbkdf2生成的密文带Salted__头部与迭代参数,加密时用了它,解密时必须同样加上,否则会报bad decrypt。
非对称密钥:生成 RSA 私钥与公钥
HTTPS 证书的核心是一对非对称密钥。OpenSSL 3.x 用 genpkey 统一生成各类密钥,生成 2048 位 RSA 私钥:
cd /root/openssl-demo
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048 2>/dev/null生成进度点已重定向丢弃,私钥文件默认权限为 600(仅属主可读写),这是正确的保护姿态。导出对应的公钥:
openssl pkey -in server.key -pubout -out pub.pem
cat pub.pem查看私钥细节(含模数、私钥指数等),通常只需确认密钥位长:
openssl pkey -in server.key -text -noout输出开头形如 Private-Key: (2048 bit, 2 primes),即确认是 2048 位 RSA 私钥。
证书签名请求:用 req 生成 CSR
要给域名申请证书,先基于私钥生成 CSR(Certificate Signing Request,证书签名请求),把域名、组织等信息打包给 CA 签名。-subj 可直接指定主题字段,避免交互式问答:
openssl req -new -key server.key -out server.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=Astarry Tech/CN=blog.astarry.cn"字段含义:C 国家、ST 省、L 城市、O 组织、CN 通用名(证书绑定的域名)。随后用 -verify 校验 CSR 自签名,并确认主题字段:
openssl req -in server.csr -noout -subject -verify
图中先执行 genpkey 生成 server.key,再以该私钥创建 CSR,输出显示 subject=C = CN, ST = Beijing, L = Beijing, O = Astarry Tech, CN = blog.astarry.cn,并给出 Certificate request self-signature verify OK,说明 CSR 与私钥匹配无误。
自签证书:x509 一键签发
没有 CA 时,可以用私钥给自己签发证书(自签名证书)。x509 -req 读取 CSR 并用 -signkey 指定的私钥签名,-days 设有效期:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt 2>/dev/null生成后即可查看证书的主题、签发者、有效期与指纹,并用 openssl verify 自校验:
openssl x509 -in server.crt -noout -subject -issuer -dates -fingerprint
openssl verify -CAfile server.crt server.crt
输出中 subject 与 issuer 相同(自签证书的特征)、notBefore/notAfter 为 365 天有效期、末尾 SHA1 Fingerprint 是证书指纹;最后 server.crt: OK 表示证书链校验通过。
想查看证书的完整信息(公钥算法、扩展字段等)用 -text:
openssl x509 -in server.crt -text -noout实战自检:确认证书与私钥匹配
证书报错常见原因之一是证书和私钥不是同一对。用 -modulus 提取两者的模数,比对哈希是否一致即可确认:
openssl x509 -in server.crt -noout -modulus | openssl md5
openssl rsa -in server.key -noout -modulus 2>/dev/null | openssl md5两条命令输出相同 MD5,说明证书就是由该私钥签发的。
自签证书虽不受浏览器信任(会提示不安全),但非常适合内网服务、开发与测试环境:把它加入系统信任库或浏览器信任区后即可正常使用。配合 Nginx 配置 TLS 时,只需在 server 块填入:
server {
listen 443 ssl;
server_name blog.astarry.cn;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
}常用参数速查
| 命令 | 作用 | 常用参数 |
|---|---|---|
openssl enc | 对称加解密 | -aes-256-cbc -pbkdf2 -salt -d -pass |
openssl genpkey | 生成非对称私钥 | -algorithm RSA -pkeyopt rsa_keygen_bits:2048 |
openssl pkey | 查看/导出密钥 | -text -noout -pubout |
openssl req | 生成/查看 CSR | -new -key -subj -verify |
openssl x509 | 签发/查看证书 | -req -signkey -days -text -noout -fingerprint |
openssl verify | 校验证书链 | -CAfile -CApath |
总结
openssl 是 Linux 上处理加密与证书的瑞士军刀:enc 负责文件对称加解密,genpkey/req/x509 串起「私钥 → CSR → 证书」的完整链路,verify/modulus/fingerprint 则用于排查证书问题。自签证书 + Nginx 即可为内网或测试环境快速启用 HTTPS,值得每个运维记熟。
评论 (0)
暂无评论,快来抢沙发吧!