| Brian “BB” King
渗透测试报告中经常会出现"弱TLS配置"或"不安全SSL证书"等标题下的错误信息。本文将解释TLS的工作原理、常见问题以及测试时需要避免的陷阱。
首先需要区分两个独立概念:证书是一回事,TLS连接的加密是另一回事。
关于证书和HTTPS,你的第一反应可能是:“哦,这是保护我信息隐私的东西。它在数据传输过程中进行加密,只有服务器和我能解密…“但这种理解并不完全准确。证书的主要作用是让你验证通信对象的身份。
加密是在身份验证之后才进行的。如果不知道通信对象是谁,加密对话就没有意义。
证书的作用
TLS服务器上的证书是X.509证书。我们有时称其为"SSL证书"或"TLS证书”,虽然这种称呼没问题,但了解其正式名称也很重要。
证书的目的是让客户端在开始对话前确信服务器的身份。域名证书就像公民的护照:你持有的这个物品允许他人基于可信第三方的断言来验证你的身份。
对于护照,第三方是政府。如果你决定信任某个国家的护照签发系统,我向你出示该国签发的写有"乔治·华盛顿"的有效护照,并且你相信护照照片上的人就是我,那么你对政府护照签发流程的信任,以及你认为护照没有伪造或篡改的事实,意味着你必须相信那是我的名字。
对于证书,第三方是证书颁发机构(CA)。如果网站向你显示带有其域名的有效证书,且该证书由你信任的CA签名,那么你对CA的信任意味着你必须相信服务器就是它声称的那个实体。
注意:实际上是由你的浏览器、Web客户端或操作系统供应商决定信任哪些CA。你并不能真正选择。
证书验证细节
在为特定域名颁发证书之前,信誉良好的证书颁发机构会要求申请者证明他们控制该域名。
这是证书颁发机构的唯一职责——他们在证书上的签名即表明:控制证书中指定域名的实体也控制着证书的私钥(这意味着只有该实体能使用证书建立TLS连接)。
证书颁发机构的意思是:如果你通过完全限定域名访问服务器时获得由我们签名的证书,并且你验证了证书上的签名是由我们的根证书创建的(该根证书已预装在客户端中),那么你可以高度确信域名所有者控制着提供该证书的服务器。也就是说,你正在与你认为的对象通信。
向证书颁发机构证明域名控制权通常通过添加包含CA指定内容的DNS TXT记录来实现(但CA可以提出自己的要求)。
证书验证的是域名的所有权。
如果你通过IP地址连接到服务器并尝试验证证书,验证将总是失败。证书验证的是域名所有权。如果没有域名,就没有需要确认的声明。
证书信任机制
不信任证书只有两个原因:
- 证书根据其起止日期已过期或尚未生效
- 证书上的签名无法独立验证。这有两种情况:
- 证书是自签名的,因此没有第三方可咨询其有效性
- 证书不是自签名的,但签名证书既不在客户端的可信证书存储中,也不是由存储中的证书签名的
自签名证书无法独立验证,因此默认不受信任。有些客户端允许用户"将来信任此服务器的此证书”,采用与SSH相同的"首次使用信任"方法,所以它们并不总是坏的。只是几乎总是如此。
组织可以创建自己的根签名证书。该证书将作为自定义证书安装在组织所有设备上,类似于测试人员将Burp Suite或ZAP的证书导入测试浏览器的方式。然后组织可以使用此证书为仅限公司设备使用的站点签名证书。公司设备将能够验证签名并连接。其他系统将无法验证签名并会抛出错误。
加密技术细节
证书与TLS对话中使用的加密几乎无关。它促进了客户端和服务器之间密钥材料的共享,但对使用哪些算法、密钥交换方法或密钥长度没有任何规定。证书的主要工作是让你确认你正在与你认为的对象通信。
TLS使用与证书关联的非对称密钥(公钥和私钥)为每个TLS连接交换唯一的对称密钥。该对称密钥用于加密通过TLS连接发送的数据。只有在你确认服务器身份后,才能使用只有你和服务器知道的密钥加密数据来保护隐私。
网络流量大致如下:
- 客户端发送"client hello"消息开始连接。这包括称为"客户端随机数"的随机字节(供后续使用)、希望使用的TLS版本以及支持的密码套件列表
- 服务器响应"server hello",包含服务器证书(有时还包括一个或多个中间证书)、服务器从客户端提供的列表中选择的密码套件,以及称为"服务器随机数"的随机字节串(供后续使用)
- 客户端使用其可信证书存储中已有的根证书验证服务器证书上的签名。如果失败,连接停止
- 客户端使用从服务器获取的证书中的公钥加密另一个称为"预主密钥"的随机字节串,并将密文发送给服务器。服务器使用私钥解密这些随机字节
- 客户端和服务器分别基于"客户端随机数"、“服务器随机数"和"预主密钥"生成相同的会话密钥
- 会话密钥用于加密此连接中的所有后续数据
关键要点
测试TLS证书时我们只关注以下几点:
- 使用IP地址测试服务器的TLS配置将总是导致信任失败,可能还会产生其他错误信息
- 自签名证书无法独立验证或信任
- 你无法验证的证书不一定就是无法验证的证书。企业证书颁发机构是真实存在的,需要加以考虑
- 服务器支持的加密算法不是由服务器使用的证书决定的