大家在浏览网页的时候一定有这样的体验,有一些网站在网址那里会显示一个绿色的挂锁,并且网址中“https”相关的字样也是绿色的,聪明的朋友肯定会问,这些颜色和符号代表什么意思呢?想想大家在上网的时候,经常要输入账号和密码,有时候网购还要输入信用卡信息,如果这些信息被偷了,后果是很严重的。是的,这个绿色的锁就是用来保护大家的信息不被黑客窃取。现在很多网站默认使用HTTPS来保护用户的信息,截止2018年4月,Alexa前100万的网站中,32.2%使用HTTPS作为默认设置,互联网最受欢迎的137971个网站中,57.1%使用了HTTPS;Firefox遥测数据显示,70%的网站使用了HTTPS。
HTTPS安全(HTTPS)是超文本传输协议(HTTP)的扩展,它能够使计算机网络进行安全通信,现已广泛用于Internet。
HTTPS使用传输层安全协议(TLS)或其前身安全套接层(SSL)对通信进行加密。所以HTTPS有时也被称为HTTP over TLS或者HTTP over SSL。服务端和客户端仍然使用HTTP协议进行通信,在通信过程中通过安全的连接来加密和解密他们的请求和响应。HTTPS主要做了两件事:
客户端和服务端之间使用了双向加密,可以防止窃听和篡改数据。这样在一定程度上保证了用户浏览网页时不会被冒名顶替者欺骗。
最开始的时候,HTTPS主要用于保护万维网上的支付行为,电子邮件和公司信息系统中的敏感交易。后面随着大家安全意识的增强,网站普遍开启了HTTPS,用于保护网页的真实性,账户安全,并保持用户通信,身份和网页浏览的私密性。
客户端和服务端的SSL/TLS连接通过握手建立,建立安全连接的目的在于:
握手的流程如下:
大致可以分为三个阶段
下面是一个抓包例子
master_secret = PRF(pre_master_secret, "master secret", ClientHello.random + ServerHello.random) [0..47];
握手过程的最后一条消息和安全连接中的第一条加密消息是Finished,下下面是一个例子。
从形式上看,SSL/TLS证书只是一个文本文件而已,任何用于文本编辑器的人都可以创建一个证书。利用一些现有的工具可以轻易创建一个证书来声明自己是谷歌,并且控制着域名gmail.com。如果真的能这样的话,SSL/TLS将成为一个笑话。身份验证流程是:
防止这种闹剧的办法在于数字签名,它允许一方验证另一方的纸张是否合法。
有两个情况让用户可以信任一个证书:
第一种情况很简单。浏览器都会预先安装来自证书颁发机构(CA)的可信SSL证书列表。用户可以查看,添加,删除这些证书。在实际情况中,这些证书会由赛门铁克,Comodo和GoDaddy等非常安全,可靠指的信赖的组织来颁发。
符合第二种情况更难一些。服务器很容易说:“呃,我的名字是,呃微软,你信任赛门铁克,呃他们完全信任我,所以你懂得。”有点聪明的客户可能去问赛门铁克:“我这里有一个叫微软的说你相信他们,这是真的吗?”不过,即使赛门铁克说“是的,我们知道微软,他是可信的”,你仍然不知道这个号称是微软的服务器真的是微软呢,还是其他更糟糕的东西。这就是我们需要数字签名的原因。
之前提到过,SSL/TLS证书有用到公钥/私钥对。公钥作为证书的一部分被公开,而私钥需要很好的保护。这对非对称密钥在SSL握手中用于交换双方的另一个密钥来对数据进行加密和解密,即客户端使用服务器的公钥来加密对称密钥并将其安全地发送到服务器,然后服务器使用其私钥对其进行解密。任何人都可以使用公钥进行加密,但只有服务器可以使用私钥进行解密。
而数字签名的使用正好相反。证书由一个权威机构“签署”,权威机构在证书上记录“我们已经证实此证书的控制者拥有对证书上列出的域名具有控制权”,记录的方式是,授权机构使用他们的私钥对证书的内容进行加密,并将该密文附加到证书上作其数字签名。任何人都可以使用授权机构的公钥解密这个签名进行验证。因为只有授权机构才能使用私钥加密内容,所以只有授权机构能够真正创建一个有效的签名。
因此,如果服务器声称拥有由赛门铁克签署的Microsoft.com的证书,浏览不必相信它。如果用赛门铁克的公钥能够证明证书上的签名是有效的话,那么这个证书就是合法的。赛门铁克会采取措施确保他们签署的组织确实拥有Microsoft.com域名,如果客户端信任赛门铁克,那么也可以信任服务属于Microsoft公司。
值得注意的是,所有根CA证书都是“自签名的”,也就是说数字证书是使用CA自己的私钥生成的。和其他证书相比,CA证书没有什么特殊的地方。你完全可以生成自己的自签名证书,并根据需要使用此证书来签署其他证书。只不过你的证书并没有作为CA预先加载到其他人的浏览器里,其他人都不会相信你你签署证书或者其他证书。如果你胆敢宣称“我是微软,这是我自己签发和签署的官方证书”,所有的浏览器都会因为这个错误的凭证抛出一个非常可怕的错误信息。
。
这些安全措施要由浏览器和操作系统发行商来处理,他们只信任干净的根CA,那些组织是他们的用户最终信任审查网站并保证证书安全的组织。
技术上,用户并不需要验证是否应该信任发送证书的一方,而是应该信任证书中包含的公钥。SSL证书是完全公开和公开的,因此任何攻击者都可以获取Microsoft的证书,拦截客户对Microsoft.com的请求并向其提供合法证书。客户会接受证书并地开始握手。但是,当客户端加密将用于实际数据加密的密钥时,它将使用真实证书中获得的Microsoft的公钥进行加密。由于攻击者没有微软的私钥来解密,通信无法进行进行。即使握手完成,他们仍然无法解密密钥,因此无法解密客户端发送给他们的任何数据。只要攻击者不控制可信证书的私钥,数据就无法被解密。如果攻击者用某种方式让客户相信了假冒的证书和公钥,还是会产生问题。
并不能。公钥密码术的神奇在于攻击者可以嗅探客户端和服务器之间交换的每一个字节的数据,但是并不能获取这些数据里的信息。在不安全的WI-FI网络上浏览HTTP的网站是非常危险的。举个例子,用户使用HTTPS提交用户名/密码组合的表单,但假如这个表单是通过HTTP加载的,攻击者可能会在表单HTML中插入恶意代码,将账号/密码发送到他们自己的服务器上。
如果公司控制着你用的电脑,那么是的。每一个信任链的根源在于隐含信任的CA,并且这些权限的列表存储在浏览器中。公司可以将自己的自签名证书添加到电脑的CA列表中。因为浏览器信任其伪造的签名,因此公司可以提供声称代表相应网站的证书,来拦截你所有的HTTPS请求。由于客户端将使用其恶意证书的公钥对所有HTTPS请求进行加密,因此他们可以使用相应的私钥解密并检查(甚至修改)请求,然后将其发送到其预期的位置。
公司是由这个能力的,取决于他们想不想这样干。
HTTPS不是不可破解的,并且SSL/TLS协议必须随着新攻击被发现和压制而不断发展。不过在很多情况下,它能够保证足够的安全性。关键点在于,虽然HTTPS可以保证数据安全地到达目的地,但是它并不能保护用户免受XSS攻击,重放攻击,数据库泄漏的威胁。它正如电影中《黑衣人》的主题曲:“Walk in shadow, move in silence, guard against extra-terrestrial violence(行于阴影,行于沉默,打击暴力和恐怖 )”