Total Pageviews

Saturday, 7 February 2015

HTTP与HTTPS



在三大社交网站(facebook,twitter,google plus)上混过的同道们都应该注意到了一点:这三个网站的域名前面都是https而不是最常见的http。

先介绍http: 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是互联网上应用最为广泛的一种网络协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过 HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用Web浏览器、网络 爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理、网关或者隧道(tunnel)。
尽管TCP/IP协议是互联网上最 流行的应用,HTTP协议中,并没有规定必须使用它或它支持的层。事实上,HTTP可以在任何互联网协议上,或其他网络上实现。HTTP假定其下层协议提 供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在TCP/IP协议族使用TCP作为其传输层。
通常,由HTTP客 户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客 户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。

HTTP协议的具 体定义复杂专业,在此不进行具体介绍,你只需要搞清楚一点:在只使用HTTP协议的情况下,本地浏览器与目标网站之间的数据流是明文的!也就是说,你的 ISP知道你都干了些什么,而且任何人(黑客,GFW,盖世太保)都可以对你的数据流进行截取监听,你没有任何隐私可言。

这对于需要登录 的网站简直是噩梦,账号密码以及在网站上的发言都很容易被盗取,而且要制作一个能骗过多数人的钓鱼网站也很容易,因为本地浏览器并不会去验证目标服务器的 真实身份,很容易遭受中间人攻击(攻击者伪装成目标服务器接收数据流,解密监听后在转给真正的目标服务器)。

为了增加安全性,HTTPS 横空出世:网景(曾经很强大的收费浏览器公司,后来被微软用免费的IE搞死)在1994年创建了HTTPS,并应用在网景导航者浏览器中。最 初,HTTPS是与SSL一起使用的;在SSL逐渐演变到TLS时,最新的HTTPS也由在2000年五月公布的RFC 2818正式确定下来。(20年后竟然大多数网站还不支持HTTPS,这普及速度真是够慢的!)

HTTP协议和安全协议同属于应用层 (OSI模型的最高层),具体来讲,安全协议工作在HTTP之下,运输层之上:安全协议向运行HTTP的进程提供一个类似于TCP的套接字,供进程向其中 注入报文,安全协议将报文加密并注入运输层套接字;或是从运输层获取加密报文,解密后交给对应的进程。严格地讲,HTTPS并不是一个单独的协议,而是对 工作在一加密连接(TLS或SSL)上的常规HTTP协议的称呼。
HTTPS报文中的任何东西都被加密,包括所有报头和荷载。除了可能的选择密文攻击之外,一个攻击者所能知道的只有在两者之间有一连接这一事实。

好吧,又多了一堆术语:SSL,TLS,不过也可以看出来HTTPS是HTTP与SSL/TLS的组合协议。
SSL: 安全套接层(Secure Sockets Layer,SSL)是一种安全协议,目的是为互联网通信,提供安全及数据完整性保障。SSL包含记录层(Record Layer)和传输层,记录层协议确定了传输层数据的封装格式。传输层安全协议使用X.509认证,之后利用非对称加密演算来对通讯方做身份认证,之后交 换对称金钥作为会谈金钥(session key)。这个会谈金钥是用来将通讯两方交换的资料做加密,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听。

SSL 在服务器和客户机两端可同时被支持,目前已成为互联网上保密通讯的工业标准。现行的Web浏览器亦普遍将HTTP和SSL相结合,从而实现安全通信。 SSL协议的优势在于它是与应用层协议独立无关的。高层的应用层协议(例如:HTTP、FTP、Telnet等等)能透明的建立于SSL协议之上。SSL 协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商以及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。

以下简要介绍SSL协议的工作方式。客户端要收发几个握手信号:
发送一个“ClientHello”消息,内容包括:支持的协议版本,比如TLS1.0版,一个客户端生成的随机数(稍后用户生成“会话密钥”),支持的加密算法(如RSA公钥加密)和支持的压缩算法。
然 后收到一个“ServerHello”消息,内容包括:确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信,一个服务器生成的随机数,稍后用于生成"对话密钥",确认使用的加密方法,比如 RSA公钥加密,服务器证书。
当双方知道了连接参数,客户端与服务器交换证书(依靠被选择的公钥系统)。这些证书通常基于X.509,不过已有草案支持以OpenPGP为基础的证书。
服务器请求客户端公钥。客户端有证书即双向身份认证,没证书时随机生成公钥。
客户端与服务器通过公钥保密协商共同的主私钥(双方随机协商),这通过精心谨慎设计的伪随机数功能实现。结果可能使用Diffie-Hellman交换,或简化的公钥加密,双方各自用私钥解密。所有其他关键数据的加密均使用这个“主密钥”。
数据传输中记录层(Record layer)用于封装更高层的HTTP等协议。记录层数据可以被随意压缩、加密,与消息验证码压缩在一起。每个记录层包都有一个Content-Type段用以记录更上层用的协议。
TLS:IETF(www.ietf.org)将SSL作了标准化,即RFC 2246,并将其称为TLS(Transport Layer Security),其最新版本是RFC 5246,版本1.2。从技术上讲,TLS1.0与SSL3.0的差异非常微小。
TLS 利用密钥算法在互联网上提供端点身份认证与通讯保密,其基础是公钥基础设施(public key infrastructure,PKI)。不过在实现的典型例子中,只有网络服务者被可靠身份验证,而其客户端则不一定。这是因为公钥基础设施普遍商业运 营,电子签名证书通常需要付费购买。协议的设计在某种程度上能够使主从架构应用程序通讯本身预防窃听、干扰(Tampering)和消息伪造。

