一、什么是HTTPS
在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。SSL目前的版本是3.0,被IETF(Internet Engineering Task Force)定义在RFC 6101中,之后IETF对SSL 3.0进行了升级,于是出现了TLS(Transport Layer Security) 1.0,定义在RFC 2246。实际上我们现在的HTTPS都是用的TLS协议,但是由于SSL出现的时间比较早,并且依旧被现在浏览器所支持,因此SSL依然是HTTPS的代名词,但无论是TLS还是SSL都是上个世纪的事情,SSL最后一个版本是3.0,今后TLS将会继承SSL优良血统继续为我们进行加密服务。目前TLS的版本是1.2,定义在RFC 5246中,暂时还没有被广泛的使用。
对历史感兴趣的朋友可以参考http://en.wikipedia.org/wiki/Transport_Layer_Security,这里有对TLS/SSL详尽的叙述。
二、HTTPS到底安全吗?
这个答案是肯定的,很安全。谷歌公司已经行动起来要大力推广HTTPS的使用,在未来几周,谷歌将对全球所有本地域名都启用HTTPS,用户只要在搜索前用Google帐号登录,之后所有的搜索操作都将使用TLS协议加密,见:http://thenextweb.com/google/2012/03/05/google-calls-for-a-more-secure-web-expands-ssl-encryption-to-local-domains/。
三、HTTPS的工作原理
HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称加密,对称加密以及HASH算法。握手过程的简单描述如下:
1.浏览器将自己支持的一套加密规则发送给网站。
2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
3.获得网站证书之后浏览器要做以下工作:
a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
c) 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
4.网站接收浏览器发来的数据之后要做以下的操作:
a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
b) 使用密码加密一段握手消息,发送给浏览器。
5.浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。另外,HTTPS一般使用的加密与HASH算法如下:
非对称加密算法:RSA,DSA/DSS
对称加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256
其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性。由于浏览器生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄漏。
TLS握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。正是由于HTTPS非常的安全,攻击者无法从中找到下手的地方,于是更多的是采用了假证书的手法来欺骗客户端,从而获取明文的信息,但是这些手段都可以被识别出来,我将在后续的文章进行讲述。不过2010年还是有安全专家发现了TLS 1.0协议处理的一个漏洞:http://www.theregister.co.uk/2011/09/19/beast_exploits_paypal_ssl/,实际上这种称为BEAST的攻击方式早在2002年就已经被安全专家发现,只是没有公开而已。目前微软和Google已经对此漏洞进行了修复。见:http://support.microsoft.com/kb/2643584/en-us https://src.chromium.org/viewvc/chrome?view=rev&revision=90643
四、SSL证书
HTTPS核心的一个部分是数据传输之前的握手,握手过程中确定了数据加密的密码。在握手过程中,网站会向浏览器发送SSL证书,SSL证书和我们日常用的身份证类似,是一个支持HTTPS网站的身份证明,SSL证书里面包含了网站的域名,证书有效期,证书的颁发机构以及用于加密传输密码的公钥等信息,由于公钥加密的密码只能被在申请证书时生成的私钥解密,因此浏览器在生成密码之前需要先核对当前访问的域名与证书上绑定的域名是否一致,同时还要对证书的颁发机构进行验证,如果验证失败浏览器会给出证书错误的提示。在这一部分我将对SSL证书的验证过程以及个人用户在访问HTTPS网站时,对SSL证书的使用需要注意哪些安全方面的问题进行描述。
五、证书的类型
实际上,我们使用的证书分很多种类型,SSL证书只是其中的一种。证书的格式是由X.509标准定义。SSL证书负责传输公钥,是一种PKI(Public Key Infrastructure,公钥基础结构)证书。
我们常见的证书根据用途不同大致有以下几种:
1、SSL证书,用于加密HTTP协议,也就是HTTPS。
2、代码签名证书,用于签名二进制文件,比如Windows内核驱动,Firefox插件,Java代码签名等等。
3、客户端证书,用于加密邮件。
4、双因素证书,网银专业版使用的USB Key里面用的就是这种类型的证书。
这些证书都是由受认证的证书颁发机构——我们称之为CA(Certificate Authority)机构来颁发,针对企业与个人的不同,可申请的证书的类型也不同,价格也不同。CA机构颁发的证书都是受信任的证书,对于SSL证书来说,如果访问的网站与证书绑定的网站一致就可以通过浏览器的验证而不会提示错误。
六、SSL证书申请与规则
SSL证书可以向CA机构通过付费的方式申请,也可以自己制作。
CA机构颁发的证书价格非常昂贵,而且有效期一般只有一年到三年不等(年数不同,价格也不同),过期之后还要再次交钱申请,因此一般只有企业才会申请证书。但是随着个人网站的增多,目前也有针对个人的SSL证书服务,价格相对便宜一些,国内的话400多块钱就能申请到一个,国外更是有免费的SSL证书可以申请。
在申请SSL证书时需要向CA机构提供网站域名,营业执照,以及申请人的身份信息等。网站的域名非常重要,申请人必须证明自己对域名有所有权,如果支持Hotmail.com,Gmail.com的SSL证书都可以随便申请,黑客们就不用做假证书欺骗了。此外,一个证书一般只绑定一个域名,如果CA机构心情好的话,会免费再绑一个,比如你要申请域名时绑定的域名是guokr.com,那么只有在浏览器地址是https://guokr.com的时候,这个证书才是受信任的,如果地址是https://www.guokr.com或者https://login.guokr.com,那么这个证书由于访问的域名与证书绑定的域名不同,仍然会被浏览器显示为不受信任的。CA机构也提供申请通配符域名(例如,*.guokr.com),通配符域名相当于绑定了主域名下的所有域名,因此使用起来非常方便,但是价格也超级昂贵,一个通配符域名一年大概得5000块钱,只有企业才可以申请。
下面就来看看一个证书的信息:
在访问hotmail的时候会跳转到login.live.com,这时IE浏览器上会有一个小锁头,点一下那个小锁头再点击里面的“查看证书”就会出现上图的证书窗口,这里面我们可以看到这个证书只有一个用途——向远程计算机证明身份信息,证书的用途会有很多,SSL只是其中之一。在“颁发给”这一项就是这个证书在申请时绑定的域名;下面的“颁发者”是证书的颁发机构。最下面的两个日期是证书申请时间以及过期的时间。这里我们可以注意一下“颁发者”的信息,里面有“Extended Validation SSL”的字样,表明了这个证书是一个EV SSL证书(扩展验证SSL证书),EV SSL证书有个特点就是可以让浏览器的地址栏变绿,同时显示出来证书所属公司的名称,如下图所示:
EV SSL证书与其他的证书相比,费用更高。
以上说的是向CA机构申请证书的情况,如果个人网站只为加密传输也可以自己制作SSL证书,自己制作的证书不会受到浏览器的信任,在访问的时候由于证书验证失败而给出警告。
七、证书的验证过程
证书以证书链的形式组织,在颁发证书的时候首先要有根CA机构颁发的根证书,再由根CA机构颁发一个中级CA机构的证书,最后由中级CA机构颁发具体的SSL证书。我们可以这样理解,根CA机构就是一个公司,根证书就是他的身份凭证,每个公司由不同的部门来颁发不同用途的证书,这些不同的部门就是中级CA机构,这些中级CA机构使用中级证书作为自己的身份凭证,其中有一个部门是专门颁发SSL证书,当把根证书,中级证书,以及最后申请的SSL证书连在一起就形成了证书链,也称为证书路径。在验证证书的时候,浏览器会调用系统的证书管理器接口对证书路径中的所有证书一级一级的进行验证,只有路径中所有的证书都是受信的,整个验证的结果才是受信。我们还是以login.live.com这个证书举例,在查看证书的时候,点击“证书路径”标签就会有下图的显示:
根证书是最关键的一个证书,如果根证书不受信任,它下面颁发的所有证书都不受信任。操作系统在安装过程中会默认安装一些受信任的CA机构的根证书,可以在“运行”里面运行“certmgr.msc”启动证书管理器,如下图所示:
根证书的有效期长,支持的用途多以方便颁发不同用途类型的中级证书;中级证书用途单一,有效期相对短一些,但是比具体的SSL证书要长很多。
如果SSL证书验证失败根据浏览器的不同会有以下的错误提示:
SSL证书验证失败有以下三点原因:
1、SSL证书不是由受信任的CA机构颁发的
2、证书过期
3、访问的网站域名与证书绑定的域名不一致
这三点原因也是IE浏览器给出的提示。
小提示:如果你对哪个根证书CA机构比较憎恨,可以将它的根证书删除,这样所有它颁发的证书都不会受信任。
八、SSL证书的安全问题
对HTTPS最常见的攻击手段就是SSL证书欺骗或者叫SSL劫持,是一种典型的中间人攻击。不过SSL劫持并非只是用于攻击目的,在一些特殊情况下利用SSL劫持我们可以更顺畅的访问网络,我会在后文提到。
以攻击为目的的SSL劫持如果不注意浏览器安全提示的话,很容易就中招。当网络中有中间人发起SSL劫持攻击时,攻击者需要伪造一个SSL证书发给浏览器,这个时候由于伪造的SSL证书不受信任,浏览器会给出提示。
这里有一个误区,当SSL证书不受信任的时候,并不一定就是有SSL劫持发生,有种例外情况是:一些个人网站买不起合法的SSL证书,因此会自己制作一个SSL证书来加密传输的数据。如果你经常访问某个个人网站,而且你知道这个网站是干什么的,那么这种情况可以不用担心。但是如果你访问的是网银,在线支付,或者是hotmail.com,gmail.com等,这类公司性质的网站一定会申请合法的SSL证书(12306.cn除外),一旦SSL证书不受信任,应该果断的终止访问,这个时候网络中一定会存在异常行为,对于一些小区宽带的用户一定要注意这点。
所以作为个人用户,你一定要知道你访问的是什么网站,如果你只是一个没有多少计算机只是的普通网民,我相信你不会经常上那些自己制作SSL证书的个人网站(12306.cn除外),因此如果你没有办法判断网络是不是有异常,只要是证书有问题的,干脆就别再访问了。
小提示:对于12306.cn,一定要按照网站说的那样,“为保障您顺畅购票,请下载安装根证书”。
最后我们总结一下使用SSL证书要注意的问题:
1、除非必要,不要随意安装根证书。安装根证书的时候一定要明确证书的来源。
2、对于网银,在线支付,重要邮箱等网站,一定要确保SSL证书是没有问题的,如果浏览器给出SSL证书错误的警告,一定要拒绝访问。一些小区宽带用户一定要注意这点。
3、由于现在个人申请SSL证书比较便宜,一定要注意挂着合法SSL证书的钓鱼网站(国外比较常见)。对于钓鱼网站,一定要看清域名,另外别相信什么中奖的消息,同时要安装带有钓鱼防护功能的安全软件。
相关推荐
然而,由于开发者对HTTPS理解不足,时常出现未验证证书的情况,从而为“中间人攻击”提供了可乘之机。本文旨在深入探讨HTTPS的工作原理,尤其是握手过程、中间人攻击的常见场景,以及证书校验的修复方案,以帮助读者...
NULL 博文链接:https://jxauwxj.iteye.com/blog/2355990
《深入理解Nginx》是陶辉编著的一本关于Nginx服务器的高级技术书籍,主要面向已经对Nginx有一定基础了解的读者。在深入探讨Nginx的2版本中,作者详细阐述了Nginx的核心特性和最新发展,帮助读者提升对Nginx的掌握...
博文链接:https://hidefromall.iteye.com/blog/219680
上面代码运行结果图片 博文链接:https://gml520.iteye.com/blog/142157
《深入理解ANDROID 卷三》是一本专门为Android开发者和爱好者准备的专业书籍,旨在深度剖析Android系统的内部工作机制,帮助读者提升对Android平台的理解和应用能力。这本书的高清PDF版本经过精心修复,确保了书签的...
通过设计、编制、调试一个 WHILE 循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。 首先写出一个能识别 while 循环语句的文法,通过求出其文法的...
8. 实战项目:通过一个完整的实战项目,读者可以将所学知识应用到实际场景中,加深对Flask的理解。 阅读《深入理解Flask》这本书,不仅可以掌握Flask框架的基本用法,还能了解到Web开发的最佳实践,对于想要提升...
本资源是对 MDETR 论文的翻译及理解,内含论文原文以及翻译的 pdf 。 多模态推理系统依靠预先训练的⽬标检测器从图像中提取感兴趣的区域。然⽽,这个关键模块通常⽤作⿊匣⼦,独⽴于下游任务并在对象和属性的固定...
《深入理解Android卷12》是一套专门为Android开发者和系统工程师量身打造的专业技术书籍,旨在帮助读者深入了解Android系统的架构、工作原理以及底层机制。这套书籍分为两卷,分别是《深入理解Android 卷1》和《深入...
此外,还会有对URL重写、SSL/TLS安全通信、限速策略等内容的讨论,帮助读者提升网站的安全性和性能。 书中的“文字版”和“书签版”特性意味着读者可以方便地搜索和导航,高效学习。高清版则确保了文字的清晰度,...
iOS系统对HTTPS证书链的验证涉及一系列复杂的步骤,以确保数据传输的隐私和完整性。首先,我们来深入理解HTTPS的基本原理。 HTTPS,全称为“超文本传输安全协议”,是HTTP协议的安全版本,它基于TLS/SSL(传输层...
通过对开源项目源码的阅读和理解,可以深入了解软件的设计理念和实现细节,这对于提升编程技能和解决问题的能力非常有帮助。虽然具体源码分析的内容未在描述中给出,但读者可以通过阅读相关资料来深入研究Nginx和...
- **查询解析器**:MySQL接收SQL查询后首先对其进行语法分析和语义分析,然后将查询转换为执行计划。 - **执行计划**:执行计划定义了如何执行查询的步骤。MySQL优化器负责生成最佳执行计划,包括选择合适的索引、...
Nginx的核心组件包括主进程、工作进程、事件处理器和模块,这些组件协同工作,实现了对HTTP、HTTPS、SMTP、IMAP/POP3等协议的支持。理解这些组件的交互方式对于优化Nginx配置和开发新模块至关重要。 在模块开发方面...
尽管HTTPS抓包浏览器提供了强大的功能,但使用时需谨慎,因为它可能违反了用户的隐私,尤其是在未告知的情况下对他人数据进行抓包。因此,在合法和合规的前提下使用此类工具是非常重要的。 在提供的压缩包文件...
这本书的源代码包含了丰富的示例和实践项目,旨在通过实际操作来加深对理论知识的理解。以下是根据书名和描述所涉及的一些关键知识点: 1. **Android网络层次结构**:在Android系统中,网络通信是基于Java网络库...
在Android开发中,对系统底层的理解是提升应用性能和用户体验的关键。本书首先会讲解Android应用程序的基本架构,包括组件模型(Activity、Service、BroadcastReceiver、ContentProvider)以及它们之间的交互机制。...
总的来说,《HTTPS权威指南》是深入理解和实践HTTPS的必备参考书,无论你是开发者、系统管理员还是网络安全专家,都能从中受益匪浅。通过阅读本书,你可以全面掌握HTTPS的工作机制,提高你的网络安全意识,并能够...