HTTPS初探
1. 为什么需要HTTPS
HTTP使用的是明文传输,因此当用户向服务器发起请求的时候,如果其数据包被嗅探拦截,那么就会产生信息泄露甚至中间人攻击。
设想一下,如果支付宝登录时使用的是纯粹的HTTP,那么你在登录支付宝的时候,请求数据被攻击者嗅探到之后,攻击者就知道了你的支付宝账号和密码,而如果你在使用支付宝进行转账的时候,攻击者拦截了你的数据,并将数据中的转账信息修改后重新发送,那么你的钱可能就转到了攻击者修改的那个账号中。
因此我们需要将一些敏感的信息进行加密传输,这样即使数据被攻击人嗅探,由于他没有解密密钥,依然无法获得可用的信息。
2. HTTPS加密过程
为了保证请求数据的机密性,网景公司设计了SSL协议来对HTTP传输的数据进行加密,亦即我们所说的HTTPS,SSL后来发展成如今的TLS。
HTTPS加密过程简述:
1.浏览器访问HTTPS网站时,将自己支持的加密算法告诉服务器
2.服务器将证书和选出的加密算法发送给浏览器,证书内容包括网站地址,公钥,证书签发机构等
3.浏览器对收到的证书做合法校验,如校验通过,则后续的传输内容即可进行加密传输
当然,具体的实现过程比上述步骤要复杂很多,不过幸运的是,浏览器已在背后默默的为我们把所有事情都处理完了,我们需要注意的只是,当证书校验不通过时,浏览器给出的如下提示:
3. 创建HTTPS证书
我们使用openssl来创建一个证书,其步骤如下:
1.创建RSA公私钥
openssl genrsa -des3 -out diseng1991.pem 2048
该命名执行时,需要我们指定使用3DES加密算法对密钥进行加密的口令
2.创建证书请求
openssl req -new -key diseng1991.pem -out diseng1991.csr
这里我们使用步骤1中的RSA密钥来生成证书请求,该命令执行时,需要输入步骤1中的口令来获得RSA公私钥,并且需要输入网址的相关信息
3.对证书请求签名得到可用证书
openssl x509 -req -days 365 -in diseng1991.csr -signkey diseng1991.pem -out diseng1991.crt
这里我们使用步骤1中生成的RSA密钥来对步骤2中生成的证书请求进行签名,并生成可用证书
4.将RSA密钥和证书配置到服务器中
此时,我们访问服务器就可以看到证书相关信息了
当然,这里的证书,由于不是可信CA签发的,因此浏览器会给出证书不受信任的提示。
4. HTTPS攻击
虽然HTTPS可以为传输内容加密,但是其加密基础是建立在证书可靠之上的,因此当证书受到伪造或者攻击者将HTTPS请求更改为HTTP后返回给浏览器,那么HTTPS就失去了作用。
1.SSL劫持攻击
攻击者拦截服务器返回的数据,并将证书替换为其事先伪造的一个证书,然后将修改后的数据返回给浏览器,这时浏览器做证书合法性校验会不通过,提示用户证书校验不通过,但是部分安全意识不强的用户可能会不顾提示,继续访问网站。
这时,有趣的事情发生了,由于用户信任了攻击者的证书,因此其发给服务器的数据都将使用攻击者的公钥进行加密,攻击者对数据进行拦截之后,使用私钥即可对加密的数据进行解密查看,之后攻击者使用服务器的公钥对数据加密后重新发送给服务器。服务器处理完之后,返回的数据,被攻击者拦截查看(涉及到加密性能,实际对传输内容进行加密的密钥并不是证书的公私玥,公私玥只对内容加密密钥进行加密,读者只需知道此时攻击者是可以解密服务器返回的数据即可),攻击者使用自己的证书对内容重新加密再发送给用户。
因此要防止SSL劫持攻击,需要用户有较强的安全意识。当然,并不是说证书校验不通过,该证书就是伪造的证书,例如我们伟大的12306证书就是不受浏览器信任的。
一般证书校验不通过主要包括以下几个原因:
1.SSL证书不是由受信任的CA机构颁发的
2.证书过期
3.访问的网站域名与证书绑定的域名不一致
2.SSLStrip攻击
攻击者将HTTPS访问替换为HTTP返回给浏览器,由于HTTP协议传输的数据是未加密的,从而截获用户访问的数据。这种攻击对普通用户非常具有迷惑性,但是防御却非常的简单:
1.服务器开启HTTP Strict Transport Security配置项,也可在代码中强制或重写请求到HTTPS
2.使用辅助手段,对数据进行初始加密,这样即使没有得到证书加密,信息也不会泄露
3.对于安全意识较强的用户,可以手动输入https进行网站访问
防御SSLStrip攻击比较简单,大多数网站都已做好安全方面的配置,但也有少数的网站仍然没有重视这个问题。
3.第三类攻击
攻击者利用软件其他的安全漏洞来解密数据或者绕过HTTPS,对于这种情况,软件厂商在软件设计阶段要充分考虑安全的问题,并且及时更新程序中的缺陷与安全漏洞;作为用户要及时的更新应用程序或者系统补丁,从而减少安全威胁。
参考文章:
blog comments powered by Disqus