Https

Https是安全版的Http (Hyper Text Transfer Protocol, 超文本传输协议),即在Http中加入了SSL (Secure Socket Layer)等安全协议实现加密通信。

用于Https的安全协议有SSL和它的继任者TLS (Transport Layer Security)两种。SSL主要有1.0, 2.0, 3.0三个版本,现已不再更新。TLS改进了SSL 3.0的摘要算法和加密算法,在某些场合也被认为是SSL 3.1。SSL和TLS协议均可工作在TCP或者UDP连接智商,主要规定了通信双方的身份认证,算法协商,密钥交换等机制。

CA证书

Https依靠CA证书验证通信双方的身份。在日常生活中,如果我们要验证一个人的身份,通常的做法是查看他的身份证。我们信任身份证颁发机构即政府机构的公信力,因此只要验证一个人的身份证不是伪造的,我们就相信这个人的身份和身份证上所描述的是一致的。CA证书就是一个人或者组织在网络世界中的身份证,其发证机关是证书管理机构(certificate authority,CA)。CA用自己的私钥对用户的身份信息(主要是用户名和该用户的公钥)进行签名,该签名和用户的身份信息一起就形成了证书。

CA证书:除用户信息外,数字证书中还包括证书机构名称,证书有效期,证书的序列号,签名使用的哈希算法,公钥使用的加密算法等相关信息,参见rfc标准:RFC 2459 Internet X.509 Public Key Infrastructure

用户A把自己的证书发送给用户B。用户B使用CA的公钥对证书的签名进行验证,由于只有CA才能生成该证书,因此只要证书验证正确,即说明证书是由CA发布的,证书中用户A的公钥是值得信赖的。用户B以后就可以使用该公钥验证用户A的签名或者进行和A进行加密通信。

证书的验证

这里有一个有趣的问题,用户B使用证书机构的公钥来验证用户A的数字证书,但如何又能够知道用户B拿到的证书机构的公钥不是伪造的呢?解决办法是再找一个 证书机构对该证书机构的公钥颁发一个证书,这样形成了一个公钥证书的嵌套循环,该循环的终点就是根证书机构。根证书是一个自签名的证书,使用者和发布者信息相同,所以不会继续验证。根证书机构较少,其公钥可以通过安全的方式发 布,如通过USB拷贝、书面文件当面移交。浏览器供应商通常都会内置根证书。

证书链

验证中涉及的所有证书构成一个信任链,链中除根证书和个人证书外的所有CA证书也被称作中间证书。中间证书签名的新证书也属于可信证书,可通过构建信任链得到验证。中间证书可通过客户端自动下载或者服务器推送被客户端获得。

CA证书如何使用?

证书通常不是免费的,我们要到专业的CA(证书机构)申请证书。申请到的证书分为普通证书、多域名证书、和泛域名证书三类,价格由低到高。普通证书通常只能用于一个域名的认证,而多域名证书可用于多个域名的认证,泛域名可用于一个域名和其子域名的认证。多域名的认证通过SSL标准x509中的SAN(Subject Alternative Name)扩展实现。

问题

既然证书这么贵,我们可不可以自己签发证书?

我们可以通过openssl等工具签发自己的证书,但问题在于签发的证书是基于用户个人私钥的,不会存在私钥到根证书的信任链,因此无法获得浏览器的信任。解决办法是将个人私钥安装到SSL中的可信任根证书区。自签发的证书通常用于企业内部或测试环境下的通信加密和身份认证。参考

既然自己签发的证书无法被信任,那么可不可以用CA机构签发的证书来给自己签发新的证书?

CA机构签发的证书内有一个字段注明了此证书是否为一个CA证书,只有CA证书才能签发新的证书。我们从CA机构申请的证书通常为个人证书,无法用于证书签发。当然,如果有一定实力,可以选择通过重重考核成为一个CA,那么就可以基于自己获得的中间证书签发新的证书。参考