最近搞安全相关的内容,参阅了相关资料,整理了下相关知识,算是旧事重题。
https
Https就是Http跑在SSl或者TLS上,所以我们讨论的原理和流程其实是SSL和TLS的流程。
由于采用了加密通讯,Https无疑要比Http更耗费服务器资源,这也是很多公司明明支持Https却默认提供Http的原因。
https涉及到的主体
1. 客户端。通常是浏览器(Chrome、IE、FireFox等),也可以自己编写的各种语言的客户端程序。
里面包括受信任的CA证书列表
2. 服务端。一般指支持Https的网站,比如github、支付宝。
里面包括服务端私钥,CA证书(包括服务端公钥)
3. CA(Certificate Authorities)机构。Https证书签发和管理机构,比如Symantec、Comodo、GoDaddy、GlobalSign。
里面包括根证书、自签名证书
发明https的动机
1. 认证,例如,客户端访问支付宝,要认证所访问的就是支付宝而不是钓鱼网站。
2. 保证所传输数据的私密性和完整性。
https的工作流程
1. 认证服务器。浏览器内置一个受信任的CA机构列表,并保存了这些CA机构的证书。客户端发起请求给服务端,服务端会提供经CA机构认证颁发的服务器证书,如果认证该服务器证书的CA机构,存在于浏览器的受信任CA机构列表中,并且服务器证书中的信息与当前正在访问的网站(域名等)一致,那么客户端就认为服务端是可信的,并从服务器证书中取得服务器公钥,用于后续流程。否则,浏览器将提示用户,根据用户的选择,决定是否继续。当然,我们可以管理这个受信任CA机构列表,添加我们想要信任的CA机构,或者移除我们不信任的CA机构。
2. 协商会话密钥。客户端在认证完服务器,获得服务器的公钥之后,利用该公钥与服务器进行加密通信,协商出两个会话密钥,分别是用于加密客户端往服务端发送数据的客户端会话密钥,用于加密服务端往客户端发送数据的服务端会话密钥。在已有服务器公钥,可以加密通讯的前提下,还要协商两个对称密钥的原因,是因为非对称加密相对复杂度更高,在数据传输过程中,使用对称加密,可以节省计算资源。另外,会话密钥是随机生成,每次协商都会有不一样的结果,所以安全性也比较高。
协商会话密钥的过程是:客户端随机生成RSA公私钥、会话密钥。客户端使用服务端公钥加密{客户端公钥、客户端会话密钥}并发给服务端。服务端使用私钥解密。服务端随机生成会话密钥。服务端使用客户端公钥加密{服务端会话密钥}。客户端使用私钥解密。
3. 加密通讯。此时客户端服务器双方都有了本次通讯的会话密钥,之后传输的所有Http数据,都通过会话密钥加密。这样网路上的其它用户,将很难窃取和篡改客户端和服务端之间传输的数据,从而保证了数据的私密性和完整性。
使用https的流程
1. 使用OpenSSL等工具生成服务器私钥
2. 使用OpenSSL等工具,结合服务器私钥、其他服务器信息等,生成证书请求CSR文件
3. 将CSR文件发送给GlobalSign等CA结构,支付相应的费用,获得CA机构颁发的服务证书
4. 在服务端配置https服务
https的问题说明
1. SSL是对传输的数据进行加密,针对的是传输过程的安全,Firebug和postman之类的浏览器调试工具得到的是客户端加密之前/解密之后的数据,因此是明文的
2. 自签名证书就是自己生成的证书,并不是官方生成的证书,除非是很正式的项目,否则使用自己签发的证书即可,因为官方生成证书是要花钱的。