OpenSSL 实战指南
FreeGuideOnline
最新
2026-07-14
bash openssl version
若未安装,可通过包管理器快速安装(如 `sudo apt install openssl`)。
## 基础概念速览
### 对称加密与非对称加密
- **对称加密**:使用同一个密钥进行加解密(如 AES、ChaCha20),速度快,适合大量数据。
- **非对称加密**:使用公钥加密、私钥解密(如 RSA、ECC),主要用于密钥交换和数字签名,速度较慢。
### 证书与证书链
数字证书将公钥与一个实体(域名、组织等)绑定,由证书颁发机构(CA)签名担保。X.509 是最常见的证书格式,PEM 和 DER 是其常用编码。
### PEM 与 DER 格式
- **PEM**:Base64 编码文本,以 `-----BEGIN...-----` 开头,易读易传输。
- **DER**:二进制格式,常用于 Java 等平台。
## 密钥与证书操作实战
### 生成私钥
#### 生成 RSA 私钥
```bash
# 生成 2048 位 RSA 私钥(PEM 格式)
openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:2048
# 或使用传统命令
openssl genrsa -out private.key 2048
推荐至少使用 2048 位,更高安全性可用 4096 位。
生成椭圆曲线(ECC)私钥
# 列出可用曲线
openssl ecparam -list_curves
# 生成 secp256r1(prime256v1)私钥
openssl ecparam -genkey -name prime256v1 -out private.key
从私钥提取公钥
openssl rsa -in private.key -pubout -out public.key # RSA
openssl ec -in private.key -pubout -out public.key # ECC
生成证书签名请求(CSR)
CSR 是提交给 CA 申请证书的文件,包含公钥及身份信息。
openssl req -new -key private.key -out request.csr
系统会交互式询问国家、省份、城市、组织、通用名称(域名)等信息。若希望一键生成,可使用 -subj 参数:
openssl req -new -key private.key -out request.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=Example/CN=www.example.com"
创建自签名证书
在开发或内网环境中,可自行签发证书。
# 直接创建私钥和自签名证书(有效期365天)
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
# 从已有私钥生成自签名证书
openssl req -x509 -key private.key -in request.csr -out self.crt -days 365
查看证书内容
# 显示证书文本信息
openssl x509 -in cert.pem -text -noout
# 快速查看颁发者、主题及有效期
openssl x509 -in cert.pem -subject -issuer -dates -noout
# 查看证书的模数/公钥信息
openssl x509 -in cert.pem -pubkey -noout
格式转换
PEM ↔ DER
# PEM 转 DER
openssl x509 -in cert.pem -outform der -out cert.der
# DER 转 PEM
openssl x509 -in cert.der -inform der -outform pem -out cert.pem
提取私钥并去除密码保护
若私钥设置了密码,可移除密码方便自动化使用(注意安全):
openssl rsa -in encrypted.key -out unencrypted.key
PKCS#12(PFX)转换
将私钥和证书打包为 PKCS#12 格式(常用于 IIS 或客户端证书):
openssl pkcs12 -export -in cert.pem -inkey private.key -out bundle.p12
从 PFX 中分离私钥和证书:
openssl pkcs12 -in bundle.p12 -out combined.pem -nodes
加密与解密实战
对称加密(文件加密)
# 使用 AES-256-CBC 加密文件,需设置密码
openssl enc -aes-256-cbc -pbkdf2 -in plain.txt -out encrypted.bin
# 解密文件
openssl enc -aes-256-cbc -d -pbkdf2 -in encrypted.bin -out decrypted.txt
-pbkdf2使用更安全的密钥派生,当前版本推荐添加。
使用 Base64 输出便于复制传输:
openssl enc -aes-256-cbc -a -pbkdf2 -in file.txt
非对称加解密(小数据)
直接用公钥加密、私钥解密(受密钥长度限制,不应加密长内容):
# 公钥加密
openssl pkeyutl -encrypt -pubin -inkey public.key -in secret.txt -out secret.enc
# 私钥解密
openssl pkeyutl -decrypt -inkey private.key -in secret.enc -out secret.txt
摘要与数字签名
生成哈希摘要
# SHA-256 哈希
openssl dgst -sha256 file.txt
# 生成 HMAC(带密钥的哈希)
openssl dgst -sha256 -hmac "secret_key" file.txt
数字签名与验证
# 使用私钥对文件签名
openssl dgst -sha256 -sign private.key -out signature.bin file.txt
# 使用公钥验证签名
openssl dgst -sha256 -verify public.key -signature signature.bin file.txt
也可对 Base64 编码的签名进行处理,使输出可显示。
连接测试与调试
TLS/SSL 连接诊断
# 查看服务器证书链
openssl s_client -connect www.example.com:443 -showcerts
# 测试指定 TLS 版本
openssl s_client -connect www.example.com:443 -tls1_3
检测证书过期情况
# 批量检查
echo | openssl s_client -servername domain.com -connect domain.com:443 2>/dev/null | openssl x509 -noout -dates
实用技巧与最佳实践
- 私钥保护:私钥必须设置严格的权限(
chmod 600),避免泄露。 - 生成强随机数:
openssl rand -hex 32可快速生成密钥。 - 密码/密钥派生:使用
openssl kdf -keylen 64 -kdfopt digest:SHA512 -kdfopt pass:password PBKDF2从密码派生密钥。 - CA 模拟:可用 OpenSSL 搭建简易 CA,用于内部 PKI,但生产环境应使用成熟 CA 体系。
常见问题
Q:生成私钥时提示密码太短怎么办?
A:使用 -passout pass: 参数指定密码,或在 genrsa 时添加 -passout stdin 通过标准输入传入。
Q:如何检查私钥与证书是否匹配?
A:对比两者的模数(RSA):
openssl x509 -noout -modulus -in cert.pem | openssl md5
openssl rsa -noout -modulus -in private.key | openssl md5