第3章:OpenSSL入门——从安装到生成第一张根证书

说实话,我见过不少工程师一上来就对着 OpenSSL 的命令行发懵。几百个参数,几十种子命令,光一个 req 就能把人绕晕。但你别怕,这一章我带你走一遍最核心的路径:装好它、理解它、然后用它生成你的第一张自签名根证书。

我自己带团队做 PKI 项目时,最常用的工具就是 OpenSSL。它虽然长得丑,但真的能打。咱们开始吧。

3.1 OpenSSL 是什么?

OpenSSL 是一个开源的加密工具包。它实现了 SSL/TLS 协议,也提供了各种密码学算法。说白了,它就是证书世界的「瑞士军刀」。

你可以用它做这些事:

  • 生成 RSA、ECC 等密钥对
  • 创建证书签名请求(CSR)
  • 签发和验证 X.509 证书
  • 计算文件哈希、加解密数据
  • 搭建测试用的 HTTPS 服务器

嗯,这里要注意:OpenSSL 不是 CA 系统,但它能帮你搭建 CA 系统。很多商业 CA 的底层,其实也在用 OpenSSL 的库。

3.2 安装与编译

安装 OpenSSL 的方式取决于你的操作系统。我分别说一下常见的几种场景。

3.2.1 Linux 下安装

大部分 Linux 发行版都预装了 OpenSSL。你可以先检查一下版本:

openssl version

如果没装,或者版本太旧(比如低于 1.1.1),我建议你手动编译最新版。为什么?因为旧版本不支持 TLS 1.3,而且有些安全漏洞已经公开了。

用包管理器安装也很简单:

# Ubuntu / Debian
sudo apt-get install openssl libssl-dev

# CentOS / RHEL
sudo yum install openssl openssl-devel

3.2.2 从源码编译

我个人习惯从源码编译,尤其是生产环境。这样能控制编译选项,比如启用或禁用某些算法。

# 下载源码
wget https://www.openssl.org/source/openssl-3.0.12.tar.gz
tar -xzf openssl-3.0.12.tar.gz
cd openssl-3.0.12

# 配置、编译、安装
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
make -j$(nproc)
sudo make install

# 更新动态链接库
sudo ldconfig

编译时有个坑:如果你系统里同时有多个 OpenSSL 版本,链接时可能会冲突。我曾经因为没指定 --prefix,结果把系统自带的 OpenSSL 给覆盖了,导致 SSH 都连不上……嗯,从那以后我每次编译都会单独指定安装目录。

3.2.3 macOS 和 Windows

macOS 上我推荐用 Homebrew:

brew install openssl

Windows 用户可以去官网下载预编译的安装包,或者用 WSL 在 Linux 子系统里操作。我个人觉得在 Windows 上编译 OpenSSL 有点折腾,除非你有特殊需求。

3.3 常用命令概览

OpenSSL 的命令结构是:openssl 子命令 [参数]。下面这张表列出了我工作中最常用的几个子命令。

子命令 用途 典型场景
req 生成 CSR 或自签名证书 创建根证书、服务端证书
ca 模拟 CA 签发证书 搭建内部 CA 流程
x509 查看或转换证书 检查证书有效期、格式转换
genrsa 生成 RSA 私钥 密钥对生成
ecparam 生成 ECC 参数和密钥 ECC 证书场景
s_client 模拟 TLS 客户端连接 测试 HTTPS 握手
s_server 启动测试用 TLS 服务器 本地调试双向认证
verify 验证证书链 检查证书是否可信

你想想看,这些命令其实就覆盖了证书生命周期的全部环节:生成、签发、查看、验证、调试。学透了这几个,日常工作中 90% 的场景你都能搞定。

3.4 生成自签名根证书

好,重头戏来了。咱们亲手生成一张自签名根证书。这张证书以后可以用来签发其他证书,比如服务端证书、客户端证书。

3.4.1 生成根密钥

第一步,先生成根 CA 的私钥。我建议用 ECC 算法,性能好、密钥短。当然 RSA 也完全没问题。

# 生成 ECC 私钥(推荐)
openssl ecparam -genkey -name prime256v1 -out ca.key

# 或者生成 RSA 私钥(兼容性更好)
openssl genrsa -out ca.key 2048

这里有个细节:prime256v1 是 NIST 推荐的 P-256 曲线,安全性足够,性能也好。我个人偏爱 ECC,因为同样的安全强度下,ECC 的密钥只有 RSA 的十分之一大小。

3.4.2 生成自签名根证书

有了私钥,就可以生成自签名证书了。自签名意味着证书的签发者和使用者是同一个实体——也就是我们自己。

openssl req -new -x509 -days 3650 \
  -key ca.key \
  -out ca.crt \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=MyLab/OU=DevOps/CN=MyLab Root CA"

参数说明:

  • -new:生成新的证书请求
  • -x509:直接输出自签名证书,而不是 CSR
  • -days 3650:有效期 10 年。根证书一般设长一点,比如 10 年或 20 年
  • -key:指定私钥文件
  • -out:输出证书文件
  • -subj:证书的主题信息。这里我写了一个示例,你换成你自己的组织信息
注意:根证书的私钥一定要保护好。一旦泄露,攻击者可以用它签发任意证书,你的整个 PKI 体系就废了。我建议把根密钥离线存储,比如放在加密的 U 盘里,平时不联网。

3.4.3 查看生成的证书

证书生成后,可以用 x509 命令查看它的内容:

openssl x509 -in ca.crt -text -noout

你会看到证书的版本、序列号、签名算法、颁发者、使用者、有效期、公钥信息,以及扩展字段。其中 CA:TRUE 这个扩展很重要,它表明这张证书可以用于签发下级证书。

3.5 本章知识体系

下面这张图帮你梳理了本章的核心逻辑:从安装 OpenSSL,到掌握常用命令,再到生成根证书。每一步都是后续章节的基础。

OpenSSL入门知识体系 OpenSSL 入门知识体系 安装与编译 Linux / macOS / Windows 常用命令概览 生成根证书 包管理器安装 源码编译(--prefix) 版本检查与升级 req / ca / x509 genrsa / ecparam s_client / s_server / verify 生成密钥(ECC/RSA) 自签名证书(-x509) 查看证书内容 核心目标:掌握 OpenSSL 安装、常用命令、根证书生成 为后续章节的 CA 搭建和双向认证打下基础

本章要点回顾:

  • OpenSSL 是证书管理的核心工具,支持密钥生成、证书签发、TLS 调试
  • 生产环境建议从源码编译,指定独立安装目录避免冲突
  • 掌握 req、ca、x509、s_client 等核心子命令
  • 生成根证书分两步:先创建私钥,再用 req -x509 自签名
  • 根私钥必须离线保管,这是整个 PKI 体系的安全基石

我的小建议:刚学 OpenSSL 时,别急着背参数。你只需要记住几个核心命令的套路:genrsa 生成密钥,req 生成证书,x509 查看证书。其他的用到再查,用多了自然就记住了。