TL;DR#
HTTPS 证书是一种数字证书,用于保护网站数据的安全传输,主要通过身份验证和数据加密实现。证书类型包括 DV SSL、OV SSL 和 EV SSL,各有其应用场景和特性。浏览器通过一系列步骤检查证书的有效性,并使用证书中的公钥进行加密通信。此外,我们还可以通过命令行工具手动获取和检查网站的 HTTPS 证书,进而检查网站的通用名称(CN)和主题备用名称(SAN)。
什么是 HTTPS 证书?#
HTTPS 证书,也称为 SSL 证书或 CA 证书,是一种数字证书,它的主要作用是保护网站数据的安全传输。这种证书能够确保用户与网站之间的通信过程中,数据不会第三方截取或篡改。同时,浏览器也能通过检查证书来确认用户访问的网站是否真实可靠。
HTTPS 证书有什么作用?#
HTTPS 证书的作用主要体现在以下两个方面:
- 身份验证: HTTPS 证书中包含了网站的身份信息。当用户访问一个使用了 HTTPS 证书的网站时,浏览器会检查证书的有效性。如果证书有效,浏览器会显示该页面是安全的。如果证书无效或者被篡改,浏览器则会向用户发出警告。
- 数据加密: HTTPS 证书可以在用户的浏览器和服务器之间建立一个加密的通信通道,确保数据在传输过程中不会被第三方窃取或篡改,从而有效的保护用户的隐私数据。
HTTPS 证书有哪些类型?#
HTTPS 的证书主要有以下几种类型:DV SSL 证书 (域名验证型)、OV SSL 证书 (组织验证型),以及 EV SSL 证书 (拓展验证型)。
阿里云中对不同证书类型的描述如下:
OV (Organization Validation) 证书
- OV 证书是企业 SSL 证书的首选,通过企业认证确保代表企业 SSL 证书的真实性,拒绝网站风险。
- OV 证书支持特殊域名的签发,例如 gov、edu、.gov、.org、.jp(国家缩写)等
- OV 证书支持证书合并,多张证书(域名)合并签发
DV (Domain Validation) 证书
- DV 证书一般用于个人网站 / 测试使用,DV 证书签发速度快、无需人工审核,确保域名验证信息正确的情况下 1-15 分钟就能签发
- DV 证书无法为特殊域名 / 公网 IP 签发证书(例如:edu、.gov、.org、.jp(国家缩写)等后缀的域名)
- DV 证书无法将多个域名合并到一张证书内
EV (Extended Validation) 证书
- EV 证书是最高级别的密码安全等级、可信等级和权威等级,确保网站数据传输安全不泄漏
- 优势:杜绝非授权代申请证书情况
浏览器如何检查 HTTPS 证书?#
当我们访问一个网站时,浏览器检查网站证书的流程通常包括以下几个步骤:
- 请求证书:当你访问一个 HTTPS 网站时,你的浏览器会向网站请求它的 HTTPS 证书。
- 检查颁发者:浏览器会检查证书的颁发者是否为可信任的证书办法机构。如果不是,浏览器会显示警告。
- 验证证书:浏览器会验证证书的有效性。包括检查证书是否已经过期,以及证书的域名是否与你正在访问的网站的域名匹配。
- 使用公钥:如果证书有效,浏览器会使用证书中的公钥来加密你发送给网站的信息。同时网站会使用对应的私钥来解读你发送的信息。
证书的域名是什么?#
证书的域名,也被称为 公共名称 (Common Name) 或 主题备用名称 (Subject Alternative Name),是 HTTPS 证书中的一个重要部分。它表示了这个证书是为哪个网站颁发的。
公共名称 (Common Name, CN) 是证书的主要标识符,通常是证书所保护的主机名,例如 www.example.com
。在早期的 SSL 证书中,公共名称是唯一可以用来标识证书所保护的域名的字段。并且公共名称的值只能存在一个。
然而,随着互联网的发展,一个证书可能需要保护多个域名,这就引入了 主题备用名称 (Subject Alternative Name, SAN)。SAN 是一个扩展字段,可以包含一个或多个域名或子域名。例如,一个证书的 SAN 可以包含 example.com
、www.example.com
以及 mail.example.com
,这样一个证书就可以保护这三个域名。
有哪些类型的证书域名?#
HTTPS 证书的域名主要有以下几种类型:
- 单域名 SSL 证书:这种证书只能保护一个具体的域名,无法保护其他的域名。例如,如果证书的 CN 或 SAN 中包含
example.com
,那么这个证书只能保护example.com
网站。 - 多域名 SSL 证书:这种证书可以保护多个域名,这些域名需要在证书的主题备用名称中列出 (ASN)。例如,如果证书主题备用名称中包含
www.example.com
、example.com
以及sub.example.com
,那么这个证书将保护这三个网站。 - 通配符 SSL 证书:这种证书可以保护一个主域名及其所有的以一级子域名,但不能保护二级子域名或更深层次的子域名。例如,如果在 CN 或 SAN 中包含 *.example.com,那么这个证书可以保护 example.com 及其所有的一级子域名的网站。
手动检查网站的 HTTPS 证书#
在基于 Unix 的操作系统中,我们可以使用下面的命令来获取目标网站的 SSL 证书:
website=example.com
echo | openssl s_client -servername $website -connect $website:443 2>/dev/null | openssl x509 -noout -text
在这个命令中:
openssl s_client -servername $website -connect $website:443
部分会启动一个 SSL/TLS 客户端并连接到指定的网站的 443 端口(HTTPS 默认端口)。-servername
参数用于指定 SNI(Server Name Indication),这是一个 TLS 扩展,用于在握手阶段发送服务器名称。2>/dev/null
这部分命令会把错误信息重定向到 /dev/null,也就是说,错误信息不会被显示出来。openssl x509 -noout -text
这部分命令会解析从 s_client 命令获取的证书信息。-noout
参数表示不输出编码后的证书,-text
参数表示以文本形式显示证书的详细信息。
如果目标网站使用了 HTTPS 证书,这个命令将会返回证书的详细信息,包括证书的版本,序列号,签名算法,颁发者,有效期,主题,公钥信息,扩展字段等。
检查证书通用名称和主题备用名称#
在上述命令的输出结果中查找 Subject:
行,你可以在这里找到证书的通用名称。
查找 X509v3 Subject Alternative Name:
行,你可以在这里找到证书的主题备用名称。
获取证书唯一标识#
当我们需要获取证书的唯一标识时,通常我们会使用证书的指纹(Fingerprint)。证书的指纹是通过对证书的 DER 编码(一种二进制格式)应用特定的哈希算法(如 SHA-256)得到的。你可以通过以下命令查看证书的 SHA-256 指纹:
website=example.com
echo | openssl s_client -servername $website -connect $website:443 2>/dev/null | openssl x509 -noout -fingerprint -sha256
这个命令会返回类似于 SHA256 Fingerprint=XX:XX:XX:...
的输出,其中的 XX:XX:XX:...
就是证书的 SHA-256 指纹,可以作为证书的唯一标识。每个证书的指纹都是唯一的,即使证书的其他信息(如主题或颁发者)相同,只要证书本身不同,其指纹就会不同。因此,指纹可以用来唯一地标识一个证书。如果两个证书的指纹相同,那么这两个证书就是完全相同的。