前言
含自签名证书 / 证书链 / HTTPS / 篡改演示 / 证书吊销
系统:Ubuntu 24.04.4 LTS
网络:PVE NAT 模式 IP:
172.16.11.52/24工具:OpenSSL、easy-rsa、Nginx
最终效果:搭建企业级证书体系 -> 部署 HTTPS 网站 -> 演示证书被篡改的风险
一、先明白我们再做什么
PKI = 公司自己搞一套 证书颁发机构
根 CA = 公司最高级信任根(绝对不能泄露)
中间 CA = 帮根 CA 代发证书(日常用)
服务器证书 = 给网站用的 HTTPS 证书
证书链 = 让浏览器相信:这个网站是公司认可的
吊销 = 证书丢了或者坏了,直接作废
篡改演示 = 亲眼看见 HTTPS 为什么安全
二、实操步骤
1. 登录为 root
sudo -i2. 安装必需软件
apt update && apt install -y openssl easy-rsa nginx curlopenssl:生成证书的底层工具easy-rsa:帮你简化证书流程,不用记复杂命令nginx:搭建网站,用来演示 HTTPScurl:测试网站是否能访问
3. 创建工作目录
mkdir -p /opt/pki
cd /opt/pki4. 搭建根 CA,信任根
a.操作命令
make-cadir easy-rsa-root
# 作用:创建一个存放 easy-rsa 证书工具 的目录
# easy-rsa-root = 你自己起的文件夹名字
# 系统会自动把证书脚本复制到这个目录里
# 进入文件夹
cd easy-rsa-root
# 初始化 PKI 公钥基础设施
./easyrsa init-pki
# 创建根 CA 证书 (nopass=免密,可选)
./easyrsa build-ca nopass << EOF
Root-CA
EOFb.为什么这么做?
生成公司根证书(相当于公司公章)
以后内网所有设备,只要信任这个根证书,就信任你发的所有网站证书
重要文件
根证书:
pki/ca.crt(公开,所有人可装)根密钥:
pki/private/ca.key(绝密,泄露 = 整个 PKI 报废)
c. 结果图:
初使PKI结果

创建根 CA 证书

d. 对根CA 加固,可选,防止私钥泄露
# 限制根CA目录权限,仅root用户可读写
chmod -R 700 /opt/pki/easy-rsa-root
# 限制私钥权限,仅root可读取
chmod 600 /opt/pki/easy-rsa-root/pki/private/ca.key
# 更改目录所属用户和组,确保只有root可控
chown -R root:root /opt/pki/easy-rsa-root5. 搭建 CA 中间证书
a.操作命令
# 回到上一级
cd ..
# 创建存放证书签发的文件夹
make-cadir easy-rsa-inter
# 进入文件夹
cd easy-rsa-inter
#初始化 PKI 公钥基础设施
./easyrsa init-pki
# 创建中间 CA 证书
./easyrsa gen-req inter-ca nopass << EOF
Enterprise-Inter-CA
EOFb.结果图:
初始化中间PKI公钥

创建中间证书

c.为什么要搞中间证书?
根证书太重要,不能天天拿出来签发服务器证书
中间证书专门负责日常签发,万一中间证书泄露,只需要吊销中间证书,根证书不受影响
标准安全结构:根 CA -> 中间 CA -> 服务器证书
d.中间CA加固,防止私钥泄露
chmod -R 700 /opt/pki/easy-rsa-inter
chmod 600 /opt/pki/easy-rsa-inter/pki/private/inter-ca.key
chown -R root:root /opt/pki/easy-rsa-inter6. 根证书签名中间证书
a. 操作命令
# 复制 中间 CA请求文件
cp /opt/pki/easy-rsa-inter/pki/reqs/inter-ca.req /opt/pki/easy-rsa-root/pki/reqs/
# 进入根 CA 文件夹
cd /opt/pki/easy-rsa-root
# 根证书 签名 中间CA 请求
./easyrsa sign-req intermediate inter-ca << EOF
yes
EOF
# 把签好名的中间CA证书,放回中间CA目录
cp /opt/pki/easy-rsa-root/pki/issued/inter-ca.crt /opt/pki/easy-rsa-inter/pki/b.结果图:
根证书签名中间CA请求结果

