V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sslwork
V2EX  ›  SSL

SSL 中间证书的作用

  •  1
     
  •   sslwork · 2016-10-22 11:10:40 +08:00 · 5431 次点击
    这是一个创建于 2765 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    我们经常在安装和部署 SSL 证书的时候,需要一同安装中间证书。中间证书到底是什么?为什么必须要安装?为什么有时候,没有中间证书,我的 IE 也能正常访问 HTTPS ?为什么其他浏览器都 OK 了,但安卓手机就是不行了!

    中间证书是什么

    中间证书,其实也叫中间 CA (中间证书颁发机构, Intermediate certificate authority, Intermedia CA ),对应的是根证书颁发机构( Root certificate authority , Root CA )。为了验证证书是否可信,必须确保证书的颁发机构在设备的可信 CA 中。如果证书不是由可信 CA 签发,则会检查颁发这个 CA 证书的上层 CA 证书是否是可信 CA ,客户端将重复这个步骤,直到证明找到了可信 CA (将允许建立可信连接)或者证明没有可信 CA (将提示错误)。

    为了构建信任链,每个证书都包括字段:“使用者”和“颁发者”。 中间 CA 将在这两个字段中显示不同的信息,显示设备如何获得下一个 CA 证书,重复检查是否是可信 CA 。

    根证书,必然是一个自签名的证书,“使用者”和“颁发者”都是相同的,所以不会进一步向下检查,如果根 CA 不是可信 CA ,则将不允许建立可信连接,并提示错误。

    例如:一个服务器证书 domain.com ,是由 Intermedia CA 签发,而 Intermedia CA 的颁发者 Root CA 在 WEB 浏览器可信 CA 列表中,则证书的信任链如下:

    证书 1 - 使用者: domain.com ;颁发者: Intermedia CA

    证书 2 - 使用者: Intermedia CA ;颁发者: Root CA

    证书 3 - 使用者: Root CA ; 办法和: Root CA

    当 Web 浏览器验证到证书 3 : Root CA 时,发现是一个可信 CA ,则完成验证,允许建立可信连接。当然有些情况下, Intermedia CA 也在可信 CA 列表中,这个时候,就可以直接完成验证,建立可信连接。

    但如果 Web 浏览器在验证过程中,没有找到这个 Intermedia CA ,那即使 Root CA 本身是可信 CA ,但因为 WEB 浏览器无法通过中间证书来发现这个 Root CA ,最后也会导致无法完成验证,无法建立可信连接。

    要获得中间证书,一般有两种方式:第一种、由客户端自动下载中间证书;第二种、由服务器推送中间证书。以下分别讨论。

    客户端自动下载中间证书

    一张标准的证书,都会包含自己的颁发者名称,以及颁发者机构访问信息: Authority Info Access ,其中就会有颁发者 CA 证书的下载地址。如:

    Authority Info Access
    Access Method=证书颁发机构颁发者 (1.3.6.1.5.5.7.48.2)
    Alternative Name:
    URL=http://gn.symcb.com/gn.crt

    通过这个 URL ,我们可以获得这个证书的颁发者证书,即中间证书。 Windows 、 IOS 、 MAC 都支持这种证书获取方式,但 Android 不支持这种方式,所以,如果我们仅依靠这种方式来获得中间证书,就无法在 Android 系统上建立可信连接。

    除了操作系统支持外,还有一个很重要的因素,就是客户端可以正常访问公网。如果客户端本身在一个封闭的网络环境内,无法访问公网下载中间证书,就会造成失败,无法建立可信连接。

    此外,有些 CA 的中间证书下载地址因为种种原因被“墙”掉了,也会造成我们无法获得中间证书,进而无法建立可信链接。(可知的有 Digicert 和 Godaddy ,而且这个地址往往和 OSCP 是相同的域名,这就造成这些 CA 的证书在中国会遇到很多奇怪很难察觉的问题)

    虽然自动下载中间证书的机制如此不靠谱,但在有些应用中,这却是唯一有效的机制,譬如邮件签名证书,由于我们发送邮件时,无法携带颁发邮件证书的中间证书,往往只能依靠客户端自己去下载中间证书,一旦这个中间证书的 URL 无法访问(被“墙”掉)就会造成验证失败。

    服务器推送中间证书

    服务器推送中间证书,就是将中间证书,预先部署在服务器上,服务器在发送证书的同时,将中间证书一起发给客户端。我们部署证书,首先就要找到颁发服务器证书的中间证书,可以用中间证书下载工具

    如果我们在服务器上不主动推送中间证书,可能会造成的问题

    Android 手机无法自动下载中间证书,造成验证出错,提示证书不可信,无法建立可信连接。
    Java 客户端无法自动下载中间证书,验证出错,可信连接失败。
    内网电脑,在禁止公网的情况下,无法自动下载中间证书,验证出错,可信连接失败。
    

    虽然我们不部署中间证书,在大多数情况,我们依然可以建立可信的 HTTPS 连接,但为了避免以上这些情况,我们必须在服务器上部署中间证书。 所以,为了确保我们在各种环境下都能建立可信的 HTTPS 连接,我们应该尽量做到以下几点:

    • 必须在服务器上部署正确的中间证书,以确保各类浏览器都能获得完整的证书链,完成验证。

    • 选择可靠的 SSL 服务商,有些小的 CA 机构,因为各种原因,造成他们的中间证书下载 URL 被禁止访问,即使我们在服务器上部署了中间证书,但也可能存在某种不可测的风险,这是我们应该尽力避免的。

    • 中间证书往往定期会更新,所以在证书续费或者重新签发后,需要检查是否更换过中间证书。

    bugmenein
        1
    bugmenein  
       2016-10-22 12:02:05 +08:00
    “有些小的 CA 机构,因为各种原因,造成他们的中间证书下载 URL 被禁止访问,即使我们在服务器上部署了中间证书,但也可能存在某种不可测的风险”

    这有些危言耸听的意味。就文中所提及两点而言,在 HTTPS 网关妥善部署了证书链以及 OCSP Stapling 之后, 这种情况完全可以避免,不存在什么“某种不可测的风险”一类。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1004 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:57 · PVG 06:57 · LAX 15:57 · JFK 18:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.