因为http协议是明文传输,安全性差,所以要利用https来进行加密传输,关键点在于TLS/SSL协议html
SSL(安全套接层)最初在1994年建立,做为http的扩展,后来逐步发展为独立协议,并更新了三个版本(v1.0、v2.0、v3.0),后来在v3.0基础上标准化了该协议,并命名为TLS(传输层安全协议v1.0)。所以,TLS能够理解为SSL协议的升级版。算法
因为TCP协议可保证数据传输的可靠性(完整性),所以任何数据到达TCP以前通过TLS/SSL协议处理便可。segmentfault
http通讯风险:安全
TLS/SSL协议核心:服务器
TLS/SSL协议主要由两层构成:post
开始加密通讯以前,客户端和服务器首先必须创建链接和交换参数,此过程称为握手。加密
相关概念:设计
1、认证: 客户端要经过CA机构,采用签名数字证书的技术方案,对服务端进行身份认证,避免中间人攻击。orm
2、密码套件协商: 客户端和服务端须要协商出双方都承认的密码套件,密码套件决定了本次链接采用的加密算法、密钥协商算法等各种算法。cdn
3、密钥协商: 不一样的密钥协商算法会有不一样的握手过程,因为RSA算法和静态DH算法都存在前向安全性问题,所以目前使用最多的是DHE算法和ECDHE算法(与服务器密钥对的关系不大)。
4、握手消息完整性校验: 握手消息会通过TLS/SSL协议加密层保护,能够确保握手消息的机密性和完整性,若是握手消息被篡改,则整个握手过程会失败。
基于RSA算法的握手:
客户端和服务端根据约定的加密套件,使用前面两个随机数和预主密钥生成主密钥,以后的通讯使用主密钥加密解密。
因为整个握手阶段是明文的,所以也存在安全风险(第三个随机数存在被破解出的风险),能够将默认的RSA算法改成DH算法提升安全性。
基于DH算法的握手:
以后,客户端利用公钥验证服务器签名,客户端与服务器各自利用服务端DH参数、客户端DH参数生成预主密钥,再经过预主密钥、客户端随机数、服务端随机数生成主密钥(会话密钥)。最后握手完成,以后的通讯使用主密钥加密解密。
此外,在认证过程当中,若是客户端发现服务端证书无效,就会向用户发出警告,由其选择是否要继续通讯。
握手层协商出加密层须要的算法、算法的密钥块,加密层则进行加密运算和完整性保护。
目前主要有三种加密模式:
考虑到加密和完整性运算涉及到的安全性问题,建议采用AEAD加密模式。
TLS/SSL协议是设计规范,OpenSSL是目前最通用的TLS/SSL协议实现。
OpenSSL是一个底层密码库,封装了全部的密码学算法、证书管理、TLS/SSL协议实现。
对于开发者来说,正确地理解并使用底层OpenSSL库便可。