https原理&双向验证

https原理
在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,于是设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。
先从对称加密说起。什么是对称加密?简单说就是一个密钥,可以加密一段信息也可以对加密后的信息进行解密,不能只用对称加密,秘钥会被劫持。
所以有了非对称加密。什么是非对称密钥?简单说就是有两把密钥,一把公钥一把私钥。只能保证客户端用公钥加密过的数据只能通过服务端的私钥能解开,但是服务端传输给客户端的公钥是明文传输的,可能被劫持,所以只能保证单向传输安全。
改良的非对称加密:两组公钥私钥,客户端和服务端分别持有一对公私钥,这样就能保证双向传输安全。
因为非对称加密算法非常耗时性能不好,非对称加密+对称加密:浏览器拿到公钥后随机生成一个对称加密的密钥,然后通过对称加密进行传输。这个方法的漏洞是,攻击者可以替换公钥。
如何证明浏览器收到的公钥一定是该网站的公钥?通过CA机构颁发的数字证书。如何防止数字证书被篡改?数字签名:CA机构拥有非对称加密的公钥和私钥,CA机构对证书明文数据T进行hash,对hash后的值用私钥加密,得到数字签名S,明文和数字签名共同组成数字证书。
非对称加密算法:RSA,DSA/DSS
对称加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256
验证证书是否是上级CA签发的
windows中保留了所有受信任的根证书,浏览器可以查看信任的根证书,自然可以验证web服务器的证书,是不是由这些受信任根证书颁发的或者受信任根证书的二级证书机构颁发的(根证书机构可能会受权给底下的中级证书机构,然后由中级证书机构颁发中级证书)
在验证证书的时候,浏览器会调用系统的证书管理器接口对证书路径中的所有证书一级一级的进行验证,只有路径中所有的证书都是受信的,整个验证的结果才是受信
有些证书本身就存在在操作系统中,浏览器可以识别,如果是自己签发的证书需要自己手动导入到浏览器中
如何抓取HTTPS的请求数据
当站点由HTTP转成HTTPS后是更安全了,但是有时候要看线上的请求数据解决问题时却麻烦了,因为是HTTPS的请求,你就算拦截到了那也是加密的数据,没有任何意义。
- (1)Fiddler根证书导出
- (2)浏览器中导入Fiddler根证书
这里的关系是:浏览器 -> Fiddle(代理)-> 服务器,Fiddler在客户端发出Https请求时,充当了服务器的角色,需要返回一个证书给客户端,但是Fiddler的证书并不是CA机构颁发的,客户端一验证就知道是假的连接肯定就断了,那就想办法让客户端信任这个服务端,于是就在客户端安装一个Fiddler的根证书。所以只要是通过Fiddler的Https请求,验证根证书时自然会通过,因为Fiddler的根证书已经受信了!现在只是客户端和Fiddler这个伪服务端的Https验证通过了,还没有到真正的服务端去取数据的,此时Fiddler会以客户端的身份与真正的服务端再进行一次HTTPS的验证,最后拿到数据后又以服务端的身份与客户端通信。也就是说在一次请求中数据被两次加解密,一次是手机到Fiddler,一次是Fiddler到真正的服务端。
双向验证
日常我们看到的是单向验证,是通过https实现的,但对于一些金融行业,不是所有客户端都能访问当前网站,所以就需要双向验证。具体实现方式是通过个人签发证书,在需要访问网站的客户端安装证书,通过在代理(nginx等)配置,或者不使用代理的情况下通过代码的形式手动延签的方式验证。
具体实现步骤
//git进入openssl
//生成ca私钥和根证书
openssl>genrsa -out Server.key 4096
openssl>req -new -x509 -days 3650 -key Server.key -out Server.crt
//生成客户端私钥
openssl>genrsa -out client.key 4096
//生成客户端证书请求文件
openssl>req -new -key client.key -out client.csr
//根据请求文件生成客户端证书
openssl>x509 -req -in client.csr -CA Server.crt -CAkey Server.key -CAcreateserial -out client.crt -days 3650
//将生成的根证书传到服务器中
//nginx增加相关配置
ssl_verify_client on;
ssl_client_certificate Server.crt;
//导出客户端pfx证书,用于windows安装
openssl>pkcs12 -export -inkey /c/Users/sjq/Desktop/Cert/client.key -in /c/Users/sjq/Desktop/Cert/client.crt -out /c/Users/sjq/Desktop/Cert/client.pfx
以上安装过证书的客户端就能正常访问网站,没有安装过证书的客户端就会显示400无法正常访问。