一、证书和 CA
HTTPS 证书的颁发和验证一共包含以下几个角色:
- 顶级 CA:最顶级的证书颁发机构,可以签发中间 CA/。
- 中间 CA:也是受信任的证书颁发机构,它由根 CA 签发,中间证书可以有很多级,中间 CA 也能再签发中间 CA 。
- 终端证书:由 CA 签发出来的证书。
三者的关系为:
顶级 CA 机构一般不直接参数证书颁发,因为顶级 CA 就一个公私钥,泄密后影响太大。因此一般都是通过中间 CA 来颁发证书,中间 CA 可以有多层,中间 CA 也可以自己再签发中间 CA,他们都是等效的。实际上的正式的使用场景也是这样,中间 CA 会根据加密算法或其他因素再衍生出多个中间 CA 。以百度的证书,它的证书就是由一个中间 CA 颁发:
生成证书时,用户只要把自己的公私钥和身份信息 (如域名信息等) 提交给 CA 机构就行,CA 机构对用户信息加密生成证书给到用户,用户把证书和私钥部署到服务端就能开启 HTTPS 了。
证书的表现形式
证书有多种表现形式,常用的为 pem
和 der
格式,两者的区别在于前者是以 ascii 码表示的证书,后者是二进制形式。 pem 格式的证书是以下形式:
1 2 3 4 5 6 |
-----BEGIN CERTIFICATE----- MIIEozCCBAygAwIBAgIJAIkKM/OEESv3MA0GCSqGSIb3DQEBBQUAMIHnMQswCQYD ... otgUgl+vsfMW5hy8607ppPM7YWTMUV36N6mVAOGPtntf8HdlbH7MLr+PiAjBspkw HGWHw5+FYqoBWPALLEi3d7LGHnF/qJchkjttwqakSS0u+sWQIqYD -----END CERTIFICATE----- |
两种证书在各操作系统下都是能被直接打开的 (windows 需要修改后缀为 crt),效果也都一样,可以使用 windows 的证书管理或者 openssl
命令转换两种证书格式。
二、客户端校验 CA
证书部署到服务器后,客户端请求到证书,会根据证书信息找到对应的根证书签发机构 (CA),如果 CA 受信任,则认为证书可靠,证书中的公钥也可靠,可以建立加密连接。而如果 CA 不受信任,浏览器就会拦截请求,提示连接不安全,需要用户确认后才建立连接。如 chrome 浏览器就会弹出以下弹框信息等用户确认后才建立连接:
默认情况下,操作系统都会保存一份受信任根证书列表,这样在访问网站的时候很方便就能确认当前证书的颁发者是不是受信任 CA 了。 windows 系统可以在运行中输入 certmgr.msc
来查看:
ubuntu 在:
1 |
/etc/ssl/certs/ca-certificates.crt |
centos 在:
1 |
/etc/pki/tls/certs/ca-bundle.crt |
OCSP 校验
当本地信任库无法校验证书时,例如证书链不完整时,需要使用 OCSP 方式来校验证书的有效性,它实际上是一种在线校验证书机制,通过 OCSP 协议去请求服务端证书来检验 CA 。
三、部署 HTTPS 证书
nginx 中配置 HTTPS 证书的方法:
1 2 3 4 5 |
server { ssl on; # 开启 ssl ssl_certificate cert.pem; # 证书路径 ssl_certificate_key key.pem; # 私钥路径 } |
高版本的 nginx 配置中,取消了 ssl on
指令,改为了以下形式:
1 2 3 4 5 |
server { listen 443 ssl; ssl_certificate cert.pem; ssl_certificate_key key.pem; } |
证书中如果包含了 CA,证书的格式应该为:
1 2 3 |
用户证书 中间证书 根证书 |
评论