简介

  • 超文本传输协议HTTP被用于在web浏览器和网站服务器之间传递信息,以明文方式发送内容,如果攻击者截取了web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此不适合传输一些敏感信息。即使post提交的数据放在报体里看不到,但是利用抓包工具还是会被窃取到。
  • 安全套接字层超文本传输协议HTTPS,在HTTP的基础上加入了SSL(Secure Sockets Layer)协议,SSL是基于HTTP之下TCP之上的一个协议层,所以HTTPS是HTTP+SSL/TCP的简称。
  • ssl依靠证书来验证服务器之间的身份,并为浏览器和服务器之间的通信加密。简单来讲是HTTP的安全版,既保证数据传输的安全,又能确认网站的真实性。
  • TLS:Transport Layer Security,安全传输层协议,SSL的新版本3.1。
  • https协议需要到CA(Certificate Authority证书机构)申请证书,一般免费证书较少,因而需要一定费用。

数字证书

  • 目的:起初是为了保证互联网上电子交易及支出的安全性、保密性,在网上建立的一种信任机制。这就不要求买卖双方都必须拥有合法的身份,并且在网上能够被有效无误地验证。
  • 数字证书是一种权威性的电子文档,它提供了一种在Internet上验证您身份的方式,类似于身份证。
  • 由权威机构CA证书授权中心发行,并由该机构负责检验和管理证书。
  • 颁发流程:
  1. 首先,用户生成自己的密钥对,并将公钥即部分个人身份信息传送给认证中心。
  2. 认证中心核实身份后,将发给用户一个数字证书,即对身份信息和公钥进行数字签名、ca机构本身的数字签名。
  3. 用户使用该证书进行相关的各种活动。

原理

(1)客户访问一个需要https的网站,如,https://www.domain.xom。

(2)开始握手,以完成身份验证和密钥交换,此过程采用非对称加密。服务器收到客户端请求后,会将网站的证书信息(包含公钥)传送一份给客户端。这里要特别说一下客户端到底如何校验对方发来的数字证书是否有效:

1. 首先在本地电脑寻找是否有该服务器证书上的ca机构的根证书(本地电脑和浏览器都会内置许多可信的根证书),有则进入下一步,否则弹出警告。

2. 客户端从ca获取公钥,对证书中ca机构本身的数字签名进行解密,因为原本就是用ca自己的私钥加密生成的,所以如果能解密成功就说明该证书是权威的。

3. 然后证书中包含的公钥还要进行一层一层的解密、与ca的比对,最终才能确定证书的真实性。

(3)校验成功后,客户端会生成会话密钥(随机串)并用服务器证书的公钥加密后发送回去。

(4)服务器利用自己的私钥解密出会话密钥,会话密钥交换完毕,握手结束。

(6)客户端和服务器开始用此会话密钥对信息进行对称加密,开始通信。

  • 为什么不一致使用非对称加密进行通信,因为其耗时远比对称加密要大。
  • 参考文章

  • 优点

尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案,主要有以下几个好处:

  (1)使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;

  (2)HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。

  (3)HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。

  (4)谷歌曾在2014年8月份调整搜索引擎算法,并称“比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。

  • 缺点

虽然说HTTPS有很大的优势,但其相对来说,还是存在不足之处的:

  (1)HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电;

  (2)HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;

  (3)SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。

  (4)SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。

  (5)HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。

HTTP切换到https

自签名证书

  • 自签名证书:自己生成的证书,因为官方生成的证书要钱,所以除非是很正式的项目,否则使用自己签发的证书足矣。

使用jdk自带公管局KeyTool生成自签发证书

  • 命令行输入:keytool -genkey -keystore “D:\localhost.keystore” -alias localhost -keyalg RSA
输入密钥库口令:123456
再次输入新口令:123456
您的名字与姓氏是什么?
  [Unknown]:  localhost
您的组织单位名称是什么?
  [Unknown]:  sishuok.com
您的组织名称是什么?
  [Unknown]:  sishuok.com
您所在的城市或区域名称是什么?
  [Unknown]:  beijing
您所在的省/市/自治区名称是什么?
  [Unknown]:  beijing
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=localhost, OU=sishuok.com, O=sishuok.com, L=beijing, ST=beijing, C=cn是否正确
?
  [否]:  y

输入 <localhost> 的密钥口令
        (如果和密钥库口令相同, 按回车):回车
再次输入新口令:
  • 虽然最后报warning,但依然生成了证书。
  • 然后,让客户端信任此服务器证书,即将服务器证书加入到受信任的根证书颁发机构中。
  1. 先把服务器证书导出为.cer文件
keytool -keystore D:/keys/localhost.keystore -export -alias localhost 
    -file D:/keys/server.cer //localhost是刚才为证书起的别名