1.HTTPS(HyperText Transfer Protocol Secure),译为超文本传输安全协议。
常称为HTTP over TLS,HTTP over SSL,HTTP Secure。由网景公司于1994年首次提出,HTTPS是在HTTP的基础上使用SSL/TLS来加密报文,对窃听和中间人攻击提供合理的防护。
HTTPS就是身披SSL/TLS外壳的HTTP。HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立安全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。
2.HTTPS的默认端口号是443(HTTP是80)
3.在浏览器上输入http://www.baidu.com会自动重定向到https://www.baidu.com
4.HTTPS的成本
证书的费用
加解密计算
降低了访问速度
有些企业的做法是:包含敏感数据的请求才使用HTTPS,其他保持使用HTTP
TLS(Transport Layer Security),译为:传输层安全性协议,前身是SSL(Secure Sockets Layer),译为:安全套接层。
SSL/TLS工作在哪一层:应用层和传输层之间。要将HTTP报文加密后,在发给传输层。其中SSL/TLS这一层又分为握手层和记录层。
OpenSSL是SSL/TLS协议的开源实现,始于1998年,支持Windows,Mac,Linux等平台。利用OpenSSL可以使用SSL/TLS的一些功能,比如加密,生成密钥对,生成签名证书。
Linux,Mac一般自带OpenSSL
Windows下载安装OpenSSL:https://slproweb.com/products/Win32OpenSSL.html
常用命令:
生成私钥:openss genrsa -out mj.key
生成公钥:open rsa -in mj.key -pubout -out mj.pem
可以使用OpenSSL构建一套属于自己的CA,自己给自己颁发证书,称为“自签名证书”。
1.总的可以分为3大阶段:
1.TCP的3次握手
2.TLS的连接:
主要就是协商各种信息,利用密钥交换算法来生成一个会话密钥,之后就可以进行HTTP通信。
主要协商内容:协定加密组件,TLS版本,计算出会话密钥,将公钥证书(包含公钥)给客户端
3.HTTP请求和响应:
之后HTTP的请求响应过程:就是用TLS连接得到的会话密钥来对数据进行对称加密;服务器的公钥对会话密钥进行加密(非对称加密)。再加上签名等机制。
所以非对称加密,对称加密,
2.TLS 1.2的连接
大概有10大步骤,图片中省略了中间产生的一些ACK确认。
抓包可以看到这些ACK过程。
步骤1:Client Hello
客户端向服务器发送一个数据包,主要协定这些内容
TLS的版本号;
支持的加密组件(Cipher Suiter)列表,加密组件是指所使用的的加密算法以及密钥长度。
一个客户端随机数(Client Random)
步骤2:Server Hello
服务器向客户端发送一个数据包,主要包括下面内容
TLS的版本号
选择的加密组件:是从接收到的客户端机密组件列表中挑选出来的。
一个随机数。
步骤3:Cetificate
服务器将公钥证书(被CA签名过的),发给客户端。
证书里面包含着公钥,第三方认证机构的签名信息,服务端域名信息等
步骤4:Server Key Exchange
传给客户端一个用以实现ECDHE算法的其中一个参数(Server Params)
ECDHE是一种密钥交换算法:客户端和服务端都要拥有密钥,就是根据TLS的前几部,协定一些参数,然后两端根据参数都能计算出一个相同的密钥。
为了防止伪造,Server Params经过了服务器私钥签名。
步骤5:Server Hello Done
告知客户端,协商部分结束。
目前为止,客户端和服务器端之间通过明文(前5不都是明文)共享了:
Client Random, Server Random, Server Params
而且,客户端也已经拿到了服务器的公钥证书,接下来,客户端会验证证书的真实有效性。
步骤6:Client Key Exchange
客户端解析证书,这部分工作由客户端来完成。首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在的问题。如果证书没有问题,那么就开始生成主密钥的步骤。
客户端发给服务器:用以实现ECDHE算法的另一个参数(Client Params)
目前为止,客户端和服务器端都拥有的ECDHE算法需要的2个参数:Server Params, Client Params
此时客户端,服务器都可以使用ECDHE算法:
根据Server Params, Client Params计算出一个新的随机密钥串:Pre-master secret
然后结合Server Params, Client Params,Pre-master secret生成一个主密钥,最后再利用主密钥衍生出其他密钥而且双方都有这些密钥:客户端发送用的会话密钥,服务器端发送用的会话密钥。
会话密钥就是对HTTP请求发送的内容进行对称加密,如果用的是别的密钥交换算法算法的话(此处的密钥交换算法ECDHE是两边都算出主密钥,会话密钥),这个会话密钥本身又会被非对称加密后传输给接收端(用接收的证书的公钥加密会话密钥)。
步骤7:Change Cipher Spec
告知服务器:之后的通信会采用计算出来的会话密钥(对称加密的密钥)进行加密。
步骤8:Finished
看一些你的密钥有没有问题:客户端发给服务器,看看服务器能不能解密。
发送一个包含连接至今全部报文的整体校验值(摘要,哈希值),并且用上面得到的会话密钥加密这个密钥之后发送给服务器。
这次握手协商能否成功:要以服务器是否能够正确解密该报文作为判定标准。
步骤9,10
Change Cipher Spec和Finished
客户端正确解密后,会连续发送两次报文给客户端。
到此为止,客户端服务器都验证加密解密没问题,握手正式结束,表明TSL层连接建立成功。
后面开始传输加密的HTTP请求和响应。
之后HTTP的请求响应过程:就是用TLS连接得到的会话密钥来对数据进行加密解密。
这是以ECDHE是一种密钥交换算法为例进行讲解的TLS连接,所以看到的其他的TLS连接可能和上面有细节差别。取决于用的是什么密钥交换算法,怎么搞定两边都有主密钥的。是左右两个各自计算,还是左边计算好传过去呢?
如果用的是别的密钥交换算法算法的话(此处的密钥交换算法ECDHE是两边都算出主密钥,会话密钥),这个会话密钥本身又会被非对称加密后传输给接收端(用接收的证书的公钥加密会话密钥)。
TLS主要就是能两边建立一个安全的信道,安全的传输信息,怎么让两边安全的都有这个会话密钥
1.设置环境变量SSLKEYLOGFILE(浏览器会将key信息导出到这个文件)
设置完成后,最好重启一下操作系统
2.在Wireshark中选择这个文件
3.如果环境变量不管用,可以直接设置浏览器的启动参数
1.主要就是让浏览器从后端能下载一个证书,前端不用什么工作,因为浏览器可以自己解析证书。
环境:Tomcat 8, JDK1.8
2.首先,使用JDK自带的keytool生成证书。
一个生成免费证书的网站: https://freessl.org/
证书:里面会放一个我的公钥,我的私钥自己保管,不对外开放。所以选择这个命令
keytool -genkeypair -alias mj -keyalg RSA -keystore F:/mj.jks3.配置服务器:
把生成的mj.jks放到tomcat目录下的conf文件夹中
4.修改 TOMCAT_HOME/conf/server.xml 中的 Connector,之后重启一下tomcat
5.当然浏览器会提示不安全,因为这个证书不是第三方签发的,是我们自己生成的,浏览器不信任。















