数字证书与 SSL/TLS
数字证书原理、分类、OpenSSL 命令、Let’s Encrypt 自动续期、Nginx HTTPS 配置全流程。
📖 证书基础概念
一、核心基础概念
❓ 什么是数字证书?
本质是一份经过权威机构签名的电子文件,作用等价于网络世界的「身份证+公章」。
- 载体:标准格式
X.509证书(行业通用); - 核心内容:持有者公钥、域名/主体信息、有效期、颁发机构、数字签名;
- 核心目的:防冒充、防篡改、加密通信、身份核验。
🔗 两个核心配套概念
(1)CA 证书(CA = Certificate Authority,证书颁发机构)
CA 是全网信任的第三方权威机构,相当于现实里的「公安局/公证处」。
- CA 自己持有 根证书(Root CA 证书),是整个信任链的源头;
- 根证书预装在:操作系统、浏览器、手机、终端设备里(出厂自带);
- 逻辑:大家默认信任内置的根证书 → 也就信任它签发的所有下级证书。
(2)SSL/TLS 证书
日常说的 SSL证书、HTTPS证书,都属于终端业务证书,由 CA 颁发给网站/服务端使用。
- SSL 是旧协议,现在主流是 TLS,口语仍统称 SSL 证书;
- 作用:给网站、接口、服务做加密传输 + 身份认证,实现 HTTPS。
二、证书层级:完整信任链(从上到下)
完整链条:根CA证书 → 中级CA证书(中间证书) → 终端SSL证书
- 根CA证书(Root CA)
- 信任链顶端,绝对信任源;
- 密钥极度保密,几乎不直接给用户签发证书,只用来签名「中间CA」;
- 设备系统/浏览器内置,用户一般看不到、也不用手动部署。
- 中间CA证书(Intermediate CA)
- 根CA授权的二级机构,负责实际对外签发终端证书;
- 部署场景:业务服务器上必须和终端证书一起配置,否则浏览器/客户端会报「证书不被信任」。
- 终端证书(服务器SSL证书/用户证书)
- 最终给网站、API、服务、个人使用的证书;
- 我们日常申请、部署、续费的就是这一类。
一句话记:根证书是“总公章”,中间证书是“分部公章”,SSL证书是“个人/企业身份证”。
三、按用途分类(网络/运维工作最常用)
类别1:服务器证书(最常见,HTTPS 用)
也就是大家常说的 SSL/TLS 证书,部署在 Web 服务器(Nginx、Apache、Tomcat、负载均衡、CDN)上。
核心两大作用
- 通信加密
客户端 ↔ 服务器 之间的数据被加密,运营商、中间人抓包只能看到乱码,防窃听。 - 身份认证
证明“你访问的域名确实属于这家企业/站点”,防钓鱼、防冒充网站。
按验证强度分 3 种(选购/面试常考)
- DV 域名型证书(Domain Validation)
- 只验证:你是否拥有这个域名管理权(解析、文件验证、邮箱验证);
- 特点:申请快、免费(Let’s Encrypt 主流免费DV证书)、价格低;
- 浏览器展示:地址栏小锁,不显示企业名称;
- 适用:个人博客、小型站点、内部测试服务、API接口。
- OV 企业型证书(Organization Validation)
- 验证:域名所有权 + 企业真实工商信息;
- 特点:审核严格、耗时几天、收费;
- 浏览器:地址栏小锁,可查看对应的企业名称;
- 适用:企业官网、电商、对外业务系统(主流商用选择)。
- EV 增强型证书(Extended Validation)
- 最高级别,严格核验企业资质、经营地址、法人信息;
- 浏览器:地址栏直接显示企业全名,安全标识最强;
- 适用:银行、支付、金融、政务等高信任要求站点。
按覆盖域名范围细分
- 单域名证书:只保护一个域名(如
www.xxx.com); - 多域名证书(SAN):一张证书绑定多个不同域名;
- 通配符证书(Wildcard):保护一个域名下所有子域名,例
*.xxx.com适配a.xxx.com、b.xxx.com。
类别2:客户端证书(双向认证用)
上面的SSL是单向认证:客户端验证服务器身份。
客户端证书 = 给用户/客户端发的数字身份证,实现 双向HTTPS认证。
作用
- 服务器也要核验客户端证书,只有持有合法证书的设备/用户才能接入服务;
- 强身份鉴权,替代账号密码,防非法接入。
典型场景
- 企业内网后台、VPN、运维堡垒机、数据库远程连接;
- 金融、政务、工业设备、物联网设备接入;
- 接口API强安全管控(接口调用必须携带客户端证书)。
部署形态
一般是 .pfx/.p12(带私钥的证书包),客户端浏览器/应用导入使用。
类别3:CA 根证书 / 中间证书(信任锚)
- 根证书
- 来源:操作系统、浏览器、手机系统出厂预装;
- 运维场景:极少手动部署,只有私有CA自建环境才需要(内网无公网CA)。
- 中间证书
- 公网SSL证书配套文件,Nginx/负载均衡必须串联配置;
- 漏配 → 部分浏览器/老终端提示「证书链不完整、不安全」。
类别4:私有CA(自建证书体系,运维高频)
什么是私有CA?
企业/团队自己搭建一套证书签发体系,不使用公网商业CA。
- 适用场景:纯内网环境(内网网站、K8s集群、微服务、数据库、MQ、VPN、服务器互访);
- 原因:内网域名不对外解析,公网CA不给签发免费/商用证书。
完整流程(运维实操流程)
- 自己生成 根CA证书 + 根私钥;
- 用根CA签发 中间CA证书;
- 用中间CA签发 内网服务器SSL证书、客户端证书;
- 把自建根证书手动导入到所有内网服务器、员工电脑、容器、终端(让设备信任这套私有CA)。
典型应用:K8s 集群内部通信、服务网格、微服务加密、内网HTTPS、主机SSH证书登录。
四、常见文件后缀(运维必认)
不同后缀只是编码/打包格式,内容都是 X.509 证书:
- .crt / .cer / .pem明文文本格式(Base64编码),最常用;Nginx、Apache、容器基本都用
pem。
- 存放:公钥、证书内容,不含私钥。
- .key
单独的私钥文件,和证书配对使用,权限必须严格管控(600),泄露=安全事故。 - .pfx / .p12
二进制打包文件,证书 + 私钥 + 中间证书 合并在一起,一般加密并设置密码;
多用于Windows、客户端浏览器、Java应用。 - .csr
证书签名请求文件:向CA申请证书时提交的文件,不含私钥,只包含域名、公钥、企业信息。
五、核心工作流程(HTTPS 单向认证,通俗版)
- 站点管理员向CA提交域名信息 + CSR文件;
- CA 验证域名/企业资质,签发 SSL证书(公钥);
- 管理员把「SSL证书 + 中间证书 + 本地私钥」部署在Nginx/服务端;
- 用户打开网站,浏览器先拿到服务器证书;
- 浏览器逐级向上校验:终端证书 → 中间证书 → 根证书;
校验通过 = 信任该站点; - 双方用证书里的公钥/私钥协商密钥,后续通信全程加密。
六、日常运维高频场景总结
1. 公网对外服务(官网、小程序、APP接口)
- 用:公网CA签发的 DV/OV/EV SSL证书;
- 免费首选:Let’s Encrypt(DV通配符/单域名,自动续期);
- 部署:Nginx/Ingress 配置
pem证书 + key私钥 + 中间证书。
2. 纯内网环境(内网系统、K8s、微服务、数据库)
- 用:自建私有CA,整套证书体系内部签发;
- 关键:所有节点必须导入自建根证书,否则报证书不信任。
3. 高安全接入(VPN、堡垒机、涉密接口)
- 用:双向证书认证(服务端SSL证书 + 客户端证书),无证拒绝连接。
4. 常见故障(排障点)
- 浏览器提示「证书不安全、不受信任」
- 原因1:证书过期;原因2:域名不匹配;原因3:缺少中间证书;原因4:内网自建CA,终端未导入根证书。
- 证书链错误:证书、中间证书顺序配置颠倒。
- 私钥权限过大:
chmod 755 key→ 服务启动失败/安全告警。
七、一句话极简区分(记忆版)
- CA:发证的权威机构,根证书是信任源头;
- SSL/TLS证书:CA发给网站/服务的“身份证”,实现HTTPS加密+身份验证;
- DV/OV/EV:SSL证书的三个安全等级,审核严格程度依次升高;
- 客户端证书:给用户/设备的身份证,用于双向认证、强接入管控;
- 私有CA:企业自己搭的发证系统,专门给内网使用。
🛠️ 证书使用实战
环境说明:基于 Linux 系统,使用 openssl 工具(系统默认自带),所有操作以 root 权限执行。
一、先认识基础文件 & 通用命令
1. 核心文件回顾
*.key:私钥,绝对保密,权限必须设为600*.csr:证书签名请求,提交给 CA 用来申请证书(不含私钥)*.pem/.crt:公钥证书、中间证书*.pfx/.p12:证书+私钥打包文件(Windows/Java/客户端常用)
2. 常用 openssl 查看命令(排错必备)
# 查看证书内容、域名、有效期、签发机构
openssl x509 -in xxx.pem -text -noout
# 查看 CSR 文件信息
openssl req -in xxx.csr -text -noout
# 校验证书和私钥是否配对(模数一致则配对)
openssl x509 -in server.pem -noout -modulus
openssl rsa -in server.key -noout -modulus
# 查看证书有效期
openssl x509 -in server.pem -dates -noout
二、场景一:公网 SSL 证书(对外网站/接口,HTTPS 单向认证)
主流流程:生成私钥 → 生成CSR → 向公网CA申请证书 → 部署到 Web/负载均衡
以 Nginx 为例,同时区分「免费证书(Let’s Encrypt)」和「商业证书」。
方式1:免费证书 Let’s Encrypt(推荐,自动续期)
适合个人、中小企业公网站点,DV 证书,全自动申请+续期。
1. 安装工具 certbot
# CentOS/RHEL
yum install certbot -y
# Debian/Ubuntu
apt install certbot -y
2. 申请证书(两种模式)
模式A:自动配置 Nginx(最简单)
# 自动检测 Nginx 配置、申请证书、改写配置、开启HTTPS
certbot --nginx -d www.xxx.com -d xxx.com
执行后交互式填写邮箱、同意协议,完成后:
-
证书默认路径:
/etc/letsencrypt/live/域名/ -
fullchain.pem= 终端证书 + 中间证书(证书链) -
privkey.pem= 私钥 -
Nginx 配置自动修改,HTTPS 直接生效
模式B:仅申请证书,手动配置 Web 服务
certbot certonly --webroot -w /网站根目录 -d www.xxx.com
3. 自动续期(定时任务)
Let’s Encrypt 证书有效期 90天,必须续期:
# 手动测试续期
certbot renew --dry-run
# 添加定时任务,每日自动检测续期
crontab -e
# 写入(每天凌晨2点执行)
0 2 * * * /usr/bin/certbot renew --quiet && systemctl reload nginx
方式2:商业 OV/EV 证书(企业商用)
步骤1:本地生成私钥 + CSR
- 创建目录存放文件
mkdir -p /etc/ssl/official && cd /etc/ssl/official
- 生成 RSA 私钥(
server.key)
# 生成无加密私钥(服务部署常用)
openssl genrsa -out server.key 2048
# 严格权限
chmod 600 server.key
- 生成 CSR 文件(提交给 CA 机构)
openssl req -new -key server.key -out server.csr
交互式填写信息:
- Country Name:国家 CN
- State:省份
- Locality:城市
- Organization Name:企业名称
- Organizational Unit:部门
- Common Name:填写绑定的域名(必填)
- Email:邮箱
步骤2:提交 CSR 申请证书
将 server.csr 内容复制,在证书厂商后台提交,完成域名/企业审核,厂商会下发:
- 终端证书
server.crt - 中间证书
intermediate.crt
步骤3:Nginx 部署 HTTPS
编辑 Nginx 站点配置:
server {
listen 80;
server_name www.xxx.com xxx.com;
# 强制跳转 HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name www.xxx.com xxx.com;
# 证书配置:证书链(终端+中间证书)、私钥
ssl_certificate /etc/ssl/official/server.crt;
ssl_certificate_key /etc/ssl/official/server.key;
# 串联中间证书(部分厂商单独提供时配置)
ssl_trusted_certificate /etc/ssl/official/intermediate.crt;
# 基础优化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
root /网站路径;
index index.html;
}
}
重启 Nginx 生效:
nginx -t # 检查配置语法
systemctl restart nginx
三、场景二:自建私有 CA(内网环境,核心重点)
适用:内网网站、K8s、微服务、数据库、MQ、内网API。
完整流程:搭建根CA → 签发中间CA(可选) → 签发服务器证书 → 全节点导入根证书信任
步骤1:搭建根 CA(信任根,整个内网的信任源头)
- 规划目录
mkdir -p /etc/ssl/private-ca/{root,server,client}
cd /etc/ssl/private-ca/root
- 生成根 CA 私钥
openssl genrsa -out root-ca.key 4096
chmod 600 root-ca.key
- 生成根 CA 证书(自签名,有效期建议长一点,例10年)
openssl req -x509 -new -nodes -key root-ca.key -sha256 -days 3650 -out root-ca.pem
交互式填写信息,Common Name 填写 Private Root CA 即可。
产出:
root-ca.key:根CA私钥(绝密,妥善备份)root-ca.pem:根证书(所有内网设备必须导入这个文件,才能信任整套证书)
步骤2:签发内网服务器证书(给内网站点/服务使用)
1)生成服务端私钥 + CSR
cd /etc/ssl/private-ca/server
# 1. 服务私钥
openssl genrsa -out server.key 2048
chmod 600 server.key
# 2. 生成 CSR,Common Name 填内网域名/主机名
openssl req -new -key server.key -out server.csr
2)用根CA签发服务器证书(有效期 2 年)
openssl x509 -req \
-in server.csr \
-CA ../root/root-ca.pem \
-CAkey ../root/root-ca.key \
-CAcreateserial \
-days 730 \
-sha256 \
-out server.pem
产出:server.pem(服务端公钥证书)
步骤3:内网所有机器导入根证书(关键!否则提示不安全)
1. Linux 系统全局信任(所有应用/浏览器生效)
# CentOS/RHEL
cp /etc/ssl/private-ca/root/root-ca.pem /etc/pki/tls/certs/
update-ca-trust extract
# Debian/Ubuntu
cp /etc/ssl/private-ca/root/root-ca.pem /usr/local/share/ca-certificates/
update-ca-certificates
2. 容器/K8s 环境信任
制作镜像时把 root-ca.pem 放入系统证书目录,或在 Pod 中挂载证书目录。
步骤4:内网 Nginx 部署(同公网配置)
配置文件直接引用自建的 server.pem 和 server.key 即可:
listen 443 ssl;
ssl_certificate /etc/ssl/private-ca/server/server.pem;
ssl_certificate_key /etc/ssl/private-ca/server/server.key;
四、场景三:双向证书认证(服务端+客户端证书,高安全内网)
适用:VPN、堡垒机、涉密接口、数据库连接、API 接口强校验。
逻辑:客户端校验服务端证书 + 服务端校验客户端证书,无证拒绝连接。
步骤1:基于上面的私有CA,签发客户端证书
cd /etc/ssl/private-ca/client
# 1. 客户端私钥
openssl genrsa -out client.key 2048
chmod 600 client.key
# 2. 客户端 CSR
openssl req -new -key client.key -out client.csr
# 3. 根CA签发客户端证书
openssl x509 -req \
-in client.csr \
-CA ../root/root-ca.pem \
-CAkey ../root/root-ca.key \
-CAcreateserial \
-days 730 \
-sha256 \
-out client.pem
步骤2:Nginx 开启双向认证
修改 Nginx 配置,增加客户端证书校验:
listen 443 ssl;
ssl_certificate /etc/ssl/private-ca/server/server.pem;
ssl_certificate_key /etc/ssl/private-ca/server/server.key;
# 要求客户端必须出示有效证书
ssl_client_certificate /etc/ssl/private-ca/root/root-ca.pem;
ssl_verify_client on; # 开启客户端证书强制校验
重载 Nginx 后:没有合法客户端证书,直接 403 拒绝访问。
步骤3:客户端使用证书
客户端多为 Windows/浏览器/Java,需要把 client.pem + client.key 打包为 pfx/p12:
# 打包为 p12(设置导入密码)
openssl pkcs12 -export -in client.pem -inkey client.key -out client.p12
- Windows/浏览器:双击
client.p12,按向导导入到「个人证书库」 - Java 程序:直接加载
p12文件配置 SSL 连接
五、K8s 中使用证书(运维高频)
K8s 集群通信、Ingress HTTPS 主流两种用法:
1. Ingress 配置 HTTPS(公网/内网证书)
将证书和私钥创建为 Secret:
# 创建 tls 类型 secret
kubectl create secret tls nginx-tls \
--cert=/etc/ssl/official/server.crt \
--key=/etc/ssl/official/server.key
Ingress 配置引用:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
spec:
tls:
- hosts:
- www.xxx.com
secretName: nginx-tls # 关联证书secret
rules:
- host: www.xxx.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-svc
port: number: 80
2. 集群内部服务加密通信
直接使用自建私有CA签发证书,通过 Secret 挂载到 Pod,应用内部配置 TLS 即可。
六、常见故障 & 排错
- 浏览器提示证书不受信任
- 公网证书:证书过期、域名不匹配、缺少中间证书
- 内网私有CA:客户端/服务器未导入根证书
- 私钥权限过大
- 报错:SSL 启动失败,执行
chmod 600 *.key
- 证书和私钥不匹配
- 用前文
modulus命令核对模数,重新配对文件
- 双向认证访问 403
- 客户端未导入合法客户端证书、证书过期、CA 不匹配
七、精简使用总结
- 公网对外服务:优先
Let's Encrypt + certbot,自动申请+续期,Nginx 一键部署; - 纯内网服务:自建私有CA,统一签发证书,所有节点必须导入根证书;
- 高安全场景:开启双向证书认证,额外签发客户端证书;
- K8s 环境:证书存为 TLS Secret,Ingress/应用挂载使用;
- 所有私钥文件权限严格设置为
600,禁止外泄。
关联文档
- 20-areas/cloud-native/middleware/Nginx 基础 — Nginx HTTPS 配置
- 20-areas/cloud-native/network/protocol/HTTP 协议 — HTTP 协议基础
- 面试题/网络面试题 — 网络面试题