c.核心意义
用根证书给中间证书 盖章,让中间证书获得合法身份。
浏览器验证 HTTPS 时会逐级向上验证:
网站证书 -> 中间证书 -> 根证书
只要根可信,整条链都可信,这就是证书链工作原理
7. 签发网站服务器证书
a.操作命令:
(1) 补全中间 CA 环境
# 进入此文件夹
cd /opt/pki/easy-rsa-inter
# 将中间CA证书(inter-ca.crt)复制并重命名为 ca.crt(满足工具默认读取要求)
cp pki/inter-ca.crt pki/ca.crt
cp pki/private/inter-ca.key pki/private/ca.key
# 创建必需文件
touch pki/index.txt
touch pki/index.txt.attr
echo 01 > pki/serial
# 创建必需目录
mkdir -p pki/issued pki/certs_by_serial(2) 让HTTPS使用
# 创建内网域名
./easyrsa gen-req yxwa.com nopass
# 在Easy-RSA 工具中生成证书请求
./easyrsa sign-req server yxwa.com << EOF
yes
EOFb. 结果图
创建内网域名

c.核心意义
8. 合并证书链
a.操作命令:使浏览器信任
cat pki/issued/yxwa.com.crt \
pki/inter-ca.crt \
/opt/pki/easy-rsa-root/pki/ca.crt \
> pki/fullchain.crtb.结果图

