2. 环境准备:OpenSSL 的安装与配置

好,咱们正式开始动手之前,先把家伙事儿备齐。生成 CSR 的核心工具就是 OpenSSL,这玩意儿几乎是 PKI 世界的“瑞士军刀”。我这些年处理过的证书请求,十有八九都是靠它搞定的。

这一章,我带你把 OpenSSL 装好,验证它能不能跑,再认识一下那个让很多人头疼的 openssl.cnf 配置文件。说白了,环境搞顺了,后面才能不卡壳。

2.1 各平台安装 OpenSSL

不同操作系统,安装方式不太一样。我分别说说,你按自己的环境来就行。

2.1.1 Windows 安装

Windows 下我建议直接用预编译的二进制包,省心。我个人习惯用 Shining Light Productions 提供的 Win64 OpenSSL 版本,稳定,没广告。

  1. 访问 Win64 OpenSSL 下载页面,选完整版(Full version),别下 Light 版,Light 版缺一些工具。
  2. 运行安装程序,安装路径我建议用默认的 C:\Program Files\OpenSSL-Win64。
  3. 安装过程中会问你是否把 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

这个命令会列出所有可用的子命令。如果屏幕刷出一大堆标准命令、消息摘要命令、加密命令,那就稳了。

小技巧: 如果你在 Windows 下遇到 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 在运行时会按以下顺序查找这个文件:

  1. 环境变量 OPENSSL_CONF 指定的路径(优先级最高)
  2. 命令行参数 -config 指定的路径
  3. 默认路径(编译时指定的,通常是 /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。
核心要点: 生成 CSR 时,commonName 和 subjectAltName 必须匹配你最终要保护的域名。我遇到过有人只改了 CN,忘了改 SAN,结果证书装上后浏览器报“不安全”,排查了半天才发现是 SAN 没配。

为了让你更直观地理解 OpenSSL 安装、验证、配置之间的关系,我画了张图:

OpenSSL 环境准备流程 OpenSSL 环境准备流程 1. 安装 OpenSSL Windows Linux macOS 2. 验证安装 (openssl version) 3. 了解 openssl.cnf 配置文件 [ req ] 段 [ req_distinguished_name ] 段 [ v3_req ] 扩展段

这张图把整个流程串起来了。你按这个顺序走,基本不会出岔子。

我的经验: 刚开始学的时候,别去啃完整的 openssl.cnf 文件,那玩意儿有几百行。你就从上面这个精简版开始,够用。等后面需要做 CA 或者配置 OCSP 时,再慢慢往里加内容。我曾经直接拿系统默认的 cnf 去生成 CSR,结果发现它默认的 SAN 是空的,导致生成的证书不包含域名,白忙活一场。