详解CA证书

由于http协议的不安全性,在传输敏感数据时需要对数据进行加密处理。如果采用对称加密,使用相同的密钥对数据进行加密,密钥的保存又是一个问题。如果放到前端中存放,无论如何防护,都有被破解泄漏的可能性,而一旦泄漏,前端则需要升级新版本才能更新密钥,还需对于未升级的老版本做兼容性处理。

如果采用非对称加密,客户端每次去请求这次通信的公钥,后续的通讯内容通过这个公钥进行加密发送到服务端,服务端用自己的私钥进行解密获取内容。响应内容也通过私钥加密发送到客户端,客户端用公钥解密。

该方案不会在客户端中存放密钥,降低了密钥泄漏的风险,但非对称加密的性能损耗较高,所以整个通信过程中会先通过非对称加密和服务器交换一个密钥。后续通过该密钥进行对称加密通信。

但是非对称加密通信通过中间人攻击即可完全获取通信内容。

image-20220719161149012

中间人通过截获客户端的请求,模拟新的请求向服务器请求公钥,获取到真实的公钥后,自身生成新的公钥-私钥对,将自身的公钥发送给客户端,由此通过自身的私钥解析客户端发送的内容,并将内容用真实的公钥加密后发送给服务端,并用公钥解析出服务端返回的内容。

为了验证服务器的身份,防止中间人攻击,CA证书由此诞生。通过一个信任的三方机构去验证服务端的可靠性。

什么是CA证书

CA证书是由公认权威的第三方机构颁发的,申请者将自己的身份信息、公钥提交到签发机构后,机构核实身份后生成对应的证书颁发给申请人。

证书中除了包含了申请人提交的信息,并且还包含了一些CA机构的信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、证书所采用的加密算法、有效时间、证书序列号等信息的明文,同时包含一个由明文信息加密生成的签名;

服务端拥有了证书后,当客户端发起请求时,服务端首先会将证书发送给客户端,客户端去验证证书的合法性,通过后则可以取出证书的服务端的公钥进行后续的通讯。

证书的签发过程

  1. 首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行 Hash 计算,得到一个 Hash 值;

  2. 然后 CA 会使用自己的私钥将该 Hash 值加密,生成 Certificate Signature,也就是 CA 对证书做了签名;

  3. 最后将 Certificate Signature 添加在文件证书上,形成最后的数字证书;

证书的认证过程

  1. 客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1;
  2. 通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 内容,得到一个 Hash 值 H2 ;
  3. 然后比较 H1 和 H2,如果值相同,则为可信赖的证书,否则则认为证书不可信。
  4. 客户端向CA发送OCSP请求验证证书的有效期、是否被吊销(或由服务端代为发送请求查询)
OCSP装订

OCSP装订(英语:OCSP Stapling),正式名称为TLS证书状态查询扩展,可代替在线证书状态协议(OCSP)来查询X.509证书的状态。服务器在TLS握手时发送事先缓存的OCSP响应,用户只需验证该响应的有效性而不用再向数字证书认证机构(CA)发送请求。

OCSP装订解决了在线证书协议中的大多数问题。CA给网站颁发证书之后,网站的每个访问者都会进行OCSP查询。因此使用在线证书协议时,高并发的请求会给CA的服务器带来很大的压力。同时由于必须和CA建立连接,OCSP查询还会影响浏览器打开页面的速度并泄漏用户隐私。此外,当OCSP查询无法得到响应时,浏览器必须选择是否在无法确认证书状态的情况下继续连接,造成安全性和可用性二选一的困局。

认证链

实际使用过程中,服务器证书的签发工作不是由根证书直接完成,而是可能由二级或更深层级的证书进行签发。这些证书也可称为中间证书。中间证书依次认证,最终都是由根证书认证。

image-20220720140829584

在认证过程中,只是多了几次认证过程,只要最后能找到一个操作系统信任的证书所认证的证书,则说明该认证链可靠。

认证链存在的优势:

  1. 减少根证书结构的管理工作量,可以更高效的进行证书的审核与签发;
  2. 根证书一般内置在客户端(浏览器或操作系统)中,私钥一般离线存储,一旦私钥泄露,则吊销过程非常困难,无法及时补救。中间证书结构的私钥泄露,则可以快速在线吊销,并重新为用户签发新的证书;

