一、证书和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 |
用户证书 中间证书 根证书 |
评论