c.核心意义
浏览器 / 客户端需要完整证书链才能验证身份。
只给服务器证书,浏览器会报 不安全、不受信任。
合并 = 根证书 + 中间证书,客户端一次拿到完整信任链。
9.将证书放入 Nginx 目录
a.操作命令
mkdir -p /etc/nginx/ssl
# 复制私钥
cp /opt/pki/easy-rsa-inter/pki/private/yxwa.com.key /etc/nginx/ssl/
# 复制 完整证书链(包含 服务器证书 + 中间CA + 根CA)
cp /opt/pki/easy-rsa-inter/pki/fullchain.crt /etc/nginx/ssl/
# Nginx 配置文件名
nano /etc/nginx/conf.d/yxwa.com.conf
# 配置内容
server {
listen 443 ssl;
server_name yxwa.com;
# 证书路径
ssl_certificate /etc/nginx/ssl/fullchain.crt;
ssl_certificate_key /etc/nginx/ssl/yxwa.com.key;
# 基础安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
}
# 限制Nginx证书权限(避免非授权访问)
chmod 600 /etc/nginx/ssl/*.key
chown root:root /etc/nginx/ssl/*
# 重启 Nginx 生效!
systemctl restart nginx
# 检查是否正常运行
systemctl status nginxb.结果图

访问域名

c.配置本地机hosts解析
由于yxwa.com是内网自定义域名,未在公网DNS解析,需在测试客户端配置hosts,将域名指向服务器IP
macOS客户端:编辑hosts文件
sudo nano /private/etc/hosts新增一行
IP+域名如172.16.11.52 yxwa.com使用此命令刷新DNS:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
d.核心意义
Nginx 服务默认读取 /etc/nginx/ 下的配置与证书。
放在其他路径 Nginx 找不到,会启动失败。
10.演示证书被篡改
方式一:手动篡改证书内容
a.操作步骤
# 先备份原始证书链和私钥匙
cp /etc/nginx/ssl/fullchain.crt /etc/nginx/ssl/fullchain.crt.bak
cp /etc/nginx/ssl/yxwa.com.key /etc/nginx/ssl/yxwa.com.key.bak
# 手动篡改证书内容
nano /etc/nginx/ssl/fullchain.crt
# 重启 Nginx
systemctl restart nginxb.结果图
在文件里篡改(添加、删除等都可以)

重启服务端直接拒绝加载被篡改的证书,服务无法启动

方式二:中间人替换证书
a.操作命令
# 生成一个假证书
openssl req -x509 -newkey rsa:2048 -keyout fake.key -out fake.crt -days 365 -nodes
# 把假证书和假私钥复制到 Nginx 目录
cp ~/fake.crt /etc/nginx/ssl/fullchain.crt
cp ~/fake.key /etc/nginx/ssl/yxwa.com.key
systemctl restart nginx
# 检查是否启动成功
systemctl status nginx
# 访问浏览器
https://yxwa.comb.结果图:

c.实验后恢复真实证书
cp /etc/nginx/ssl/fullchain.crt.bak /etc/nginx/ssl/fullchain.crt
cp /etc/nginx/ssl/yxwa.com.key.bak /etc/nginx/ssl/yxwa.com.key
systemctl restart nginxd.核心总结
只要改证书里一个字符,服务就起不来,这就是防篡改;
换一个假证书,浏览器直接拦死,这就是防冒充;
只有我们自己的根 CA 签发的证书,才能正常建立 HTTPS 连接,这就是 PKI 的核心价值
11.证书吊销(CRL)
当服务器证书过期、私钥泄露或服务下线时,需将证书吊销,避免被滥用
操作命令
# 步骤一 生成CRL(由根CA生成,因为根CA是信任基础)
# 切换到根CA目录
cd /opt/pki/easy-rsa-root
# 生成CRL文件(输入根CA私钥密码)
./easyrsa gen-crl
# 查看CRL文件(生成crl.pem,即吊销列表)
ls pki/crl/
# 正常输出:crl.pem
# 复制CRL文件到公共目录,便于客户端访问(可选,客户端可手动下载校验)
cp pki/crl.pem /var/www/html/
# 步骤二 吊销服务器证书
# 切换到中间CA目录(证书由中间CA签发,吊销操作在中间CA执行)
cd /opt/pki/easy-rsa-inter
# 吊销yxwa.com证书(输入中间CA私钥密码)
easyrsa revoke yxwa.com
# 提示:Are you sure you want to revoke the certificate [y/N]? 输入y确认
# 更新CRL(吊销后必须更新CRL,否则客户端无法识别)
easyrsa gen-crl
# 注意:此处生成的CRL是中间CA的CRL,若需全局生效,需同步到根CA的CRL中(可选,企业内网可简化)
# 查看吊销记录(确认证书已被吊销)
cat pki/index.txt
# 正常输出:R 260330120000Z 240330120000Z 01 yxwa.com # 其中R表示Revoked(已吊销)总结
如果无法访问域名,可以在宿主机上执行
sudo nano /etc/hosts在文件写入IP + 域名保存以后,刷新DNS如果是MacOs使用sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder刷新在签发网站服务器证书过程中可能会出现CA环境不全,根据提示创建所需要的路径和文件昵称补充,可解决
一定要理清楚创建的路径,看清楚是在根CA下执行,还是中间CA下执行
生活化的类比总结
根 CA =公司总部公章
最权威、最安全,只用来给下级部门授权,不直接给员工办证。
中间 CA = 各部门人事
拿着总部授权,真正负责给服务器、应用、接口办身份证、开证明。
数字证书 = 员工工牌 / 门禁卡
上面有名字(域名)、照片(公钥)、有效期,别人一看就知道是不是自己人。
HTTPS = 加密聊天 + 密封快递
数据在网上传输不再是 “明信片”,而是 “密封信封”,别人截了也看不懂、改不了。
证书链 = 层层盖章证明
总部盖章 -> 部门盖章 -> 工牌,一环扣一环,确保没人伪造证件。
CRL 证书吊销 = 黑名单
员工离职、工牌丢失,立刻拉黑,防止别人捡去乱刷门禁。