由于 https 中涉及的概念较多, 因此简单说说其中较为麻烦的数字证书等相关内容
由于 http 的传输服务是明文传输, 所谓的明文传输就是在通信双方的中间通过抓包发现 http 的头部是明文, 可以很容易获取 cookie,url 中的信息, 不要小看这些 http 头部信息, 曾经很多帐号的账户名和密码都存在这两个位置, 当然随着哈希, 编码等技术的应用, 现在想要获取密码并不容易了同时 http 的数据部分也是明文, 可以很容易还原出数据内容, 例如文字, 图片和视频
因此就出现了 https 服务, 将明文传输的内容进行加密, 包括 http 头部和数据部分, 由于加密之后的数据是一堆杂乱无章的二进制, 因此, 就无法获取有意义的信息
确切的说 https 并不是一种协议, 而是 TLS+HTTP 两种协议组合的服务因此 http 还是以前的 http, 只是在 http 和 TCP(当然也有 DTLS, 不多说) 层之间加入了 ssl 协议, 这样 tcp 上层的数据部分就可以加密传输
关于加密发展的历史, 我在这篇文章中有一定的阐述
其实 ssl 可以设计的很简单, 因为该层主要作用就是协商通信双方加密密钥, 然后对上层数据进行加解密 ssl 之所以设计如此复杂的原因, 还是在于数字证书的存在首先加密有两种方式, 对称加密和非对称加密, 其中对称加密的速度要快于非对称加密, 因此在实际的应用中数据量大的加密都是对称加密
但是对称加密无法保证密钥的安全, 因此需要非对称加密来传输对称加密所使用的密钥, 而非对称加密由于需要验证通信对等方的身份, 因此需要数字证书当然数字证书的作用就是携带签验证通信对等方的身份名, 在 openssl(openssl 是 ssl 协议那一堆 RFC 的实现) 中, 证书还有另一个作用就是携带非对称加密公钥以及非对称算法等
在非对称加密中有两个概念需要注意的, 就是签名和加密举例来说, RSA 是一种非对称加密算法, 该算法即可以用于加密, 也可以用于签名所谓 RSA 加密就是使用公钥进行加密, 私钥进行解密, 应用就是 ssl 协议中的预主密钥交换部分; 所谓的 RSA 签名就是使用私钥进行签名 (其实也是加密, 只是换一种说法), 使用公钥验证签名, 对应 ssl 握手中的证书签名和验签部分
证书的验证过程就是, 网站证书 certA 部分的签名由签发该证书 CA 验证, 主要是该 CA 的公钥进行验签, 因为 certA 的签名部分是由 CA 的私钥进行签名的; 当然为了证明 CA 的身份, CA 也需要一个证书, 就是 CA 的证书 certB,certB 是由更高一级的 CA 签发的, 直至根 CA 当然根 CA 也有一个证书就是根证书 certC, 通常该证书是集成在 firefox 这种浏览器厂商里面的, 或者像 android 这种操作系统里面
因此整个过程就是 certA 使用 certB 的公钥验证 certA 的合法性, certB 使用 certC 的公钥验证 certB 的合法性, 整个证书链必须全部验证通过, 证书的验证才能通过可以看到整个验证最关键的地方在于根证书如果系统中手动安装了虚假的根证书, 整个证书链的验证就会出现问题因此, 像前面提到的那样, 根证书的集成是很关键的, 是多家厂商和浏览器以及操作系统公司协商, 资质认定的结果像前一段时间沃通被吊销根证书就是这些国外的浏览器巨头和操作系统巨头认定沃同不具备根证书的资格, 说白了就是信用有问题, 然后从浏览器以及操作系统中被删除那么由沃通授权的 CA 所签发的证书就会受到影响具体就是浏览器会弹出告警信息因此可以看出即使是根证书机构, 也是要约束自己的行为, 不能随意签发证书
当然实际上证书的验证还包括证书里面的使用者信息或者扩展中的 altname 要和实际访问的域名保持一致, 日期不能失效等等, crl 以及 oscp 列表等因此这就导致了我们在申请证书的时候, 是需要填写证书的域名信息, 也就是申请的证书是应用于哪个网站的证书的时间信息一般是由签发的 CA 决定的, 可能是一年的有效期或者更长当然, 由于某种原因, 例如网站私钥泄漏了, 需要重新申请证书, 该证书就被废弃掉, 添加到 crl 列表
就是有时候有人来问我加密和证书相关概念, 希望这篇文章能够帮助一些人在这些概念上有个了解
来源: http://blog.csdn.net/javajiawei/article/details/79178457?from=singlemessage