HTTP:安全HTTP---HTTPS

HTTPS

HTTPS是最常见的HTTP安全版本,HTTPS将HTTP协议与一组强大的对称、非对称和基于证书的加密技术结合在一起,使得HTTPS不仅很安全,而且很灵活,很容易在出于无序状态的、分散的全球互联网上进行管理

HTTPS概述

HTTPS就是在安全的传输层上发送HTTP。HTTPS在将位加密的HTTP报文发送给TCP之前,先将其发送给了一个安全层,对其进行加密。

在这里插入图片描述

HTTPS方案

现在,安全HTTP是可选的。因此,对Web服务器发起请求时,我们需要有一种方式来告知Web服务器去执行HTTP的安全版本。这是在URL的方案中实现的:

  • 通常,非安全的HTTP的URL方案前缀为http,比如:http://www.xxx.com
  • 安全的HTTP的URL方案前缀为https,比如:https://www.bao.com/eee

请求一个客户端对某Web资源执行某事务时,它会去检测URL的方案:

  • 如果URL的方案是http,客户端就会打开一条到服务器端口80(默认)的连接,并向其发送老的HTTP命令(参见下图a)
  • 如果URL的方案是https,客户端就会打开一条到服务器端口443(默认)的连接,然后与服务器"握手",以二进制格式与服务器交换一些SSL安全参数,附上加密的HTTP命令(参见下图b)
    在这里插入图片描述
    SSL是个二进制协议,与HTTP完全不同,其流量是承载在另一个端口上的(SSL通常是由端口443承载的)。如果SSL和HTTP流量都从端口80到达,大部分Web服务器会将二进制SSL流量理解为错误的HTTP并关闭连接。将安全服务进一步整合到HTTP层中去就无需使用多个目的端口了,在实际中这样不会引发严重的问题。
  • SSL是一个复杂的二进制协议。我们基本上都是通过一些开源的库来编写SSL客户端和服务器。
  • OpenSSL是SSL和TLS最常见的开源实现。OpenSSL项目由一些志愿者合作开发,目标是开发一个强壮的、具有完备功能的商业级工具集,以实现SSL和TLS协议以及一个全功能的通用加密库

建立安全连接

在未加密HTTP中,客户端会打开一条到Web服务器端口80的TCP连接,发送一条请求报文,接收一条响应报文,关闭连接。(见下图a)

由于SSL安全层的存在,HTTPS中这个过程会比较复杂一点。在HTTPS中,客户端首先打开一条到Web服务器端口443(默认)的连接。一旦建立了TCP连接,客户端和服务器就会初始化SSL层,对加密参数进行沟通,并交换密钥。握手完成之后,SSL初始化就完成了,客户端就可以将请求报文发送给安全层了。在将这些报文发送给TCP之前,要先对其进行加密。(见下图b)
在这里插入图片描述

SSL握手

在发送已加密的HTTP报文之前,客户端和服务器要进行一次SSL握手,在这个握手过程中,它们要完成如下工作:

  • 交换协议版本号
  • 选择一个双方都了解的密码
  • 对两端的身份进行验证
  • 生成临时的会话密钥,以便加密信道

在通过网络传输任何已加密的HTTP数据之前,SSL已经发送了一组握手数据来建立通信连接了,下图显示了SSL握手的基本思想
在这里插入图片描述

服务器证书

SSL支持双向认证,将服务器证书承载回客户端,再将客户端的证书回收给服务器。现在,服务器很少会请求客户端证书了,但是安全的HTTPS事务总是要求使用服务器证书。

服务器证书是一个显示了组织的名称、地址、服务器DNS域名以及其他信息的X.509 v3派生证书。客户端可以检测证书,以确认所有信息都是可信的
在这里插入图片描述
通过HTTPS建立了一个安全Web事务之后,现代的浏览器都会自动获取所连接服务器的数字证书。如果服务器没有证书,安全连接就会失败

浏览器收到证书时会对签名颁发机构进行检测,如果这个机构是很有权威的公共签名机构,浏览器可能已经知道其公开密钥了(浏览器会预先按照很多签名颁发机构的证书)。这样,就可以验证签名了。如下图:

在这里插入图片描述
如果对签名颁发机构一无所知,浏览器就无法确认是否应该信任这个签名颁发机构,它通常会向用户显示一个对话框,看看他是否相信这个签名发布者。签名发布者可以是本地的IT部分或者软件厂商。

通过代理以隧道形式传输安全流量

客户端通常会用Web代理服务器代表它们来访问Web服务器。比如,很多公司都会在公司网络和公共因特网的安全边界上放置一个代理(见下图)。代理是防火墙路由器唯一允许进行HTTP流量交换的设备,它可能会进行病毒检测或其他的内容控制工作。
在这里插入图片描述

但只要客户端开始用服务器的公开密钥对发往服务器的数据进行加密,代理就再也不能读取HTTP首部了!代理不能读取HTTP首部,就无法知道应该将请求转向何处了。
在这里插入图片描述
为了使HTTPS与代理配合工作,要进行几处修改以告知代理连接到何处。一种常见的技术是HTTPS SSL隧道协议。要使用HTTPS隧道协议,客户端首先要告知代理,它想要连接的安全主机和接口。这是在开始加密之前,以明文形式告知的,所以代理可以理解这条信息。

HTTP通过新的名为CONNECT的扩展方法来发送这些明文形式的端点信息。CONNECT方法会告诉代理,打开一条到所期望主机和端口号的连接。这项工作完成之后,直接在客户端和服务器之间以隧道的方式传输数据。CONNECT方法就是一条单行的文本命令,它提供了有:分隔的安全服务器的主机名和端口号。host:port后面跟着一个空格和HTTP版本字符串,再后面是CRLF。接下来是零个或者多个HTTP请求首部行,后面跟着一个空行。空行之后,如果建立连接的握手过程成功完成,就可以开始传输SSL数据了。例子:

在这里插入图片描述
在请求中的空行之后,客户端会等待来自代理的响应。代理会对请求进行评估,确保它是有效的,而且用户有权请求这样一条连接。如果一切正常,代理会建立一条到目标服务器的连接。如果成功,就向客户端发送一条200 Connection Established响应。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值