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都抓不到
ssl pinning
为了防止中间人攻击,直接将证书打包进客户端,客户端在建立连接时与服务器返回的证书进行比较;
即只信任自家的证书,其他的证书一致不认
这与仅有https是不同的,之前是可以手动安装中间人证书且信任,而客户端对所有证书都是不排斥的,而这也是问题所在
hook
检测hook,暂未遇到
(ps:有些内容来源于网络,不保证绝对正确,但相对合理)