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
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
3.3 生成随机数:为什么它这么重要?
你可能会问:随机数不就是rand()吗?
还真不是。C语言的 rand() 是伪随机数生成器(PRNG),如果你不播种(seed),每次程序启动生成的序列都一样。这在密码学里是致命的。
OpenSSL的随机数生成器会从操作系统收集熵——比如鼠标移动、键盘延迟、磁盘IO时间等。这些才是真正的“随机源”。
我画了一张图,帮你理解随机数在证书签发流程中的位置:
你看,从私钥生成到证书序列号,再到OCSP的Nonce,每一步都依赖高质量的随机数。如果随机数出了问题,整个PKI体系就像纸糊的一样。
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的非对称性。