https加密流程和原理

96
阿拉丁爱吃鱼
0.3 2017.03.02 17:51* 字数 6776

其实,我对https以前只有一个大概的了解,最近工作中遇到一个问题从而将https协议做了一个彻底的学习和认知,下边介绍一下我的个人认识,我不一定按照很官方的语句去表达,本人喜欢用通俗易懂的语言描述问题,目的是让人理解 那么,首先,https协议是什么,一句话,https=http+ssl安全传输协议+ca身份认证;https是http的安全版,它不仅涵盖http协议,而且加入了ssl安全加密传输协议保证数据传输的安全性,ca身份认证则验证服务器域名是否是真实可靠的

1,下面,用一幅图展示一下https建立连接的整个过程

①客户端的浏览器向服务器传送客户端SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。

②服务器向客户端传送SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。

③客户利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进行第四步。

④用户端随机产生一个用于后面通讯的“对称密码”,然后用服务器的公钥(服务器的公钥从步骤②中的服务器的证书中获得)对其加密,然后传给服务器。

⑤服务器用私钥解密“对称密码”(此处的公钥和私钥是相互关联的,公钥加密的数据只能用私钥解密,私钥只在服务器端保留。然后用其作为服务器和客户端的“通话密码”加解密通讯。同时在SSL 通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化。

⑥客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤⑤中的主密码为对称密钥,同时通知服务器客户端的握手过程结束。

⑦服务器向客户端发出信息,指明后面的数据通讯将使用的步骤⑤中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。

⑧SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。

这里有几个问题: (1)请注意第2步时,当服务器给客户端返回自己的证书时,证书包含三部分内容,公钥、名称、数字签名等信息;注意数字签名是加密的,数字签名是用颁发机构的私钥对本证书的公钥,名称以及其他信息做hash散列加密而成的,所以客户端需要解密数字签名来验证该证书是否是合法可靠的,那怎么解密呢,客户端浏览器会找到该证书的根证书颁发机构,然后在本机上的证书管理器里寻找 那些受信任的根证书颁发机构列表是否有该证书的根证书颁发机构,如果有,则用该根证书的公钥解密服务器下发的证书 a,如果不能正常解密,则服务器下发的证书则被认为是伪造的,浏览器弹出提示框 b,如果能正常解密,则获取到公钥,名称,数字签名信息跟本身的公钥等其他信息比对一下,确认公钥没有被篡改,如果公钥不一致,则依然被认为是不可信的 因此客户端验证服务器的合法性取决于公钥,而公钥的合法性取决于ca证书颁发机构的合法性,这里会形成一个信任链,而终点则是CA根证书,根证书是CA机构自己办法给自己的,根证书是一个特殊的数字证书,公钥是公开的,而私钥是被CA机构保存在硬件中的,所以证书的安全性取决于你对该CA机构的信任,反过来说,加入CA机构的密钥被窃取,那么该CA机构颁发的所有证书将会存在灾难性安全问题; 就像你验证身份证是否真实,肯定去公安局验证,那么谁来保证公安局是合法可靠的呢,没人能保证,公安局自己生命自己是合法可靠的,就这么简单 (2)ok,上边扯了那么多,无为就为了一个目的,客户端根据服务器下发的证书验证了服务器是真实可靠的,然后进入第3步,客户端生成一个密钥,就是对称加密算法的密钥用于加密后续的数据传输

总结一下,https传输在建立连接时使用的是非对称加密算法,一旦连接建立完成,有后续的通讯则使用了对称加密算法,这样做的好处是有利于数据传输效率,众所周知非对称加密算法的性能很差劲,你懂得。

2,好了,上边我们介绍了https的通信流程,那么对于https通信是否就真的很安全呢,这种协议是否有问题呢,例如服务器证书是否可以被伪造呢,客户端是否有可能被欺骗呢,答案是肯定的,我们接下来介绍几种常见的攻击手段。

1)一个合法有效的SSL证书误签发给了假冒者

这是一种由于证书认证机构工作出现疏忽、流程不完善而出现的证书被错误签发的情形。其主要原因是证书认证机构在签发SSL服务器证书前,没有认真鉴别证书申请者提交的身份信息的真伪,或者没有通过安全可靠的方式验证、确认申请者就是他提供的身份材料中所声称的那个人。比如,假冒者提供了虚假的营业执照、组织机构代码证书、域名注册文件等,      而证书认证机构没有或没能够鉴别出假冒者提供的身份信息的真伪,把一个合法有效的证书签发给了假冒者;再比如,假冒者向证书认证机构提交了其他网站拥有者的有效身份资料,如营业执照、组织机构代码证、域名注册文件(这些资料,假冒者有时可通过合法的途径获得),而证书认证机构没有通过安全、可靠的途径验证、确认证书申请者确实是其声称的人        本人(或声称的机构本身),把本属于另一个合法有效的网站的服务器证书签发给了假冒网站。无论何种情形,假冒者都可以利用用户对服务器证书的信任进行网络欺诈活动。

