2. 双向认证与单向认证的区别

讲TLS,绕不开一个最基础的问题:单向认证和双向认证,到底差在哪?

很多刚接触的同学觉得,不就是“多验一次证书”吗?其实没那么简单。我个人习惯,先把这两种模式的核心逻辑讲透,你再去配置代码,心里才有底。

2.1 单向认证:只验服务端

单向认证是我们日常上网最常用的模式。你打开浏览器访问HTTPS网站,就是单向认证。

这个模型里,只有服务端需要出示证书。客户端(比如你的浏览器)去验证服务端的证书是不是合法的。验证通过,就建立加密连接。

关键在哪?服务端不关心客户端是谁。你是谁都可以访问,只要你的TLS握手能正常走完。

核心特征

  • 服务端必须配置证书+私钥
  • 客户端不需要任何证书
  • 适用于公开访问的Web服务

我之前有个接口就是这种模式。一个公开的天气预报API,客户端千千万万,总不能要求每个调用方都装个证书吧?那运维起来简直噩梦。

2.2 双向认证:互相验明正身

双向认证就严格多了。它要求客户端也必须有证书,而且服务端会去验证客户端的证书。

说白了,就是“你验我,我也要验你”。双方都得掏出CA签发的身份证,互相检查。

握手阶段会多一个步骤:服务端在请求完客户端证书后,会校验它的合法性。如果客户端没证书,或者证书过期/被吊销,握手直接失败,数据包都发不过去。

避坑提醒

我曾经负责过一个金融项目,最开始测试环境跑双向认证一切正常。上了生产,发现部分老版本客户端握手失败。排查半天,原来是它们的根证书列表里没有服务端CA的中级证书。别以为配了服务端证书就万事大吉,客户端的信任链也得维护好。

2.3 两种模式的对比

为了方便你对照选择,我整理了一个表格。你想想看,你的业务场景属于哪种?

对比维度 单向认证 双向认证
服务端证书 必须 必须
客户端证书 不需要 必须
安全等级 中(防窃听) 高(防窃听+防伪装)
部署复杂度 低 高(证书分发、吊销)
典型场景 公开网站、API 内部服务、金融接口
握手性能 快 稍慢(多一次证书交换)

嗯,这个表格基本把关键区别说清楚了。你注意看安全等级那一行。为什么单向认证不能防伪装?因为客户端是匿名的,服务端无法确认调用方是不是合法的内部系统。你想想看,如果有人拿到了你的,他就可以假装是合法客户端发起请求。双向认证直接把这个漏洞堵死了——没有证书,连握手都进不去。

2.4 怎么选?看你的信任边界

我个人建议,选哪种模式,先搞清楚你的信任边界在哪。

  • 信任边界在服务端:你只关心用户访问时数据是否加密,不关心用户是谁。比如官网、博客、公开API。这种情况,单向认证完全够用。
  • 信任边界在双方:你不仅要保护数据,还要确保调用方是已授权的实体。比如微服务间的内部RPC调用、核心支付接口、管理后台的API。那就得双向认证。

一个实际例子

我之前做过一个内部管理系统,所有服务部署在私有云。最开始用单向认证+鉴权。后来有一次安全审计,发现被截获后可以重放攻击。改造后上了双向认证,每个微服务都配了客户端证书,本质上是把信任从“应用层”下沉到了“传输层的证书”。从那以后,再没出现过类似的伪造请求。

单向 vs 双向 认证握手对比 单向认证 客户端 服务端 请求 出示证书 验证证书 建立连接 加密通信 双向认证 客户端 服务端 请求 服务端证书 客户端证书 验证客户端 建立加密连接 双向加密通信 单向只验服务端,双向双方互验;证书是身份的“物理”凭证

图里把流程画出来了。你仔细看看右侧双向认证的部分,多了一个“客户端证书”的交换和“验证客户端”的步骤。这个多出来的步骤,就是整个安全模型的质变。

2.5 性能上也有一点差别

嗯,这里要提一嘴性能。双向认证的握手,比单向多了一次证书传输和一次非对称解密验证。如果你有大量短连接请求,这个开销会累积。

我建议:

  • 如果QPS低于5000,性能差距基本可以忽略
  • 高并发场景下,可以开启TLS会话复用,规避重复握手

但说实话,大部分业务场景,双向认证带来的安全收益远大于那点性能损耗。别为了省几毫秒把安全底线丢了。