3、OpenSSL入门:安装、配置与常用命令

说实话,做PKI这行,OpenSSL就是你的瑞士军刀。我见过不少新手,一上来就找各种GUI工具,折腾半天证书还是签不对。其实你只要把OpenSSL玩熟了,后面所有章节都会顺很多。

这一章,我们就把OpenSSL的安装、配置和几个最常用的命令讲透。嗯,别小看这些基础操作,我在生产环境里踩过的坑,多半都是这些“基本功”没打牢。

3.1 安装与基础配置

OpenSSL的安装其实不复杂,但不同平台有点小差异。我个人习惯在Linux上做CA,因为脚本化操作方便。但Windows下做测试也完全OK。

Linux(以Ubuntu/CentOS为例)

# Ubuntu / Debian
sudo apt update
sudo apt install openssl -y

# CentOS / RHEL
sudo yum install openssl -y

装完之后,验证一下版本:

openssl version
# 输出示例:OpenSSL 1.1.1k  25 Mar 2021
我的建议:尽量用1.1.1以上版本。1.0.2已经停止维护了,安全漏洞没人修。我曾经在一个遗留系统上见过1.0.1,吓得我连夜升级。

Windows安装

去官网下载Win64 OpenSSL安装包,或者用包管理器:

# 用chocolatey
choco install openssl

# 或者用scoop
scoop install openssl

装完后记得把 C:\Program Files\OpenSSL-Win64\bin 加到PATH里。不然每次都要输全路径,很烦。

配置文件在哪?

OpenSSL的行为很大程度上靠一个配置文件控制。默认位置:

平台 默认路径
Linux /etc/ssl/openssl.cnf
Windows C:\Program Files\OpenSSL-Win64\bin\cnf\openssl.cnf

你可以用 openssl version -d 查看当前使用的目录。我个人习惯把配置文件复制一份到工作目录,然后修改,避免影响系统配置。

3.2 常用命令概览

OpenSSL的命令很多,但日常做证书签发,你真正需要掌握的其实就这几个。我把它们分成三类:

3.2.1 密钥与随机数

生成随机数,是密码学里最基础也最容易出错的一步。为什么?因为计算机本质上是确定性的,它很难产生“真随机”。

# 生成16字节(128位)随机数,以十六进制显示
openssl rand -hex 16

# 生成32字节随机数,以Base64显示
openssl rand -base64 32

# 生成随机数并写入文件
openssl rand -out random.bin 32
注意:千万不要用 openssl rand 生成的随机数直接当密码用。它适合做密钥材料、IV、nonce,但不适合人类记忆。我曾经见过有人把hex输出直接当用户密码,结果自己都记不住。

生成私钥时,OpenSSL内部会调用随机数生成器。你可以指定算法和长度:

# 生成RSA私钥(2048位)
openssl genrsa -out private.pem 2048

# 生成ECC私钥(prime256v1曲线)
openssl ecparam -genkey -name prime256v1 -out ecdsa-private.pem

我个人更推荐ECC。同样的安全强度,ECC的密钥比RSA短得多,证书体积也小。尤其在IoT设备上,优势很明显。

3.2.2 证书请求(CSR)与签发

CSR是申请证书的“申请书”。里面包含你的公钥和身份信息。

# 从现有私钥生成CSR
openssl req -new -key private.pem -out request.csr

# 交互式输入信息,或者用 -subj 参数一步到位
openssl req -new -key private.pem -out request.csr \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN=example.com"

查看CSR内容:

openssl req -in request.csr -noout -text

自签发证书(测试用):

openssl x509 -req -in request.csr -signkey private.pem -out cert.pem -days 365

3.2.3 证书查看与格式转换

查看证书:

openssl x509 -in cert.pem -noout -text
openssl x509 -in cert.pem -noout -subject -issuer -dates

格式转换(PEM ↔ DER):

# PEM → DER
openssl x509 -in cert.pem -outform DER -out cert.der

# DER → PEM
openssl x509 -in cert.der -inform DER -out cert.pem
核心要点:PEM是Base64编码的文本格式,DER是二进制格式。绝大多数CA和Web服务器都用PEM。Windows系统喜欢用DER或PFX。记住这个对应关系,后面做格式转换时就不会懵。

3.3 生成随机数:为什么它这么重要?

你可能会问:随机数不就是rand()吗?

还真不是。C语言的 rand() 是伪随机数生成器(PRNG),如果你不播种(seed),每次程序启动生成的序列都一样。这在密码学里是致命的。

OpenSSL的随机数生成器会从操作系统收集熵——比如鼠标移动、键盘延迟、磁盘IO时间等。这些才是真正的“随机源”。

我画了一张图,帮你理解随机数在证书签发流程中的位置:

随机数在证书签发中的核心作用 操作系统熵源 OpenSSL RNG 私钥生成 CSR随机数 证书序列号 OCSP Nonce 说明: 1. 操作系统熵源 → OpenSSL RNG:收集鼠标、键盘、磁盘等物理噪声 2. OpenSSL RNG → 私钥生成:确保每次生成的私钥唯一 3. OpenSSL RNG → CSR/序列号/OCSP:防止重放攻击和预测攻击 4. 如果随机数生成器熵不足,私钥可能被暴力破解

你看,从私钥生成到证书序列号,再到OCSP的Nonce,每一步都依赖高质量的随机数。如果随机数出了问题,整个PKI体系就像纸糊的一样。

避坑指南:我曾经在Docker容器里生成CA私钥,结果容器刚启动,熵池几乎是空的。生成的私钥居然和另一个容器一模一样!后来我强制在生成前执行 openssl rand -writerand /tmp/rnd 来填充熵池,才解决这个问题。

3.4 实战小练习:生成你的第一个密钥对

我们来动手做一个小实验。打开终端,跟着我敲:

# 1. 生成一个随机数种子文件
openssl rand -out seed.bin 32

# 2. 用这个种子生成RSA私钥
openssl genrsa -rand seed.bin -out mykey.pem 2048

# 3. 查看私钥信息
openssl rsa -in mykey.pem -noout -text

# 4. 从私钥提取公钥
openssl rsa -in mykey.pem -pubout -out mypub.pem

# 5. 查看公钥
openssl rsa -pubin -in mypub.pem -noout -text

看到没?私钥里有 modulus、publicExponent、privateExponent 等参数。公钥里只有 modulus 和 publicExponent。这就是RSA的非对称性。

记住:私钥文件一定要保护好。权限设为600,不要上传到Git仓库,不要放在Web目录下。我见过太多因为私钥泄露导致的安全事故了。