2)破解SSL证书签发CA的私钥

如果SSL证书签发CA的密钥对的安全强度不够(密钥长度太短),或者是一个弱密钥对,或者其产生方式有规律可循(不是完全随机产生的),那么,就可能造成CA私钥被破解,假冒者就可以用被破解的CA的私钥生成、签发合法、有效的SSL服务器证书。

但在实际中,只要CA的密钥对有足够的长度、按完全随机的方式产生、且避开弱密钥对,则CA的私钥是根本无法破解的,或者破解的成本极高,完全超过了破解可能带来的好处。

3)SSL证书签发CA的私钥泄露

证书认证机构由于管理不善,或者使用了不安全的密码设备,导致签发SSL证书的CA私钥被泄露,从而使得假冒者可以利用它签发合法有效的SSL证书。

这种情况可以通过加强认证机构的安全管理,使用安全可靠的密码设备来避免。

4)破解SSL证书的私钥

目前的SSL证书主要是基于RSA公开密钥算法,对这个算法的攻击目前除了蛮力攻击外,还没有有效的方法。但是,如果SSL证书密钥对的安全强度不够(密钥长度不够),或者是一个弱密钥对,或者其产生方式不是完全随机的,那么,就可能造成SSL证书的私钥被破解,假冒者就可以将该SSL证书及其被破解的私钥安装在假冒网站上进行欺诈活动(SSL证书本身是公开的,可以很容易地得到)。

在实际应用中,只要SSL证书密钥对有足够的长度、按完全随机的方式产生、且避开弱密钥对,则SSL证书的私钥是根本无法破解的,或者破解的成本极高,完全超过了破解可能带来的好处。

在讨论、分析SSL证书私钥破解的风险时,我们需要提到一个人们常常关心的问题。我们知道,出于管理的规范性、品牌、知名度等原因,目前国内  的SSL证书主要由国外的认证机构签发,对此,人们会有这种疑问和担心,“如果SSL证书由国外认证机构签发,那么,是否会导致SSL证书的密钥  对容易被国外敌对机构破解、或窃取”?要回答这个问题,我们必须先了解SSL证书的密钥对是怎样产生的,以及私钥是怎样保存的。

实际上,SSL证书的密钥对是由网站拥有者通过Web服务器软件自己产生并保存在Web服务器软件的密钥库中,或者在Web服务器软件使用的SSL加速卡(加密硬件)中产生并保存在加密硬件中;客户申请签发SSL证书时,证书请求中只包含有公钥,不包含私钥,私钥是不会传送到证书认证机构的。因此,SSL证书的密钥对是否会被破解完全取决于密钥对的长度是否足够长、产生的密钥对是否是弱密钥对、以及密钥对的产生是否有规律可循(即是否是完全随机产生的),与SSL证书是由国内还是国外认证机构签发的没有关系;私钥是否会被窃取、泄露,完全取决于SSL证书客户采取的私钥保护安全措施。当然,从阴谋论的角度,由于目前的Web服务器软件大多来自国外,它们留有后门,从而产生弱密钥对,或者留有后门,使得密钥对的产生有规律可循,这也是可能的,但这与SSL证书是由国内还是国外认证机构签发的没有关系。

5)SSL证书的私钥泄露

SSL证书的私钥通常是安装在Web服务器上的,如果没有采取足够的安全措施对私钥进行安全保护,则有可能导致私钥被泄露,比如,从Web服务器中导出。

在实际中,只要通过适当的安全管理措施和技术手段,就能有效地防止SSL证书的私钥被泄露。比如,只允许安全可信的人员访问Web服务器并采取双人(或多人)控制的访问方式,并禁止SSL证书私钥导出,或者给SSL证书私钥加上口令保护且对口令进行分割保存(将口令分割给多个可信人员,每个人仅拥有分割后口令的一部分),又或者将SSL证书私钥存放在加密硬件中(如SSL硬件加速器),且对私钥采取安全保护措施(如不允许私钥导出,或不允许私钥明文导出)。

6)伪造一个合法有效的SSL证书

