暗色模式

openssl 命令行:从密钥生成到自签证书与文件加密

技术教程
2026-08-29
5
0
本文要点
  • 对称加密:用 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

使用 openssl enc 对文件进行 AES 对称加密与解密

从输出可以看到,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

生成 RSA 密钥与证书签名请求

图中先执行 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

生成自签证书并查看验证

输出中 subjectissuer 相同(自签证书的特征)、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,值得每个运维记熟。

参考

发表评论

暂无评论,快来抢沙发吧!