2. 环境准备:OpenSSL 的安装与配置
好,咱们正式开始动手之前,先把家伙事儿备齐。生成 CSR 的核心工具就是 OpenSSL,这玩意儿几乎是 PKI 世界的“瑞士军刀”。我这些年处理过的证书请求,十有八九都是靠它搞定的。
这一章,我带你把 OpenSSL 装好,验证它能不能跑,再认识一下那个让很多人头疼的 openssl.cnf 配置文件。说白了,环境搞顺了,后面才能不卡壳。
2.1 各平台安装 OpenSSL
不同操作系统,安装方式不太一样。我分别说说,你按自己的环境来就行。
2.1.1 Windows 安装
Windows 下我建议直接用预编译的二进制包,省心。我个人习惯用 Shining Light Productions 提供的 Win64 OpenSSL 版本,稳定,没广告。
- 访问 Win64 OpenSSL 下载页面,选完整版(Full version),别下 Light 版,Light 版缺一些工具。
- 运行安装程序,安装路径我建议用默认的
C:\Program Files\OpenSSL-Win64。 - 安装过程中会问你是否把 OpenSSL 的 DLL 复制到系统目录,选“复制到系统目录”或者“在系统 PATH 中”。
openssl version,如果提示“不是内部或外部命令”,说明 PATH 没配好。你需要手动把 C:\Program Files\OpenSSL-Win64\bin 加到系统环境变量里。
2.1.2 Linux 安装
Linux 就简单多了,包管理器一把梭。我在 CentOS 和 Ubuntu 上都踩过坑,这里直接给最稳的命令。
| 发行版 | 安装命令 | 备注 |
|---|---|---|
| Debian / Ubuntu | sudo apt update && sudo apt install openssl -y |
一般系统自带,但版本可能旧,建议更新 |
| CentOS / RHEL 7/8 | sudo yum install openssl -y |
CentOS 8 以上用 dnf |
| Fedora | sudo dnf install openssl -y |
Fedora 默认也是最新版 |
嗯,这里要注意:有些 Linux 发行版默认装的是 OpenSSL 1.0.x 或 1.1.x。虽然也能用,但我建议至少 1.1.1 以上版本,因为 1.1.1 才开始完整支持 TLS 1.3。我曾经在 CentOS 7 上遇到过因为 OpenSSL 版本太低,导致生成的 CSR 在某个新平台解析失败的情况,折腾了半天。
2.1.3 macOS 安装
macOS 自带的 LibreSSL 跟 OpenSSL 不完全兼容,我建议你单独装一个。用 Homebrew 最方便。
# 先确保 Homebrew 已安装
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 安装 OpenSSL
brew install openssl
# 把 OpenSSL 加入 PATH(以 zsh 为例)
echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
装完之后,记得用 which openssl 确认一下路径,确保你调用的不是系统自带的 LibreSSL。
2.2 验证安装是否成功
装完别急着走,先验证一下。这一步很简单,但很重要。我见过太多人装完就以为万事大吉,结果一跑命令就报错。
打开终端(Windows 下是命令提示符或 PowerShell),输入:
openssl version
你应该会看到类似这样的输出:
OpenSSL 3.0.12 24 Oct 2023 (Library: OpenSSL 3.0.12 24 Oct 2023)
如果能看到版本号,恭喜你,安装成功了。
再跑一个稍微复杂点的命令,确认核心功能正常:
openssl help
这个命令会列出所有可用的子命令。如果屏幕刷出一大堆标准命令、消息摘要命令、加密命令,那就稳了。
openssl: error while loading shared libraries: libcrypto-3-x64.dll 之类的错误,别慌。这通常是 DLL 没找到。去安装目录的 bin 文件夹下,把 libcrypto-3-x64.dll 和 libssl-3-x64.dll 复制到 C:\Windows\System32 里,重启终端就好了。
2.3 认识 openssl.cnf 配置文件
这个文件,可以说是 OpenSSL 的“总参谋部”。很多新手一看到它就头大,觉得又长又乱。其实说白了,它就是告诉 OpenSSL:生成证书请求时,默认的国家、城市、组织名是什么;CA 签发证书时,哪些扩展项必须加进去。
OpenSSL 在运行时会按以下顺序查找这个文件:
- 环境变量
OPENSSL_CONF指定的路径(优先级最高) - 命令行参数
-config指定的路径 - 默认路径(编译时指定的,通常是
/etc/ssl/openssl.cnf或安装目录下的openssl.cnf)
我个人习惯是,在项目目录里放一份自定义的 openssl.cnf,然后用 -config 参数指定它。这样不会污染系统配置,也方便团队共享。
下面是一个精简版的 openssl.cnf 核心结构,我帮你拆开看:
[ req ]
default_bits = 2048 # 密钥长度,我建议至少 2048
distinguished_name = req_distinguished_name # 指向 DN 模板段
string_mask = utf8only # 字符编码,支持中文
prompt = no # 设为 no,直接从下面读取,不交互提问
[ req_distinguished_name ]
countryName = CN
stateOrProvinceName = Beijing
localityName = Beijing
organizationName = Example Inc.
organizationalUnitName = IT Dept
commonName = www.example.com
emailAddress = admin@example.com
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = www.example.com
DNS.2 = example.com
DNS.3 = mail.example.com
你看,其实不复杂。几个关键段:
[ req ]:请求段的全局设置,比如密钥长度、是否交互式提问。[ req_distinguished_name ]:定义证书主题(DN)的默认值。生成 CSR 时,OpenSSL 会从这里取值。[ v3_req ]:定义 X.509 v3 扩展。比如subjectAltName(SAN,主题备用名称),现在浏览器都认这个,不配 SAN 的证书基本废了。[ alt_names ]:SAN 的具体列表,可以配多个域名或 IP。
commonName 和 subjectAltName 必须匹配你最终要保护的域名。我遇到过有人只改了 CN,忘了改 SAN,结果证书装上后浏览器报“不安全”,排查了半天才发现是 SAN 没配。
为了让你更直观地理解 OpenSSL 安装、验证、配置之间的关系,我画了张图:
这张图把整个流程串起来了。你按这个顺序走,基本不会出岔子。
openssl.cnf 文件,那玩意儿有几百行。你就从上面这个精简版开始,够用。等后面需要做 CA 或者配置 OCSP 时,再慢慢往里加内容。我曾经直接拿系统默认的 cnf 去生成 CSR,结果发现它默认的 SAN 是空的,导致生成的证书不包含域名,白忙活一场。