即假冒者通过一定的技术手段,利用证书技术本身存在漏洞,伪造一个由某个认证机构签发的、有效的SSL证书。这个伪造SSL证书的格式符合X509规范,它的签发者指向该认证机构(的某个CA证书),且该SSL证书的数字签名可由该认证机构(对应CA证书)的公钥验证。

虽然,有研究者声称可以伪造一个X509数字证书,但真实的情况是,到目前为止,并没有人能够伪造一个实际可用的、有效的数字证书。

7)认证机构主动为假冒网站签发合法有效的服务器证书

这种情况在两个国家处于敌对状态时有可能发生。假设A国家的某个认证机构签发的证书被B国家的用户信任(由于该认证机构的根证书预埋在B国家用户使用的操作系统、应用软件中),而这时,A国和B处于敌对、甚至战争状态,A国家政府为了扰乱B国的金融秩序,要求该国的认证机构签发假冒B国银行网站的SSL证书,而A国的认证机构从国家利益考虑,遵从本国政府的要求,为该国政府建立的假冒网站签发“合法、有效的”假冒SSL证书。这里说它“合法、有效”,是因为当B国用户使用浏览器访问该假冒网站时,浏览器对该SSL证书的信任验证是获得通过的。

这时,假冒网站的域名有两种可能情形:第一种是,该网站域名与被假冒网站的域名相似但不同,用户没有注意到这些细小的差异,从而访问了假冒网站。对于这种情况,由于域名不同,因此,细心的用户有可能识破假冒行为。第二种是,假冒网站的域名同被假冒网站的域名完全相同。在这种情况下,如果A国控制了域名服务体系的“根”域名服务器,那么,A国是可以通过修改域名解析记录,将B国用户引导到A国建立的假冒网站上的,而且B国用户丝毫察觉不到这种改变。这种假冒,比第一种情况要难识破、难防范得多。目前全球共13台根域名服务器,分布情况是:主根服务器(A)1个,设置在美国弗吉尼亚州的杜勒,辅根服务器(B至M)美国9个,瑞典、荷兰、日本各1个。考虑到目前的根域名服务器,都部署在西方国家,且主要在美国,而且“主根”域名服务器也在美国,因此,这是一个我们需要重视的问题和风险。

需要特别指出的是,出现这种假冒,与B国银行网站本身安装的服务器证书由谁签发无关。因为对SSL服务器证书的信任是由浏览器根据其信任的根CA证书自动做出判断的,在这个过程中用户并不介入;只要浏览器验证该SSL证书的信任路径链接到一个可信任根CA证书,浏览器就不提出警告信息,用户就会认为这个SSL证书是可信的。因此,只要B国用户的主机操作系统(如Windows)、应用程序(如Firefox)中预置A国认证机构的可信根CA证书,那么,即使B国的银行网站的服务器证书是由该国自身的认证机构签发,A国仍然可通过A国的认证机构签发针对B国网站的“合法、有效”的假冒SSL证书,安装在假冒网站上。当B国用户访问假冒网站时,骗过B国用户的浏览器对该SSL证书的可信性、有效性验证,由于普通用户通常是不会关心所访问网站的SSL证书是由哪个认证机构签发的(普通用户不会也不知道 在浏览器完成SSL证书验证后,可查看要访问网站的SSL证书的详情),从而骗得B国用户对假冒网站的信任。

我国目前的主机操作系统、浏览器绝大部分是国外的,其中预埋了大量的根CA证书,且绝大部分是国外认证机构的,而且考虑到域名系统的“根”也在国外,因此,这一问题需要引起我们的高度重视。但是,我们也可以看到,要彻底解决这个问题,必须从操作系统、应用软件、域名体系整个一起来考虑、解决,仅靠限定国内认证机构签发SSL证书是无法解决这个问题的。

8)利用可信的SSL服务器证书进行中间人攻击

假设攻击者通过某种途径获得了一个与某网站域名完全相同的SSL证书,且该SSL证书(的根CA证书)被用户的浏览器信任,即从证书验证的角度它是一个“合法、有效”的证书,则该攻击者就有可能在位于用户与网站之间的网络通路上,进行中间人攻击,窃取用户的私密信息(如图2所示)。这种攻击的具体实施方法如下:

(1) 攻击者通过在网络通路上安装特殊的设备,或者攻破、控制网络通信设备(如路由器、交换机等),在其上面安装的特殊的处理代码;

(2) 然后,攻击者拦截所有连接到该网站的网络连接请求,利用他得到的SSL服务器证书,假冒网络站点与客户端浏览器进行身份鉴别和建立SSL安全通道的操作;

(3) 同时,攻击者又假冒用户同安装了一个SSL服务器证书的网站建立SSL连接;

