当前位置: 首页 > 科技观察

HTTPS科普扫盲,看过的人都豁然开朗!

时间:2023-03-16 12:32:01 科技观察

为什么需要HTTPSHTTP是明文传输的,也就是说发送方和接收方之间的任何一个节点都可以知道你传输的内容是什么。这些节点可能是路由器、代理等。举一个最常见的例子,用户登录。用户输入帐号和密码,如果使用HTTP,只要在代理服务器上做一些小动作,就可以获得密码。用户登录-->代理服务器(手脚)-->实际授权服务器在发送端加密密码?没用的,虽然别人不知道你原来的密码是多少,但是你可以拿到加密后的账号密码,照样可以登录。HTTPS是怎么保证安全的?HTTPS其实就是securehttp的意思,是HTTP安全的升级版。对网络基础稍有了解的同学都知道,HTTP是一个应用层协议,HTTP协议之下是传输协议TCP。TCP负责传输,HTTP定义数据如何打包。HTTP-->TCP(明文传输)HTTPS和HTTP有什么区别?其实就是在HTTP和TCP之间加了一层额外的加密TLS/SSL。什么是TLS/SSL?通俗地说,TLS和SSL其实是类似的东西。SSL是负责加密HTTP数据的加密套件。TLS是SSL的升级版本。现在提到HTTPS,密码套件基本上就是指TLS。传输加密的过程以前是应用层直接把数据发给TCP传输,现在改为应用层把数据发给TLS/SSL,加密数据,再发给TCP传输。大致如图所示。就是这样。在传输前对数据进行加密,而不是让数据以明文的形式裸奔在复杂危险的网络上,很大程度上保证了数据的安全。这样即使数据被中间节点截获,坏人也无法读取。HTTPS是如何加密数据的了解安全或密码学基础知识的同学应该知道常见的加密方式。一般来说,加密分为对称加密和非对称加密(也叫公钥加密)。对称加密对称加密是指用于加密数据的密钥与用于解密数据的密钥相同。对称加密的优点是加密和解密效率通常比较高。缺点是数据发送方和数据接收方需要协商共享同一个密钥,并保证密钥不泄露给他人。另外,对于需要交换数据的多个个体来说,需要在两者之间分配和维护一个密钥,由此带来的成本是基本无法接受的。非对称加密非对称加密是指用于加密数据的密钥(公钥)与用于解密数据的密钥(私钥)不同。什么是公钥?其实就是字面上的意思,公钥谁都能查到。因此,非对称加密也称为公钥加密。相应的,私钥是非公钥,一般由网站管理员持有。公钥和私钥之间有什么联系?简单的说,用公钥加密的数据,只有用私钥才能解密。用私钥加密的数据只能用公钥解密。很多同学都知道私钥可以用来解密公钥加密的数据,但是他们忽略了一点,私钥加密的数据也可以用公钥解密。而这对于理解HTTPS的整个加密和授权体系是非常关键的。举个非对称加密的例子登录用户:小明授权网站:某知名社交网站(以下简称XX)小明是某知名社交网站XX的用户,XX在出于安全原因登录的地方。小明在登录界面输入账号和密码,点击“登录”。于是,浏览器使用公钥加密了小明的账号密码,并向XX发送了登录请求。XX的登录授权程序通过私钥对账号和密码进行解密,验证通过。之后小明的个人信息(包括隐私)用私钥加密后回传给浏览器。浏览器通过公钥解密数据显示给小明。第一步:小明输入账号密码-->浏览器用公钥加密-->向XX发送请求第二步:XX用私钥解密,验证通过-->获取小明的社交数据,用私钥加密-->浏览器公钥解密数据并显示。非对称加密能否解决数据传输安全问题?前面特别强调过,用私钥加密的数据可以用公钥解锁,公钥是加密的。也就是说,非对称加密只能保证单向数据传输的安全。此外,还有如何分发/获取公钥的问题。这两个问题将在下文进一步讨论。公钥加密:两个明显的问题。前面提到了小明登录社交网站XX的例子,提到了单纯使用公钥加密有两个明显的问题。如何获取公钥数据传输只是单向的安全问题1:如何获取公钥浏览器如何获取XX的公钥?当然,小明可以自己上网查,XX也可以把公钥贴在自己的主页上。但是,对于一个动辄上千万次成败的社交网站来说,会给用户带来极大的不便。毕竟,大多数用户并不知道什么是“公钥”。问题二:数据传输只有单向安全。如前所述,只有私钥才能解开公钥加密的数据。所以,小明的账号和密码是安全的,也不怕中途被截取。那么就有一个很大的问题:用私钥加密的数据也可以用公钥解密。另外,公钥是公开的,小明的私人数据相当于换一种方式裸奔上网。(中间代理服务器拿到公钥后,就可以毫不犹豫的解密小明的数据了。)下面分别对这两个问题进行解答。问题一:如何获取公钥这里涉及到两个非常重要的概念:证书和CA(CertificateAuthority)。证书可以暂时理解为网站的身份证。这张身份证包含了很多信息,包括上面提到的公钥。也就是说,小明、小王、小光等用户访问XX时,不再需要满世界寻找XX的公钥。当他们访问XX时,XX会把证书发给浏览器,告诉他们说,好,用里面的公钥加密数据。这里有个问题,所谓的“证书”从何而来?这就是下面提到的CA所负责的。CA(CertificateAuthority)强调两点:可以颁发证书的CA有很多(国内外都有)。只有少数CA被认为是权威和公正的,这些CA颁发的证书被浏览器认为是可信的。比如威瑞信。(CA伪造自己的证书的情况并不少见。。。)证书颁发的细节这里就不展开了。可以简单理解为网站向CA提交申请。CA审核通过后,向网站颁发证书。用户访问网站时,网站会将证书交给用户。至于证书的具体内容,后面也会提到。问题二:数据传输只是单向安全的前文提到,私钥加密的数据可以通过公钥解密还原。那么,这是否意味着网站传输给用户的数据不安全呢?答案是:是的!!!(三个感叹号代表强调的立方体。)看到这里,你心里可能会想:用HTTPS,数据还是裸奔,这么不靠谱,还不如直接用HTTP省事。然而,为什么业界对基于HTTPS的网站的呼声越来越高呢?这显然有悖于我们的感性认识。因为:HTTPS虽然采用了公钥加密,但是它也结合了其他的手段,比如对称加密,保证了授权和加密传输的效率和安全。简而言之,整个简化的加密通信过程就是:小明访问XX,XX把自己的证书给小明(其实是给浏览器的,小明是不会感知的)浏览器从XX那里得到XX的公钥证书A浏览器生成一个只有自己的对称密钥B,用公钥A加密,传给XX(其实有协商过程,这里为了理解简化)XX通过私钥解密key并得到对称密钥B浏览器与XX之间的数据通信是用密钥B加密的注意:对于每一个访问XX的用户,生成的对称密钥B理论上是不同的。例如,小明、小王、小广可能生成B1、B2、B3。参考下图:(附上原图出处)证书可能存在哪些问题了解了HTTPS加密通信的过程后,对于数据裸奔的疑虑应该基本打消了。不过,细心的观众可能还有一个疑问:如何保证证书合法有效?证书不合法可能有两种情况:证书是伪造的:CA颁发的证书没有被篡改:比如XX网站的公钥被替换。比如:我们知道这个世界上有一种叫做代理的东西。所以,有可能小明登录上面的XX网站是这样的。小明的登录请求首先到达代理服务器,代理服务器将请求转发给授权服务器。小明-->邪恶代理服务器-->登录授权服务器小明<--邪恶代理服务器<--登录授权服务器那么,这个世界上坏人太多了。有一天,代理服务器出了个坏主意(也可能是被黑了),截获了小明的请求。此外,还返回了无效的证书。小明-->邪恶代理服务器--x-->登录授权服务器小明<--邪恶代理服务器--x-->登录授权服务器如果善良的小明相信这个证书,他会再次裸奔。当然不可能是这样的,那,用什么机制来防止这样的东西被放出来。接下来我们看看“证书”的内容,就可以大致猜出如何防范了。证书介绍在正式介绍证书的格式之前,先插入一个小广告,普及一下数字签名和摘要,然后对证书做一个不深入的介绍。为什么?因为数字签名和摘要是证书防伪的关键武器。数字签名和摘要简单来说,“摘要”就是对传输的内容通过哈希算法计算出一个固定长度的字符串(是不是让你想起了文章摘要)。然后,用CA的私钥对摘要进行加密,加密后得到的结果就是“数字签名”。(这里说的是CA的私钥,后面会介绍)明文-->哈希运算-->抽象-->私钥加密-->数字签名结合上面的内容,我们知道这个数字签名只有CA密钥的公钥才能解密。接下来,我们就来看看这个神秘的“证书”包含哪些内容,再大致猜猜如何防止非法证书。有关数字签名和摘要的更多信息,请参阅本文。证书格式先不要脸贴一大段内容。证书格式来自这篇好文章《OpenSSL 与 SSL 数字证书概念贴》。内容本身的数字签名(用CA私钥加密)证书持有者的公钥证书签名中使用的哈希算法另外需要补充一点,就是:CA本身有自己的证书,它江湖人称之为“根证”。这个“根证书”是用来证明CA的身份的,本质上是一个普通的数字证书。浏览器通常具有大多数主要权威CA的内置根证书。证书格式1.证书版本号(Version)版本号表示X.509证书的格式版本。当前值可以是:1)0:v12)1:v23)2:v3也为以后的版本保留定义2.证书序列号(SerialNumber)序列号指定分配给证书的唯一“数字标识符”CA颁发的证书。当一个证书被吊销时,这个证书的序列号实际上被放入了由CA签署的CRL中,这就是序列号唯一的原因。3.签名算法标识符(SignatureAlgorithm)签名算法标识符用于指定CA颁发证书时使用的“签名算法”。算法标识符用于指定颁发证书时使用的CA:1)公钥算法2)哈希算法示例:sha256WithRSAEncryption必须在国际知名标准组织(如ISO)注册4.颁发者名称(Issuer)该字段用于标识颁发证书的CA的X.500DN(DN可分辨名称)名称。包括:1)国家(C)2)省(ST)3)地区(L)4)组织机构(O)5)单位部门(OU)6)通用名(CN)7)电子邮箱地址5.有效期(Validity))指定证书的有效期,包括:1)证书生效的日期和时间2)证书到期的日期和时间每次使用证书时,都需要检查证书是否在有效期内时期。6.证书用户名(Subject)指定证书持有者的X.500唯一名称。包括:1)国家(C)2)省(ST)3)地区(L)4)组织机构(O)5)单位部门(OU)6)通用名称(CN)7)电子邮箱地址7.证书持有者主题公开KeyInfo(SubjectPublicKeyInfo)证书持有者的公钥信息字段包含两个重要信息:1)证书持有者的公钥的值2)公钥使用的算法标识符。该标识符包含公钥算法和哈希算法。8.Extensions(扩展)X.509V3证书是在v2标准格式或普通格式的基础上增加了扩展,以便证书可以附带附加信息。标准扩展是指X.509V3定义的扩展,加入到V2版本中,具有广阔的应用前景。任何人都可以向一些权威组织注册一些其他扩展,例如ISO。如果这些扩展被广泛使用,说不定将来会成为标准扩展。9.发行者唯一标识符(IssuerUniqueIdentifier)第二版证书定义中增加了发行者唯一标识符。当相同的X.500名称用于多个证书颁发机构时,此字段用于将颁发者的X.500名称唯一标识为一位字符串。选修的。10.证书持有者的唯一标识符(SubjectUniqueIdentifier)证书持有者的唯一标识符是在标准第二版的X.509证书定义中加入的。当多个证书持有者使用相同的X.500名称时,该字段用于以一位字符串唯一标识证书持有者的X.500名称。选修的。11.签名算法(SignatureAlgorithm)由证书颁发机构对证书的上述内容进行签名的算法示例:sha256WithRSAEncryption12。签名值(Issuer'sSignature)证书颁发机构如何识别证书的上述内容的签名值如前所述,XX证书包含内容如下:证书包含颁发证书的组织名称--CA证书内容本身的数字签名(用CA私钥加密)证书持有者公钥证书签名使用的哈希算法浏览器内置的CA根证书包含以下关键内容:CA'spublickey(非常重要!!!)好了,接下来针对前面提到的非法证书的两种场景,说明如何识别完全伪造的证书。这种情况比较简单。对于证书检查:证书颁发机构是伪造的:浏览器不识别,直接认为是危险证书。证书颁发机构确实存在,所以根据CA名称,找到对应的内置CA根证书和CA的公钥。用CA的公钥解密伪造证书的摘要,发现无法破解。它被认为是一个被篡改过的危险证书。假设代理人通过某种方式获得了XX的证书,然后偷偷修改证书的公钥为自己的,然后高兴地以为用户要上钩了。但是,太简单了:查看证书,根据CA名称找到对应的CA根证书和CA的公钥。用CA的公钥解密证书的数字签名,得到对应的证书摘要AA根据证书签名中使用的哈希算法,计算出当前证书的摘要BB比较AA和BB,发现它们是不一致-->判断是危险证书HTTPS握手过程啰嗦了一大堆。HTTPS如何保证加密数据传输的安全基本讲完了,技术性太强的直接略过。最后还有最后两个问题:网站如何把证书给用户(浏览器)?上面提到的对称密钥是怎么协商出来的呢?以上两个问题其实就是HTTPS握手阶段需要做的事情。HTTPS的数据传输过程整体上和HTTP类似,同样包括握手和数据传输两个阶段。握手:证书颁发,密钥协商(这个阶段都是明文)数据传输:这个阶段是加密的,使用握手阶段协商的对称密钥作者:程序员小卡原文:http://www.cnblogs.com/chyingp/p/https-introduction.html#undefined