HTTPS,SSL/TLS相关基础知识
如果不能美得惊人,那就丑得销魂吧!
因为http协议的无状态性,所以具有明文和不安全性的缺点,所以就此推出了https协议,解决以上2个缺点
由于HTTP天生“明文”的特点,整个传输过程完全透明,任何人都能够在链路中截获、修改或者伪造请求/响应报文,数据不具有可信性。
怎么样的通信才能算是安全的呢,一般必须具备以下几个特性:
- 机密性
- 完整性
- 身份认证
- 不可否认
机密性(Secrecy/Confidentiality)是指对数据的“保密”,只能由可信的人访问,对其他人是不可见的“秘密”,简单来说就是不能让不相关的人看到不该看的东西。
比如小明和小红私下聊天,但“隔墙有耳”,被小强在旁边的房间里全偷听到了,这就是没有机密性。我们之前一直用的Wireshark ,实际上也是利用了HTTP的这个特点,捕获了传输过程中的所有数据。
完整性(Integrity,也叫一致性)是指数据在传输过程中没有被篡改,不多也不少,“完完整整”地保持着原状。机密性虽然可以让数据成为“秘密”,但不能防止黑客对数据的修改,黑客可以替换数据,调整数据的顺序,或者增加、删除部分数据,破坏通信过程。
比如,小明给小红写了张纸条:“明天公园见”。小强把“公园”划掉,模仿小明的笔迹把这句话改成了“明天广场见”。小红收到后无法验证完整性,信以为真,第二天的约会就告吹了。
身份认证(Authentication)是指确认对方的真实身份,也就是“证明你真的是你”,保证消息只能发送给可信的人。如果通信时另一方是假冒的网站,那么数据再保密也没有用,黑客完全可以使用冒充的身份“套”出各种信息,加密和没加密一样。
比如,小明给小红写了封情书:“我喜欢你”,但不留心发给了小强。小强将错就错,假冒小红回复了一个“白日做梦”,小明不知道这其实是小强的话,误以为是小红的,后果可想而知。
不可否认(Non-repudiation/Undeniable),也叫不可抵赖,意思是不能否认已经发生过的行为,不能“说话不算数”“耍赖皮”。使用前三个特性,可以解决安全通信的大部分问题,但如果缺了不可否认,那通信的事务真实性就得不到保证,有可能出现“老赖”。
比如,小明借了小红一千元,没写借条,第二天矢口否认,小红也确实拿不出借钱的证据,只能认倒霉。另一种情况是小明借钱后还了小红,但没写收条,小红于是不承认小明还钱的事,说根本没还,要小明再掏出一千元。
https协议包含的上面的四个特性
HTTPS其实是一个“非常简单”的协议,RFC文档很小,只有短短的7页,里面规定了新的协议名“https”,默认端口号443,至于其他的什么请求-应答模式、报文结构、请求方法、URI、头字段、连接管理等等都完全沿用HTTP,没有任何新的东西。
这就是HTTPS与HTTP最大的区别,它能够鉴别危险的网站,并且尽最大可能保证你的上网安全,防御黑客对信息的窃听、篡改或者“钓鱼”、伪造。
HTTPS凭什么就能做到机密性、完整性这些安全特性呢?
秘密就在于HTTPS名字里的“S”,它把HTTP下层的传输协议由TCP/IP换成了SSL/TLS,由“HTTP over TCP/IP”变成了“HTTP over SSL/TLS”,让HTTP运行在了安全的SSL/TLS协议上(可参考第4讲和第5讲),收发报文不再使用Socket API,而是调用专门的安全接口。
SSL/TLS是什么?
SSL即安全套接层(Secure Sockets Layer),在OSI模型中处于第5层(会话层),由网景公司于1994年发明,有v2和v3两个版本,而v1因为有严重的缺陷从未公开过。
SSL发展到v3时已经证明了它自身是一个非常好的安全通信协议,于是互联网工程组IETF在1999年把它改名为TLS(传输层安全,Transport Layer Security),正式标准化,版本号从1.0重新算起,所以TLS1.0实际上就是SSLv3.1。
TLS由记录协议、握手协议、警告协议、变更密码规范协议、扩展协议等几个子协议组成,综合使用了对称加密、非对称加密、身份认证等许多密码学前沿技术。
浏览器和服务器在使用TLS建立连接时需要选择一组恰当的加密算法来实现安全通信,这些算法的组合被称为“密码套件”(cipher suite,也叫加密套件)。
OpenSSL是什么?
它是一个著名的开源密码学程序库和工具包,几乎支持所有公开的加密算法和协议,已经成为了事实上的标准,许多应用软件都会使用它作为底层库来实现TLS功能,包括常用的Web服务器Apache、Nginx等。
OpenSSL是从另一个开源库SSLeay发展出来的,曾经考虑命名为“OpenTLS”,但当时(1998年)TLS还未正式确立,而SSL早已广为人知,所以最终使用了“OpenSSL”的名字。