交叉认证

一个CA机构将自己的证书交由其他CA机构进行签名认证的过程叫做交叉认证,生成的证书为交叉证书。使用交叉证书认证颁发的证书可以通过两个CA的认证。

CA机构在更换根证书时期会使用这种方式,在新的根证书还未完全布置到操作系统中时,暂时使用其他的CA机构进行认证。当部署完成后,后续的新证书颁发都使用自己的根证书认证的证书进行签名。

不同级别的CA证书

  • DV

    最基础的SSL证书类别:DV(Domain Validaion) SSL证书,俗称“域名验证型SSL证书”。这种 SSL证书只具备最基本的 HTTPS 加密作用。不涉及到SSL证书的使用方身份验证,因此具有颁发快,成本低的优点。这种证书满足了大量的个人站长对 https 的加密需求。同时也是各个小微企业从节约经营成本的角度出发可以选择的SSL证书类型。

  • DV

    普通的组织验证证书:OV(Organization Validation) SSL证书。俗称“组织验证型SSL证书”或者“企业性SSL证书”。这类证书从加密和身份认证两方面对网站进行了一个提高。申请这类证书需要具有组织身份,例如公司、政府、学校、医院等各类单位组织。证书签发机构在签发证书之前,会对这个组织身份的真实性进行验证,确保组织的真实存在以及确认该组织本身确实是在申请SSL证书,防止冒名顶替。这种 OV SSL证书的字段里面包含了使用证书的单位名称。

  • OV

    扩展验证类SSL证书:EV (Extended Validation)SSL证书。这类SSL证书俗称“增强型SSL证书”或者“扩展验证型SSL证书”。这种SSL证书对申请者身份做了更加严格的审核,也正因如此,很多浏览器对装有 EV SSL证书的网站进行了特别的标注:例如在浏览器地址栏直接显示单位名称,或者在浏览器地址栏点击小锁标志后显示单位名称

自签证书

SSL证书并不一定非要权威的CA机构去签发,自己也可以用自己的私钥去签发一个证书,这种证书就是自签名证书。因为自签名证书并没有通过CA机构认证,也没有内置于操作系统中,所以在浏览器访问过程中会收到“不安全”警告。

自签名证书的优势:

  • 免费,每个人都可以通过Openssl生成证书,在一定的使用场景中可以减少预算。
  • 随时签发,不需要等待三分机构审核资质。

缺点:

  • 不受浏览器信任
  • 吊销难。
  • 易被伪装,在浏览器环境无法防范中间人攻击,也就失去了证书的意义。

自签名证书也可以用于中间人攻击,自行生成一个与受害者公开信息完全相同的证书进行攻击。

HTTPS的中间人攻击

严格意义上HTTPS并不存在中间人攻击,但部分应用开发者忽视证书的校验,或者对非法证书处理不当,导致依旧可以进行攻击。

攻击方式:

  1. 在操作系统中也安装中间人的根证书,
  2. 将请求代理转发到拥有被认证过CA认证过的服务器上转发请求。

上述攻击手段都是通过替换CA证书的方式进行攻击,浏览器会识别出风险并警告。在网站开启HSTS(HTTP严格传输安全)后,chrome浏览器会拦截请求,无法访问,而一部分其他浏览器还是可以手动忽视风险,直接访问,将自己的信息暴露到中间人网络当中。

Android应用开发者如果自定义的X509TrustManager不校验证书,或实现的自定义HostnameVerifier不校验域名接受任意域名,或使用setHostnameVerifier (ALLOW_ALL_HOSTNAME_VERIFIER),可以直接可以通过方式1进行攻击。

Android HTTPS防护

详见Post not found: Android的HTTPS攻击与防护

参考文献

HTTPS中CA证书的签发及使用过程

一篇文章看明白 HTTP,HTTPS,SSL/TLS 之间的关系

CA 机构是如何保护自己私钥的?

OSCP在线证书状态协议-维基百科

HTTPS中间人攻击实践(原理·实践)

Android HTTPS中间人劫持漏洞浅析

作者

Hanani

发布于

2022-07-19

更新于

2022-07-21

许可协议