首页 > 工具箱 > SSL 证书详解

SSL 证书详解

网址前面那把锁,背后是一张 SSL/TLS 证书。这页把证书这件事一次讲完:它到底证明了什么、几种验证等级差在哪、证书链为什么会断、各种文件后缀怎么互转、浏览器那些报错分别意味着什么,最后给出免费证书的几种拿法和配套的在线工具——所有工具都在你自己的浏览器里算,私钥不会上传

证书到底证明了什么
只证明一件事:你正在通信的这台服务器,确实持有某个域名对应的私钥。它不保证网站内容可信,也不保证公司靠谱——钓鱼站照样能申请到合法证书。锁标志的含义是「传输没被中间人看到或篡改」,不是「这家店是好人」。
HTTPS 握手时发生了什么
客户端打招呼并带上支持的协议与加密套件 → 服务器回一张证书链 → 客户端顺着链一路验到系统里预置的根证书,同时核对域名是否在 SAN 里、有没有过期 → 双方用非对称算法协商出一个临时的对称密钥 → 之后的数据都用这个对称密钥加密。证书只参与前半段的身份验证,真正加密数据的是握手协商出来的会话密钥。
DV、OV、EV 怎么选
加密强度完全一样,差别只在证书里写了多少身份信息。个人站、API、内部系统用 DV 就够,几分钟签发还免费;OV 会在证书里写上公司名,做企业官网、电商可以考虑;EV 现在浏览器已经不给绿色地址栏了,性价比很低。别信「更高级的证书更安全」这种说法。
单域名、多域名、通配符
单域名只保一个名字;多域名(SAN 证书)在一张证书里列多个,最常见;通配符 *.example.com 覆盖所有一级子域,但不含 example.com 本身,也不含 a.b.example.com 这种二级子域。常见做法是把 example.com*.example.com 一起写进 SAN。
有效期为什么越来越短
2015 年还能签 5 年,2020 年砍到 398 天,Let's Encrypt 一直是 90 天,行业已经通过决议要在 2029 年前压缩到 47 天。理由是证书一旦泄露,吊销机制并不可靠,缩短有效期是最有效的止损手段。结论很明确:别再手工续期了,用 ACME 自动化。
证书链断了会怎样
服务器只发了自己那张证书、没带中间证书时,桌面浏览器可能因为缓存过中间证书而正常显示,手机 App、curl、Java 客户端却会直接报不受信任——这是最常见的「我这儿好好的,客户那儿打不开」。部署时务必把服务器证书和中间证书拼成一个文件(服务器证书在前)。

证书文件格式对照

后缀内容形态说明
.pem Base64 文本 最通用。以 -----BEGIN CERTIFICATE----- 开头,nginx / apache 直接用。一个文件里可以放多张证书。
.crt / .cer 两种都有 可能是 PEM 文本,也可能是 DER 二进制。用文本编辑器打开,能看到 BEGIN 就是 PEM。
.der 二进制 PEM 去掉头尾再 base64 解码就是 DER。Java 和一些设备偏爱这个格式。
.key Base64 文本 私钥。BEGIN PRIVATE KEY 是 PKCS#8,BEGIN RSA PRIVATE KEY 是老的 PKCS#1。
.csr Base64 文本 证书签名请求,交给 CA 用,签发完就没用了。
.pfx / .p12 二进制,带密码 PKCS#12,把证书和私钥打包在一起,IIS 和 Windows 常用。
.jks 二进制,带密码 Java KeyStore,Tomcat 老版本用,新版本也能直接读 PEM 了。
.p7b / .p7c Base64 或二进制 PKCS#7,只装证书不装私钥,常用来传证书链。

后缀名只是个名字,真正决定格式的是文件内容。分不清就丢给 证书格式转换 自动识别。

浏览器报错对照

