https详解(迁移)

http+ssl = https

ssl(Secure Sockets Layer):安全套接层,HTTPS的安全基于SSL

http:数据以明文传输,不安全

https:数据加密后传输,且对服务器进行验证,即当前服务器是不是可以被信任

通俗解释:

A和B发送消息要进行加密,但密钥总是一方生成,传给另一方;

这就存在中间人攻击的问题;只要有传这个动作,这个问题就永远不会被解决,永远可以被拦截

所以从客户端的角度,永远不知道对方是真的服务器还是假的

那么,现在出现了一个权威机构,权威机构给服务器发一个证书,这个证书就代表了服务器的真实性

而权威机构派人入驻客户端,可以检查出这个证是真的还是假的,这样问题就解决了

因为中间人只能造出假证,会被一眼识破

问题就解决了


具体实现:

服务器先向CA申请证书,需要把自己的公钥传给CA,之后会放在证书中

证书主要包含:

证书所有人的公开密钥(即服务器的公钥)

证书发行者对证书的签名(即CA用自己的私钥对发行的证书的签名)

证书所使用的签名算法

证书的发行机构的信息

证书所有人的信息

1.客户端发起https请求,连接到服务器的443端口

2.服务器将自己的证书发送给客户端

3.客户端收到后,①用浏览器内置的证书发行者的公钥对证书签名验签,来验证证书的合法性;②如果合法,则取出服务器的公钥;客户端生成对称密钥,用服务器的公钥对其加密,发送给服务器

4.服务器收到后,用自己的私钥解密,取出对称密钥

之后客户端和服务器则用此密钥对传输的信息加密

优点:

防止了中间人攻击,即始终无法拿到服务器的公钥,更不用说用公钥加密的对称密钥了

CA是负责签发证书、认证证书、管理已颁发证书的机关;并不是一个,而是一类

申请证书的公司

申请的证书类型不同,价格不同,多域名型SSL证书、通配符(泛域名)SSL证书,企业型OVSSL和增强型EVSSL证书的费用相对来说较高

CA公司

要进入各个浏览器的根证书列表,CA公司每年必须过 WebTrust 年度审计,是很大的开销

CA链费用:新开的CA公司要等5-10年,才会被普遍信任,才能广泛进入根证书链。要想加快点,就得给别的大牌CA公司掏钱,买次级证书

要具备发放可信SSL证书的资质,这本身就是一个很大的成本

(来自百度)

关键点:发行证书的机构的公钥能够轻易获得,如果能的话,中间人就可以拦截证书进而取出服务器公钥;答案是不能,‘这些厂商跟浏览器和操作系统都有合作,它们的根公钥都默认装到了浏览器或者操作系统环境里,且设置了权限’

根证书与证书链:

就像是交通主管部门与驾校,我们拿到的驾照是由驾校授权的,而驾校是由主管部门授权的,这样就使得我们的驾照被国家承认

根证书就相当于主管部门,CA就相当于驾校,当然了驾校可能有多级授权,这样就产生了证书链

而证书链的顶端就是根证书,根证书是一份特殊的证书,它的签发者是它本身

根证书被内置在浏览器/操作系统中

拿到根证书就可以一层一层的拨开洋葱,最终拿到服务器的公钥

当然CA证书也是可以自签的,就是可以自己做一个证书出来;但没人认可

除非添加进去后,手动设置为被信任

像之前的12306证书就相当于自己做的证书,而非CA签发的证书

fiddler原理

中间人攻击

与客户端:使用自己的证书与客户端建立连接,所传输的是自己的证书,使用的也是自己的公钥

与服务器:扮演客户端的角色

关键:

第3步后获取到服务器公钥

第5步获取到对称加密的密钥

关键点在于必须要能获取到服务器的公钥,因为即使与客户端间使用的自己的公钥,但第6步必须用服务器的公钥加密

怎么获取到服务器公钥的?

因为有证书链的存在,所以只能是内置了各个根证书

---------update----------

android 7.0

7.0之后无法手动安装证书到系统中了,所以https都抓不到

root装证书

ssl pinning

为了防止中间人攻击,直接将证书打包进客户端,客户端在建立连接时与服务器返回的证书进行比较;

即只信任自家的证书,其他的证书一致不认

这与仅有https是不同的,之前是可以手动安装中间人证书且信任,而客户端对所有证书都是不排斥的,而这也是问题所在

hook

检测hook,暂未遇到

(ps:有些内容来源于网络,不保证绝对正确,但相对合理)

原文地址:https://www.cnblogs.com/justaman/p/11385627.html