(4) 之后,攻击者作为用户和网站之间的中间人,拦截、转发二者之间传送的数据,并同时窃取用户的敏感信息。

由于攻击者使用的SSL证书是被用户浏览器信任的,因此,用户不会察觉到这中间人的活动。

图2利用可信的SSL服务器证书进行中间人攻击

这里,攻击者可通过前面1)至7)所列的方式获得一个与被窃听网站域名相同的SSL证书;或者,攻击者也可以由于8)中所述的国家与国家之间网络战争的原因,从某个被用户信任的证书认证机构获得用于中间人攻击的“合法、有效的”SSL证书。

与8)中所述的情形类似,要进行这样的攻击,只需要这个用于中间人攻击的SSL证书是被用户浏览器信任的即可,不需要该SSL证书与被窃听的网站本身安装的SSL证书由同一个认证机构签发。这意味着,即使我们限定国内网站的SSL证书必须由国内证书认证机构签发,其他国家仍然可以利用他们自己国家证书认证机构签发的、用于假冒国内网站的SSL证书,对国内网站进行中间人攻击。因为,我国用户使用的操作系统、浏览器都预埋了大量的国外证书认证机构的根CA证书,这些根CA证书被浏览器认为是可信的。因此,在它们之下签发的SSL证书都被浏览器认为是“合法的、有效的、可信的”。

9)在用户主机中植入伪造的根CA证书(或一个完整的CA证书链)

从前面的介绍我们知道,SSL服务器证书是否可信,是由浏览器通过调用本地的加密服务接口(如CryptoAPI、PKCS#11),检验、确认服务器证书的信任链(证书路径)是否链接到本地证书库中的一个信任的CA根证书。因此,网站假冒者、中间人攻击者只要设法将一个伪造的根CA证书  (或一个完整的、伪造的CA证书链)植入到用户计算机的操作系统、浏览器证书库中,则在这个伪造的根CA证书下,网站假冒者、中间人攻击者可签发任何他想签发的、并被浏览器信任的假冒SSL证书。而且,假冒者、中间人攻击者甚至可以将这个伪造的根CA证书以及它的下级CA证书中的CA认证机构的名称,取的与一个合法认证机构的名称相同,这将更有欺骗性,用户更难识破。

植入伪造的根CA证书(及其下级CA证书)的方式有两种,一是,通过挂马、病毒传播,这是普通的假冒者、攻击者就可以做到的;二是,在操作系统、应用软件(如浏览器)中预置。第二种方式之所以有可能成立,是因为目前国内的操作系统、应用软件绝大多数来自国外,在特殊情况下,国外的操作系统、应用软件的厂家是有可能根据本国政府的要求,将伪造其他国家证书认证机构的根CA证书预置到操作系统、应用软件的可信根CA证书库中的,甚至可以做到,通过通常的人机接口(如IE浏览器)无法查看到该伪造的根CA证书,而当应用程序(如浏览器)通过加密接口(如CryptoAPI、PKCS#11)验证SSL证书的信任链时,该伪造的根CA证书又起作用、被信任。

10)旁路证书可信性的验证

当操作系统、浏览器本身存在后门时,是完全可以做到旁路对某些特定的SSL证书(如某个特定的、伪造的CA签发的SSL证书)的可信性检验,使得这些SSL证书总是作为可信的证书被浏览器接受。这样,假冒者、中间人攻击者可以利用这个后们,签发假冒的、被客户端浏览器信任的SSL证书,达到窃取用户信息的目的。

对SSL证书可信性验证的旁路既可以在操作系统层面(如密码模块层)发生,也可以在浏览器层面发生。这个后门既可能是操作系统、浏览器厂家自己故意留下的(比如根据本国政府的要求),也可能是由于感染了木马、病毒,使得操作系统、浏览器的程序代码被修改而造成的。

我想到了cnnic的证书风波,被chrome和firefox声明,将不信任该机构颁发的所有证书,唉,真悲剧,所以我觉得根证书颁发机构应该是一个非盈利组织,他不应该跟任何盈利性企业有利益关系,这种组织才有资格去颁发证书,否则有利益关系就容易合作去做坏事,但这个问题怎么说好呢,由于申请一个证书或者一堆证书,往往也需要不少钱,所以国内很多公司,例如中国移动,电信,银行以及支付宝,他会在你安装软件的时候,给你系统里安装他自己颁发的根证书,这样他就可以给自己服务器上按自己办法给自己的证书,而你的客户端将信任他,包括很多内网的https也都是自己给自己颁发证书的

iOS