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