都要懂得HTTPS知识点

XNEVance 8年前
   <p><strong>HTTPS</strong></p>    <p>关于2017年AppStore新提交应用必须打开ATS的要求只剩下一个多月了,相信大部分开发者都已经完成了从http到https的升级。当然了,现在谁也不知道如果依旧关闭ATS,审核的时候会发生什么。挑战apple的事,还是不要做比较好…</p>    <p>最近看完了《HTTPS图解》,借花献佛,简要分享下相关知识点。</p>    <p><strong>HTTP与HTTPS区别</strong></p>    <p>HTTPS的URL以https开头,默认端口443。HTTP的URL以http开头,默认端口80。</p>    <p>HTTP未加密,易受“中间人”攻击和信息窃取,攻击者可以获取网站账号、敏感信息,修改网页注入恶意软件或者广告。</p>    <p>HTTP(超文本传输协议)位于应用层,运行在TCP/IP模型的最上层。很重要的一点,HTTPS并不是一个新的或者单独的协议,而是在一个加密的TLS\SSL链接上使用HTTP协议。(HTTP over TLS,HTTP over SSL)</p>    <p><strong>通信加密</strong></p>    <p>HTTP与TLS(Transport Layer Security)、SSL(Secure Sockets Layer)组合使用。</p>    <p>层次关系上,TLS\SSL位于HTTP层之下,因为网络通信需要一层层的走,所以保护之下的HTTP内的一切消息都是加密的,包括header、request、response、cookie等。</p>    <p>SSL诞生于Netscape,是TLS的前辈,都是保障通信安全的加密协议。现在主流的是TLS 1.0和SSL 3.0。更多历史故事不在阐述。</p>    <p><strong>内容加密</strong></p>    <p>这里是说对HTTP的报文进行加密,同时客户端和服务器之间有协商好的加密解密机制。HTTP自身没有加密功能,由SSL进行加密的工作。</p>    <p><strong>共享密钥加密(Common key crypto sytem)</strong></p>    <p>这种方式也称之为对称密钥加密。加密算法是公开,通信双方都需要一个密钥,密钥是为每个连接单独生成的(The keys for this symmetric encryption are generated uniquely for each connection and are based on a shared secret negotiated at the start of the session),加密解密的时候都得用到这个密钥。这种方式加密时必须把密钥也给对方,危险地方在于一旦通信被监听,被攻击者拿到密钥,加密算法就算被攻破了。</p>    <p><strong>公开密钥加密(public-key cryptography)</strong></p>    <p>非对称密钥加密。有两把密钥,一个私有密钥,一个公开密钥,私有密钥是严格保密的,公开密钥是公开的。首先发送方使用公开密钥进行加密,接收方收到信息后,在用自己的私有密钥进行解密。过程中,不需要发送用来解密的私有密钥。安全系数较高。不过处理速度要比共享密钥加密慢。</p>    <p><strong>证书</strong></p>    <p>还有一个风险,通信过程中的公开密钥可能已经被攻击者替换了。为了证明服务器的公开密钥是真的,证书认证机构(CA)和公开密钥证书就上场了。服务器运营人员向CA申请公开密钥,CA审核通过后,对申请的公开密钥做数字签名,然后就会把该签名和证书做捆绑。</p>    <p><strong>公钥证书 = 数字签名 + 公钥</strong></p>    <p>服务器再把这份证书发给客户端,已进行公开密钥加密通信。</p>    <p><strong>HTTPS通信步骤</strong></p>    <p>先放一张图,都很熟悉的TCP\IP三次握手</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/b821104d1c6865166ca3069160d46956.png"></p>    <p>再来一张msdn的SSL握手。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c80bef0deec8aac4b0f0369f5208ad7b.png"></p>    <p>下面客户端用C表示,服务器用S表示。</p>    <ul>     <li> <p>C向S发出Client Hello报文,附带SSL协议版本号、会话id、加密组件列表(密钥长度、加密方式)</p> </li>     <li> <p>S向C发出Server Hello报文,附带SSL协议版本号、会话id、服务器证书(包含公钥)、选择后的加密组件列表(从客户端发来的筛选的)</p> </li>     <li> <p>第一次握手结束后,C向S发出Client Key Exchange报文, 包含一个名叫Pre Master Secret的随机码(已用公钥进行加密),目的提示服务器接下来的报文都用Pre Master Secret机密。</p> </li>     <li> <p>C继续发Change Clipher Spec,Finished报文。</p> </li>     <li> <p>S回应 Change Clipher Spec,Finished报文。</p> </li>     <li> <p>安全的通信建立了。</p> </li>    </ul>    <p> </p>    <p> </p>    <p>来自:http://www.cocoachina.com/ios/20161130/18227.html</p>    <p> </p>