Administrator
发布于 2026-03-30 / 35 阅读
0
0

企业内部 PKI 与证书管理

前言

  • 含自签名证书 / 证书链 / 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 -i

2. 安装必需软件

apt update && apt install -y openssl easy-rsa nginx curl
  • openssl:生成证书的底层工具

  • easy-rsa:帮你简化证书流程,不用记复杂命令

  • nginx:搭建网站,用来演示 HTTPS

  • curl:测试网站是否能访问

3. 创建工作目录

mkdir -p /opt/pki

cd /opt/pki

4. 搭建根 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
EOF

b.为什么这么做?

  • 生成公司根证书(相当于公司公章)

  • 以后内网所有设备,只要信任这个根证书,就信任你发的所有网站证书

重要文件

  • 根证书: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-root

5. 搭建 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
EOF

b.结果图:

初始化中间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-inter

6. 根证书签名中间证书

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
EOF

b. 结果图

创建内网域名

c.核心意义

操作

现实生活类比

./easyrsa gen-req

去派出所申请办身份证

Common Name 填写

身份证上的 “姓名”

其他 DN 字段

身份证上的 “住址、单位、联系电话”

CA 签名

派出所盖章,确认这张证是合法有效的

部署到网站

把身份证挂在门口,让所有人都能查验

yxwa.com(CN)

可自定义,内网使用无需购买备案

8. 合并证书链

a.操作命令:使浏览器信任

cat pki/issued/yxwa.com.crt \
    pki/inter-ca.crt \
    /opt/pki/easy-rsa-root/pki/ca.crt \
    > pki/fullchain.crt

b.结果图

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 nginx

b.结果图

访问域名

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 nginx

b.结果图

在文件里篡改(添加、删除等都可以)

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

方式二:中间人替换证书

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.com

b.结果图:

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 nginx

d.核心总结

  • 只要改证书里一个字符,服务就起不来,这就是防篡改

  • 换一个假证书,浏览器直接拦死,这就是防冒充

  • 只有我们自己的根 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(已吊销)

总结

  1. 如果无法访问域名,可以在宿主机上执行sudo nano /etc/hosts在文件写入 IP + 域名保存以后,刷新DNS如果是MacOs使用sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder 刷新

  2. 签发网站服务器证书过程中可能会出现CA环境不全,根据提示创建所需要的路径和文件昵称补充,可解决

  3. 一定要理清楚创建的路径,看清楚是在根CA下执行,还是中间CA下执行

生活化的类比总结

  • 根 CA =公司总部公章

最权威、最安全,只用来给下级部门授权,不直接给员工办证。

  • 中间 CA = 各部门人事

拿着总部授权,真正负责给服务器、应用、接口办身份证、开证明。

  • 数字证书 = 员工工牌 / 门禁卡

上面有名字(域名)、照片(公钥)、有效期,别人一看就知道是不是自己人。

  • HTTPS = 加密聊天 + 密封快递

数据在网上传输不再是 “明信片”,而是 “密封信封”,别人截了也看不懂、改不了。

  • 证书链 = 层层盖章证明

总部盖章 -> 部门盖章 -> 工牌,一环扣一环,确保没人伪造证件。

  • CRL 证书吊销 = 黑名单

员工离职、工牌丢失,立刻拉黑,防止别人捡去乱刷门禁。


评论