错误码含义怎么办
NET::ERR_CERT_DATE_INVALID 证书过期或系统时间不对 先看本机时间,再查证书有效期。续期后记得重载服务,nginx 要 nginx -s reload 才会读新证书。
NET::ERR_CERT_COMMON_NAME_INVALID 访问的域名不在证书的 SAN 里 证书只保 SAN 里列出的名字。带 www 和不带 www 是两个名字,都要签。通配符 *.a.com 不包含 a.com 本身。
NET::ERR_CERT_AUTHORITY_INVALID 签发机构不被信任 多半是自签证书,或者漏传了中间证书。服务器上要把「证书 + 中间证书」拼成一个文件。
SSL_ERROR_BAD_CERT_DOMAIN Firefox 版的域名不匹配 同上,检查 SAN。
NET::ERR_CERT_REVOKED 证书被吊销 私钥泄露或申请信息有误时 CA 会吊销,只能重新申请。
ERR_SSL_VERSION_OR_CIPHER_MISMATCH 协议版本或加密套件谈不拢 服务端只开了 TLS 1.3 而客户端太老,或者套件列表配得太严。
NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM 签名算法太弱 SHA-1 签名的证书早就不被信任了,重新签一张 SHA-256 的。
MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT 自签名证书 开发环境正常现象,生产环境说明配错了证书。

免费证书怎么拿

方案有效期额度特点
Let's Encrypt 90 天 不限量 最主流,ACME 自动续期,支持通配符(需 DNS 验证)。
ZeroSSL 90 天 免费版 3 张/月 同样支持 ACME,控制台可视化管理,申请需要 EAB 凭证。
Google Trust Services 90 天 需绑定账号 ACME 接入,走 EAB,适合已在用 GCP 的场景。
Buypass Go 180 天 不限量 有效期长一倍,不支持通配符。
各云厂商免费证书 3 个月至 1 年 有额度限制 阿里云 / 腾讯云 / 华为云都有免费型,控制台一键部署到自家 CDN、负载均衡最省事。

服务器上能装东西就直接用 acme.shcertbot,配好一次以后全自动。装不了(虚拟主机、CDN 控制台、路由器面板)可以用本站的 免费证书申请,在浏览器里跑完整个 ACME 流程,拿到证书自己贴上去。

名词表

SAN Subject Alternative Name,证书里真正生效的域名清单。现代浏览器只看 SAN,CN 只当展示用。
CN Common Name,通用名。历史遗留字段,仍要填,但别指望它单独起作用。
DV / OV / EV 验证等级。DV 只验域名控制权,几分钟签发;OV 验企业资质;EV 最严。加密强度三者完全一样,差别只在证书里写了多少身份信息。
CAA DNS 里的一条记录,写明「只有这几家 CA 能给我签证书」,能挡住别家 CA 的误签发。
OCSP 在线证书状态协议,用来查证书有没有被吊销。为了不泄露访问记录,现在主流做法是服务端 OCSP Stapling 代取。
CT Certificate Transparency,证书透明度。CA 签发的每张证书都要记进公开日志,任何人都能查——被误签发能第一时间发现。
HSTS 响应头 Strict-Transport-Security,告诉浏览器「以后只准用 HTTPS 访问我」,防降级劫持。
ACME 自动证书管理协议。Let's Encrypt 那套自动申请续期就靠它,certbot、acme.sh 都是它的客户端。
SNI 握手时先把要访问的域名明文告诉服务器,一个 IP 才能放多个 HTTPS 站点。
证书链 服务器证书 →中间证书 →根证书。根证书在系统/浏览器里预置,中间证书要服务器自己带上,漏了就报不受信任。

日常怎么排查

线上证书到底配得对不对
在线证书检测 输域名,能看到证书链是否完整、有效期还剩多少、加密套件配得怎么样。命令行等价物是 openssl s_client -connect example.com:443 -servername example.com
手里这个文件是什么
丢给 证书信息查看,PEM、证书链、CSR 都能解析出主体、有效期、SAN 与指纹。
nginx 报 key values mismatch
证书和私钥不是一对。用 证书私钥配对 把两个文件粘进去,一眼看出对不对,顺便还能查 CSR 是不是同一把钥匙签的。
怀疑域名被别人签了证书
证书透明度查询 能列出某个域名历史上被签发过的所有证书。看到没印象的签发记录就要警惕,同时给域名加上 CAA 记录。
本地开发想要 HTTPS
自签名证书 可以现场签一张带 localhost 和内网 IP 的证书,或者干脆建个私有 CA,把根证书导进系统信任库,以后签多少张都不弹警告。
配置怎么写才不算踩坑
HTTPS 配置生成 按兼容性档位生成 nginx / apache / caddy 的配置片段,套件顺序、HSTS、OCSP Stapling 都给齐。