一、HTTPS 概述

HTTPS(超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。

WEB服务存在http和https两种通信方式,http默认采用80作为通讯端口,对于传输采用不加密的方式;https默认采用443,对于传输的数据进行加密传输。

HTTPS 其实是有两部分组成:HTTP + SSL / TLS,也就是在 HTTP 上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过 TLS 进行加密,所以传输的数据都是加密后的数据。
SSL中文叫“安全套接层”,后来由于广泛应用,SSL标准化之后就改名为TLS了

传输加密 java javascript_客户端

二、对称加密

对称加密算法的加密和解密都是用同一个密钥。
目前常见的加密算法有:DES、AES、IDEA 等

三、非对称加密

非对称加密使用的是两个密钥,公钥与私钥,公钥加密的内容需要对应的私钥解密,私钥加密的内容需要对应的公钥解密。公钥是公开的,私钥是保密的。

非对称加密也有很明显的缺点:

  1. 非对称加密比较慢
  2. 非对称加密对文本长度有限制

非对称加密算法性能较低,但是安全性强,由于其加密特性,更多的是把它用来加密传输对称加密使用的密钥。

目前常见非对称加密算法:RSA,DSA,DH等。

四、数字证书+数字签名
1. 数字证书

互联网中有公信机构,负责颁发证书以及验证证书的合法性,由它来向服务器颁布可信的证书。常见的公信机构是CA 机构。

首先,服务器需要向发证机构提供自己的信息,包括:版本、证书编号、发证机构、域名、公钥等,这些信息发证机构验证通过之后就会生成一份数字证书传给服务器。

2. 数字签名

为了确保数字证书在传输过程中没有被篡改,需要生成数字签名给客户端验证。

数字签名的制作过程

  1. CA拥有非对称加密的私钥和公钥。
  2. CA对证书明文信息进行hash。
  3. 对hash后的值用私钥加密,得到数字签名。

服务器向发证机构提交的信息如域名、公司名称、公钥等等,这些信息就是证书上的明文。
hash算法有很多种,所以发证机构会把使用的hash算法也在数字证书上标明。
数字证书 = 明文 + hash算法 + 数字签名,服务器拿到数字证书之后就可以发给请求的客户端了。

客户端验证过程:

  1. 拿到证书,得到明文T1,数字签名S1。
  2. 用CA机构的公钥对S1解密,得到S2。
  3. 用证书里说明的hash算法对明文T1进行hash得到T2。
    比较S2是否等于T2,等于则表明证书可信。

各个客户端上都会存储各大发证机构的公钥,会在SSL层验证数字证书的是否可靠。

五、HTTPS的作用
1. HTTP的风险

http协议属于明文传输协议,通信双方没有进行认证,存在一定的问题:

  • 窃听风险:第三方可以获知通信内容
  • 篡改风险:第三方可以修改通信内容
  • 冒充风险:第三方可以冒充他人身份参与通信

希望协议可以达到:

  • 内容加密:建立一个信息安全通道,信息都是加密传播,第三方无法窃听
  • 数据完整性:具有校验机制,一旦被篡改,通信双方会立刻发现
  • 身份验证:配备身份证书,防止身份被冒充
2. HTTPS怎么保证安全
  1. 通过数字证书验证身份
  2. 通过非对称加密传输密钥
  3. 数据传输用密钥对称加密,该密钥只有客户端和服务端知道
五、HTTPS 工作原理
  1. 客户端发起一个 https 网址,然后连接到server的443端口。
  2. 服务端必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。
  3. 传送证书
    这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间、服务端的公钥,第三方证书认证机构(CA)的签名,服务端的域名信息等内容。
  4. 客户端解析证书
    这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值(密钥)。然后用证书对该随机值进行加密。
  5. 传送加密信息
    这部分传送的是用证书加密后的随机值(私钥),目的就是让服务端得到这个随机值(私钥),以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
  6. 服务端加密信息
    服务端用私钥解密,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,
  7. 传输加密后的信息
    这部分信息是服务端用随机值(私钥)对称加密后的信息,可以在客户端被还原。
  8. 客户端解密信息
    客户端用之前生成的随机值(私钥)解密服务端传过来的信息,于是获取了解密后的内容。
六、为什么用https加密后还能查看明文数据

使用https加密之后,正常来说,数据在进行传输的时候,应该是加密过的了。但为什么有时候我们使用firebug查看时,数据传输还是明文的呢?

其实是因为https加密发生在应用层与传输层之间,所以在传输层看到的数据才是经过加密的,而我们捕捉到的http post,是应用层的数据,此时还没有经过加密。这些明文信息,其实是你的本地数据。

加密数据只有客户端和服务器端才能得到明文,客户端到服务端的通信过程是安全的。

其实这样是有可能在本地恶意拦截的,不过在银行电商等安全防护程度较高的网站,除了https加密外,还有安全控件加密,用户必须下载安全控件后才能输入密码。使用安全控件后输入的密码,即使在本地也无法查看信息。

七、从 HTTPS 到 HSTS

HTTPS网站通常的做法是对HTTP的访问在服务器端做302跳转,跳转到HTTPS。但是当网站传输协议从 HTTP 到 HTTPS 之后,数据传输真的安全了吗?

由于用户习惯,通常准备访问某个网站时,在浏览器中只会输入一个域名,而不会在域名前面加上 http:// 或者 https://,而是由浏览器自动填充,当前所有浏览器默认填充的都是http://。一般情况网站管理员会采用了 301/302 跳转的方式由 HTTP 跳转到 HTTPS,但是这个过程总使用到 HTTP 因此容易发生劫持,受到第三方的攻击。

这个时候就需要用到 HSTS(HTTP 严格安全传输)。

HSTS

HSTS是国际互联网工程组织 IETF 正在推行一种新的 Web 安全协议,网站采用 HSTS 后,用户访问时无需手动在地址栏中输入 HTTPS,浏览器会自动采用 HTTPS 访问网站地址,从而保证用户始终访问到网站的加密链接,保护数据传输安全。

HSTS原理

HSTS 主要是通过服务器发送响应头的方式来控制浏览器操作:

  1. 首先在服务器响应头中添加 HSTS 响应头:
Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]

此响应头只有在 https 访问返回时才生效,其中[ ]中的参数表示可选;

  1. 设置 max-age 参数,时间设置不宜过长,建议设置时间为 6 个月;
  2. 当用户下次使用 HTTP 访问,客户端就会进行内部跳转,并且能够看到 307 Redirect Internel 的响应码;
  3. 网站服务器变成了 HTTPS 访问源服务器。

开启 HSTS 后网站可以有效防范中间人的攻击,同时也会省去网站 301/302 跳转花费的时间,大大提升安全系数和用户体验。

用 http 访问

传输加密 java javascript_客户端_02


307重定向

传输加密 java javascript_HTTPS_03

用 https 访问,无需重定向

传输加密 java javascript_服务端_04