我们经常在安装和部署 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 被禁止访问,即使我们在服务器上部署了中间证书,但也可能存在某种不可测的风险,这是我们应该尽力避免的。
中间证书往往定期会更新,所以在证书续费或者重新签发后,需要检查是否更换过中间证书。
1
bugmenein 2016-10-22 12:02:05 +08:00
“有些小的 CA 机构,因为各种原因,造成他们的中间证书下载 URL 被禁止访问,即使我们在服务器上部署了中间证书,但也可能存在某种不可测的风险”
这有些危言耸听的意味。就文中所提及两点而言,在 HTTPS 网关妥善部署了证书链以及 OCSP Stapling 之后, 这种情况完全可以避免,不存在什么“某种不可测的风险”一类。 |