HTTPS 证书到底是什么?
从小白视角讲清楚 SSL/TLS 证书、CA、证书链和吊销检查。
在项目现场排查接口问题时,我们经常会遇到类似这样的报错:
SEC_E_CERT_EXPIRED - 收到的证书已过期
吊销服务器已脱机,吊销功能无法检查吊销
SSLHandshakeException
PKIX path building failed
很多人第一反应是:“我只是访问一个 HTTPS 地址,为什么还和证书扯上关系?”
这篇文章就用尽量通俗的方式,把 HTTPS 证书这块知识讲清楚。
1. 先记住一句话
HTTPS 证书可以理解成:
网站在网络世界里的身份证
当我们访问一个 HTTPS 地址时,比如:
https://oapi.dingtalk.com
客户端不会盲目信任对方,而是会问:
你真的是 oapi.dingtalk.com 吗?
你有什么证明?
这时服务端会拿出一张证书,告诉客户端:
我是 oapi.dingtalk.com
这是我的证书
这是权威机构给我签发的
客户端检查通过后,才会继续建立加密连接。
2. 谁是客户端,谁是服务端?
谁主动发起请求,谁就是客户端。
谁被访问、提供服务,谁就是服务端。
比如:
HCM/ACC Java 程序 -> 钉钉接口
客户端 服务端
命令行测试时:
curl -> oapi.dingtalk.com
客户端 服务端
用户打开系统页面时:
浏览器 -> HCM 系统
客户端 服务端
所以客户端和服务端不是固定身份,而是看当前是谁在访问谁。
3. HTTPS 证书的作用是什么?
证书主要解决三个问题。
3.1 证明身份
客户端访问:
https://oapi.dingtalk.com
服务端必须证明:
我确实有资格代表 oapi.dingtalk.com
否则中间任何机器都可以冒充钉钉服务器。
3.2 建立加密通道
证书里包含服务端的公钥。
客户端和服务端会利用这个公钥参与 TLS 握手,最终协商出一套加密密钥。
后续请求内容,比如 appkey、appsecret、access_token,就不会明文在网络上传输。
3.3 防止中间人攻击
如果没有证书校验,中间设备可以假装自己是钉钉:
HCM服务器 -> 假钉钉服务器
然后诱导你把敏感信息发过去。
证书校验就是为了防止这种情况。
4. 域名为什么不能单独作为身份标识?
很多人会疑惑:
我访问的是 oapi.dingtalk.com,域名不就是身份吗?
不是。
域名更像是“门牌号”或“地址”,而不是身份证。
访问一个域名时,中间会经过 DNS 解析:
oapi.dingtalk.com -> 某个 IP
但这个解析结果可能会被很多因素影响:
- 内网 DNS
- hosts 文件
- 代理服务器
- 网闸设备
- 负载均衡
- 安全设备
- DNS 缓存
比如现场可能出现:
oapi.dingtalk.com -> 172.16.200.102
这个 172.16.200.102 可能是医院内网代理或网闸。
所以,客户端不能只看“我输入了什么域名”,还要确认“当前连接到的服务端是否真的有资格代表这个域名”。
这个确认过程靠的就是证书。
一句话:
域名表示你想访问谁,证书证明对方真的是谁。
5. CA 是什么?
CA 的全称是 Certificate Authority,证书颁发机构。
可以把 CA 理解成现实世界里的“发证机关”。
网站不能自己说:
我是钉钉,你信我
因为谁都可以这么说。
它需要一个权威机构来证明:
我 CA 机构证明,这张证书确实属于 oapi.dingtalk.com
常见公网 CA 有:
DigiCert
GlobalSign
Let's Encrypt
Sectigo
Entrust
浏览器、操作系统、Java 里通常都内置了一批可信 CA。
所以你平时访问大多数 HTTPS 网站时,不需要手工导入证书。
6. 证书链是什么?
证书通常不是单独一张,而是一条链。
大致像这样:
网站服务器证书
-> 中间 CA 证书
-> 根 CA 证书
可以类比现实世界:
个人身份证
-> 市公安局签发
-> 国家权威体系认可
客户端最终信任的是根 CA。
如果证书链能一路追溯到客户端信任的根 CA,就认为这张网站证书可信。
7. 根 CA、中间 CA、服务器证书有什么区别?
可以这样理解:
根 CA 证书:最高级发证机关
中间 CA 证书:下级发证机关
服务器证书:发给具体网站的身份证
对应 HTTPS:
根 CA 证书:系统/浏览器/Java 信任库里的根
中间 CA 证书:由根 CA 签发,用来继续签发网站证书
服务器证书:发给具体网站,比如 oapi.dingtalk.com
我们平时说“导入 CA 证书”,一般导入的是根 CA 或中间 CA,而不是每个网站自己的服务器证书。
8. SSL 证书和 TLS 证书是一个东西吗?
日常沟通里,基本可以认为是一个东西。
严格来说:
SSL 是老协议名称
TLS 是现在主流协议名称
但大家习惯上仍然说:
SSL证书
HTTPS证书
TLS证书
服务器证书
在大多数项目沟通场景里,这几个词指的都是 HTTPS 连接时用到的服务器证书。
9. 证书里一般有哪些信息?
一张证书通常包含这些关键内容。
9.1 颁发给谁
也就是 Subject。
例如:
CN = oapi.dingtalk.com
O = Alibaba
C = CN
现在更重要的是 SAN,也就是备用名称列表:
DNS:oapi.dingtalk.com
DNS:api.dingtalk.com
DNS:*.dingtalk.com
客户端校验域名时,主要看 SAN。
9.2 谁签发的
也就是 Issuer。
例如:
DigiCert
GlobalSign
Alibaba Cloud
某医院内网 CA
某网闸 Root CA
如果签发者是公网 CA,系统通常默认信任。
如果签发者是医院、公司、网闸自己的 CA,可能需要手工导入根证书。
9.3 有效期
证书有生效时间和过期时间:
Not Before: 2025-01-01
Not After : 2026-01-01
如果服务器时间不准确,也可能导致证书被误判为过期或尚未生效。
9.4 公钥
证书里包含公钥。
公钥用于 TLS 握手和加密协商。
注意:
证书里有公钥
私钥只保存在服务端
私钥不能泄露。
9.5 签名算法
例如:
SHA256withRSA
ECDSA with SHA256
太老的算法,比如 MD5、SHA1,可能会被现代客户端拒绝。
9.6 序列号
每张证书都有唯一编号。
吊销证书时,CA 会根据序列号标记这张证书作废。
9.7 证书用途
也叫 Key Usage 或 Extended Key Usage。
HTTPS 服务器证书通常会包含:
TLS Web Server Authentication
Digital Signature
Key Encipherment
表示这张证书可以用于 HTTPS 服务端身份认证。
9.8 吊销检查地址
证书里可能包含:
CRL Distribution Points
OCSP Authority Information Access
客户端可以通过这些地址检查证书有没有被吊销。
10. 什么是证书吊销?
证书即使没有过期,也可能被提前作废。
比如:
私钥泄露
证书签错
域名归属异常
安全事故
证书主动废弃
这就叫证书吊销。
客户端为了确认一张证书有没有被作废,可能会访问:
CRL 地址
OCSP 地址
可以理解成:
查一下这张身份证有没有被挂失
如果访问不到吊销检查服务器,就可能报:
吊销服务器已脱机,吊销功能无法检查吊销
这不一定说明证书本身是假证,也可能只是吊销检查地址访问不通。
11. 为什么浏览器访问很多 HTTPS 网站不用导入证书?
因为浏览器或操作系统已经内置了一批可信根 CA。
普通公网网站的证书链通常是:
网站证书
-> 中间 CA
-> 系统已信任的根 CA
所以浏览器能自动验证通过。
不是没有证书,而是信任基础已经预装好了。
12. 为什么内网代理或网闸容易出现证书问题?
很多医院、政企、内网环境会有代理、网闸、安全设备。
链路可能是:
业务服务器
-> 内网代理/网闸
-> 公网接口
有些设备会做 HTTPS 解密或代理。
这时它可能会自己生成一张证书,返回给客户端。
比如你访问:
https://oapi.dingtalk.com:4433
实际连接到:
172.16.200.102:4433
这台 172.16.200.102 可能是内网代理。
它可能返回一张由医院内网 CA 或网闸 CA 签发的证书。
如果客户端不信任这个内网 CA,就会报证书错误。
13. curl -k 是什么意思?
curl -k 的意思是:
忽略 HTTPS 证书校验
例如:
curl -k https://oapi.dingtalk.com:4433/gettoken
它等价于告诉客户端:
不管证书有没有问题,直接继续请求
所以 -k 适合临时排查:
不加 -k 失败
加 -k 成功
通常说明:
网络是通的
接口也能访问
问题在证书校验环节
但 -k 不建议作为正式解决方案。
因为正式程序通常不应该跳过证书校验。
14. Java 会不会自动忽略证书?
Java 默认不会忽略证书。
Java 发 HTTPS 请求时,一般会校验:
证书链是否可信
域名是否匹配
证书是否过期
TLS 握手是否正常
如果失败,常见报错包括:
javax.net.ssl.SSLHandshakeException
PKIX path building failed
unable to find valid certification path
No subject alternative DNS name matching
certificate expired
但有一点需要注意:
Java 默认通常不强制检查证书吊销状态
而 Windows 的 curl 如果使用 schannel,可能会检查吊销状态。
所以可能出现:
curl 报吊销检查失败
Java 请求正常
这并不代表 Java 完全忽略证书,而是它们检查规则不完全一样。
15. 现场排查时怎么判断问题在哪?
可以按这个顺序排查。
15.1 看 DNS 解析到哪里
nslookup oapi.dingtalk.com
如果解析到内网地址,例如:
172.16.200.102
说明中间有内网 DNS、代理或网闸参与。
15.2 看端口通不通
Windows 可以用:
Test-NetConnection oapi.dingtalk.com -Port 4433
或:
curl -v https://oapi.dingtalk.com:4433/gettoken
15.3 看加 -k 后能不能返回
curl -k -v https://oapi.dingtalk.com:4433/gettoken
如果返回类似:
{"errcode":40035,"errmsg":"缺少corpid or appkey"}
说明请求已经到达接口服务,只是业务参数不完整。
15.4 带真实参数测试
curl -k "https://oapi.dingtalk.com:4433/gettoken?appkey=xxx&appsecret=xxx"
如果返回:
{"errcode":0,"access_token":"..."}
说明接口链路可用。
15.5 看证书是谁签发的
重点关注:
Subject
Issuer
Not After
SAN
CRL/OCSP
如果 Issuer 是内网 CA 或网闸 CA,就要确认客户端是否信任它。
16. 证书问题和网络不通有什么区别?
网络不通通常表现为:
timeout
connection refused
could not resolve host
no route to host
证书问题通常表现为:
certificate expired
unable to get local issuer certificate
PKIX path building failed
certificate revoked
revocation server offline
hostname mismatch
如果加 -k 后能访问,多半是证书校验问题。
如果加 -k 后还是超时,那就是网络、端口、代理或防火墙问题。
17. 用一句话总结整套机制
HTTPS 证书就是网站的身份证。
域名告诉客户端:
我要找谁
证书告诉客户端:
当前连接到的这个服务端,是否真的有资格代表这个域名
CA 是发证机关。
证书链是信任传递路径。
吊销检查是查这张证书有没有被挂失。
curl -k 是临时跳过验身份证。
Java 默认不忽略证书,但通常不强制检查吊销状态。
在内网代理、网闸、SSL 解密场景下,最容易出现证书链不可信、吊销检查失败、代理证书未导入等问题。
18. 最后的排查口诀
遇到 HTTPS 证书问题,可以记住这几句话:
先看域名解析到哪里
再看端口能不能连
不加 -k 看证书错误
加 -k 看接口是否可达
能返回业务错误说明网络通
正式环境不要依赖 -k
内网代理要检查 CA 信任链
Java 和 curl 证书校验规则不完全一样
理解了这些,再看 HTTPS 证书报错,就不会一头雾水了。

浙公网安备 33010602011771号