引言

最近恶补计网,HTTPS涉及到的知识比较多,整理一下。
HTTPS实际上就是HTTP穿上了SSL/TLS的外套,我们都知道HTTP属于应用层的协议,是离程序员比较近的,而SSL(安全套接字)与TLS(运输层安全)都属于运输层协议。其实SSL与TLS都是上个世纪的产物,最新版本的TLS建立在SSL 3.0协议规范之上。
HTTPS涉及到加密,先简单了解一下有关密码学的知识。
文章导读

  • 介绍加密的基本概念
  • HTTPS验证流程
  • HTTPS运行原理及思考
  • 总结

    一、关于加密的基本概念

    明文
    HTTP协议是明文传输的,明文就是未被加密过的原始数据。
    密钥
    通常是一个字符串或数字,进行加密/解密算法时使用。公钥和私钥都是密钥,只不过一般公钥是对外开放的,加密时使用;私钥是不公开的,解密时使用。
    非对称加密算法(公钥加密)
    有RSA、DSA/DSS、Elgamal、Rabin、D-H、ECC等。在客户端与服务器相互验证的过程中用的就是非对称加密算法
    RSA密码体制就是公钥密码体制,RSA的一对公钥和私钥都可以用来加密和解密。
    比如公钥加密后只能由私钥解密;私钥加密后只能由公钥解密。且一方加密的内容只能由对方进行解密。
    对称加密算法(私钥加密)
    AES、DES、3DES、TDEA、Blowfish、RC4、RC5、IDEA等。加密使用的密钥和解密使用的密钥是同一个密钥。由于加密算法是公开的,若要保证安全性,密钥不能对外公开。通常用来加密消息体。
    HASH算法
    有MD5,SHA1,SHA256。用来确认信息没有被篡改。主要用来生成签名,签名是加在信息后面的,可以证明信息没有被修改过。一般对信息先做hash计算得到一个hash值,然后用私钥加密(这个加密一般是非对称加密)作为一个签名和信息一起发送。接收方收到信息后重新计算信息的hash值,且和信息所附带的hash值解密后进行对比。如果一样则认为没有被修改,反之则认为修改过,不做处理。可能有一种情况,黑客修改了信息并把hash值也改了,从而让他们相匹配。所以hash值一般都是加密后(生成签名)再和信息一起发送,确保hash值不会被修改。
    数字证书
    主要包含证书发布机构,证书有效期,公钥,证书所有者,签名使用的算法,指纹以及指纹算法。数字证书可以保证里面的公钥一定是证书持有者的。
    数字签名
    HTTPS详解 - 图1数字签名原理
    将明文通过Hash算法加密生成摘要,再将消息体摘要用私钥加密后就是签名了。当下一级证书或客户端需要时就返回这个整体。数字签名主要作用就是配合Hash算法保证信息没有被篡改。当https验证通过后,一般会改用对称加密方式通信,因为RSA公钥体制比较耗性能。所以数字签名只存在于验证阶段。
    证书链
    证书是分级的,证书链由多个证书一级一级组成,拿到上级证书的公钥才能解密本级证书。只有最底层的证书是自签名的,自己颁发给自己。

    二、HTTPS的验证流程

    这一部分看的比较多,主要归纳了一下,分5条。
    1)客户端发起一个http请求,连接到服务器的443端口。
    2)服务端把自己的信息以数字证书的形式返回给客户端(证书内容有密钥公钥,网站地址,证书颁发机构,失效日期等)。证书中有一个公钥来加密信息,私钥由服务器持有。
    3)验证证书的合法性
    客户端收到服务器的响应后会先验证证书的合法性(证书中包含的地址与正在访问的地址是否一致,证书是否过期)。
    4)生成随机密码(RSA签名)
    如果验证通过,或用户接受了不受信任的证书,浏览器就会生成一个随机的对称密钥(session key)并用公钥加密,让服务端用私钥解密,解密后就用这个对称密钥进行传输了,并且能够说明服务端确实是私钥的持有者。
    5)生成对称加密算法
    验证完服务端身份后,客户端生成一个对称加密的算法和对应密钥,以公钥加密之后发送给服务端。此时被黑客截获也没用,因为只有服务端的私钥才可以对其进行解密。之后客户端与服务端可以用这个对称加密算法来加密和解密通信内容了。

    三、HTTPS运行原理

    我们可以通过4个问题彻底理解HTTPS的运行原理,首先要从数字证书开始说起。
    HTTPS的安全性主要依赖于对数字证书的验证以及非对称加密机制,细看步骤3),客户端具体是如何判断证书的合法性的?
    先来看看数字证书都有哪些内容
    Issuer—证书的发布机构
    发布证书的机构,指明证书是哪个公司创建的(并不是指使用证书的公司)。出了问题具体的颁发机构是要负责的
    Valid from,Valid to—证书的有效期
    证书的使用期限。过了这个期限证书就会作废,不能使用。
    Public key—公钥
    刚开始的时候介绍过公钥的概念,用于对消息加密的。
    Subject—主题
    证书是颁发给谁了,一般是个人或公司名称或机构名称或公司网站的网址。
    Signature algorithm—签名所使用的算法
    数字证书的数字签名所使用的加密算法,根据这个算法可以对指纹解密。指纹加密的结果就是数字签名。
    Thumbprint,Thumbprint algorithm—指纹以及指纹算法(一种HASH算法)
    指纹和指纹算法会使用证书机构的私钥加密后和证书放在一起。主要用来保证证书的完整性,确保证书没有修改过。使用者在打开证书时根据指纹算法计算证书的hash值,和刚开始的值一样,则表示没有被修改过。

    a)

    绕了一大圈,问题回来了,客户端如何检测数字证书是合法的并是所要请求的公司的?
    首先应用程序读取证书中的Issuer(发布机构),然后会在操作系统或浏览器内置的受信任的发布机构中去找该机构的证书(为什么操作系统会有受信任机构的证书?先看完这个流程再来回答)。如果找不到就说明证书是水货,证书有问题,程序给错误信息。如果找到了,或用户确认使用该证书。就会拿上级证书的公钥,解密本级证书,得到数字指纹。然后对本级证书的公钥进行数字摘要算法(证书中提供的指纹加密算法)计算结果,与解密得到的指纹对比。如果一样,说明证书没有被修改过。公钥可以放心使用,可以开始握手通信了。

    b)

    接下来解答操作系统为什么会有证书发布机构的证书?
    其实证书发布机构除了给别人发布证书外,自己也有自己的证书。在操作系统安装好时,受信任的证书发布机构的数字证书就已经被微软安装在操作系统中了,根据一些权威安全机构的评估,选取一些信誉很好并且通过一定安全认证的证书发布机构,把这些证书默认安装在操作系统中并设为信任的数字证书。发布机构持有与自己数字证书对应的私钥,会用这个私钥加密所有他发布的证书及指纹整体作为数字签名。

    c)

    步骤4)中客户端生成随机数并用公钥加密,让服务端用私钥解密来确保对方是否真的持有私钥。但是,黑客也可以发送字符串让服务器用私钥加密,并得到加密后的信息,从而找到规律,导致私钥的安全性下降。如何解决?
    服务端并不是真的加密这个字符串,而是把字符串进行hash计算后再进行加密后发送给客户端。客户端收到后再解密这个hash值与原来字符串的hash值对比,从而确定对方是否持有私钥。

    d)

    在通信的过程中,黑客可以截获加密内容,虽不能理解具体内容,但可以捣乱,修改内容或重复发送该内容,如何解决?
    给通信的内容加版本号或随机值,如果接收到版本号或随机值不相同的信息,双方立刻停止通信。若一直捣乱就无法正常通信,因为有人控制了你的路由器,可以针对你。所以一些对于安全性较强的部门来说就不使用公网,而是内部网络,一般不会被破环通信。

    总结

    最重要的就是RSA加密体制,还有用于验证服务器是否持有私钥的步骤,又能牵涉到HASH算法。验证成功后,通过对消息体的摘要进行HASH加密就能得到RSA签名了(为了保证信息没被篡改),给服务器解密,确认,正常通信。