TLS包含三个基本阶段:
对等协商支援的密钥算法
基于非对称密钥的信息传输加密和身份认证、基于PKI证书的身份认证
基于对称密钥的数据传输保密
在第一阶段,客户端与服务器协商所用密码算法。 当前广泛实现的算法选择如下:
公钥私钥非对称密钥保密系统:RSA、Diffie-Hellman、DSA;
对称密钥保密系统:RC2、RC4、IDEA、DES、Triple DES、AES以及Camellia;
单向散列函数:MD5、SHA1以及SHA256。(以上均是加密算法,有兴趣请自行google)

TLS/SSL有多样的安全保护措施:
所有的记录层数据均被编号,用于消息验证码校验。
相对而言TLS安全性更高一些,不过两者差别不大。

现在我们看到了,当使用HTTPS,传输过程中数据流始终是被强加密的(举例:facebook:与www.facebook.com采用128位加密技术。该连接采用TLS 1.2。该连接使用AES_128_GCM(迄今为止依然很可靠,极难被破解的加密算法)进行加密和身份验证,并使用ECDHE_ECDSA(迄今为止也很可靠)作为密钥交换机制。twitter:与twitter.com采用128位加密技术。该连接采用TLS 1.2。该连接使用AES_128_GCM进行加密和身份验证,并使用ECDHE_RSA(很可靠)作为密钥交换机制。google plus(所有google服务都一样): 与plus.google.com采 用256位加密技术。该连接采用TLS 1.2。该连接使用CHACHA20_POLY1305(也是让人放心的加密算法)进行加密和身份验证,并使用ECDHE_ECDSA(迄今为止也很可 靠)作为密钥交换机制。),只有本地浏览器与目标服务器知道内容,谁也没法进行数据的窃取监听。

而且HTTPS还有一个防止中间人攻击和钓鱼的机制,就是数字证书:
服务器设置
要使一网络服务器准备好接受HTTPS连接,管理员必须创建一数字证书,并交由证书颁发机构签名以使浏览器接受。证书颁发机构会验证数字证书持有人和其声明的为同一人。浏览器通常都预装了证书颁发机构的证书,所以他们可以验证该签名。
获得证书
由证书颁发机构签发的证书有免费的,也有每年收费13美元到1500美元不等的。
一个组织也可能有自己的证书颁发机构,尤其是当设置浏览器来访问他们自己的网站时(如,运行在公司或学校局域网内的网站)。他们可以容易地将自己的证书加入浏览器中。
此外,还存在一个人到人的证书颁发机构,CAcert。
作为访问控制
HTTPS也可被用作客户端认证手段来将一些信息限制给合法的用户。要做到这样,管理员通常会给每个用户创建证书(通常包含了用户的名字和电子邮件地址)。这个证书会被放置在浏览器中,并在每次连接到服务器时由服务器检查。
当私钥失密时
证 书可在其过期前被吊销,通常情况是该证书的私钥已经失密。较新的浏览器如Google Chrome、Firefox、Opera和运行在Windows Vista上的Internet Explorer都实现了在线证书状态协议(OCSP)以排除这种情形:浏览器将网站提供的证书的序列号通过OCSP发送给证书颁发机构,后者会告诉浏览 器证书是否还是有效的。

这样,当假冒的目标服务器试图与本地浏览器取得联系时,浏览器发现假冒的目标服务器没有真实有效的证书,就会拒绝 连接并爆出警告。简单来说就是小混混(黑客,GFW,有关部门)拿着伪造的学生证(伪造的数字证书)想进学校,但被门卫(浏览器的证书验证系统)发现了, 就没能进去。
对HTTPS的最简单描述:我在家(本地浏览器)把信(信息流)放在上了锁的盒子里(SSL/TLS强加密),再交由邮递员 (ISP,路由器等)送到朋友(目标服务器)手中,接收时朋友要出事身份证(数字证书),身份正确才能让朋友接收并打开盒子(解密),路上没有人能够得知 信的内容。

最后再来谈谈天朝的网站。那个抄袭facebook的(人人网,就是你!),那个抄袭twitter的(不管你是哪的微博,别 再到处看了!),以及百度贴吧(抄袭谁的?),各大BBS(你们怎么与google网上论坛这么像),qq空间,淘宝等电子商务网站,还有信箱们,你们怎 么全都不支持HTTPS?好不容易支持一下(没有默认支持HTTPS的墙内网站),还用天朝自产流氓证书CNNIC ROOT,这让我们怎么相信你?
HTTPS严重不利于共匪对广大屁民们进行监控,所以墙内网站几乎没有支持HTTPS的,所以说,墙内的社交平台都是些没骨头的货,去那发言就等于欢迎被盖世太保们监控顺便查水表。
有人曾经因为害怕而不敢翻墙,现在看到了吧?微博和twitter,哪里更危险?