Loading

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 握手,最终协商出一套加密密钥。

后续请求内容,比如 appkeyappsecretaccess_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

太老的算法,比如 MD5SHA1,可能会被现代客户端拒绝。

9.6 序列号

每张证书都有唯一编号。

吊销证书时,CA 会根据序列号标记这张证书作废。

9.7 证书用途

也叫 Key UsageExtended 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 证书报错,就不会一头雾水了。

posted @ 2026-05-20 18:38  张Blog  阅读(38)  评论(0)    收藏  举报