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