目录
HTTP通信协议
请求报文
响应报文
持久连接
状态管理
HTTPS通信协议
安全的HTTPS
HTTP到HTTPS的演变
对称加密
非对称加密
混合加密机制
证书机构
SSL到底是什么
HTTPS是身披SSL外壳的HTTP
一次HTTP请求的通信流程:客户端浏览器通过域名访问网页资源,由DNS解析得到目标服务器的ip,在HTTP、TCP/IP协议的协助下,发送请求到达服务器,服务器返回对应的XML、HTML以及JSON格式的数据。
这段请求的内容是:请求访问某台HTTP服务器上的/index.html页面资源。
请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的。
其中的POST是告知服务器意图的HTTP方法,在http协议的使用频率越来越高的趋势下,大家约定了REST风格的架构规则。常见的8种HTTP方法:
方法 | 意图 | 请求 | 响应 |
---|---|---|---|
GET | 获取资源 | GET /index.html HTTP/1.1 Host: www.hackr.jp | 返回 index.html 的页面资源 |
POST | 传输实体主体 | POST /submit.cgi HTTP/1.1 Host: www.hackr.jp Content-Length: 1560(1560字节的数据) | 返回 submit.cgi 接收数据的处理结果 |
PUT | 传输文件 | PUT /example.html HTTP/1.1 Host: www.hackr.jp Content-Type: text/html Content-Length: 1560(1560 字节的数据) | 响应返回状态码 204 No Content(比如 :该 html 已存在于服务器上) |
HEAD | 获得报文首部 | HEAD /index.html HTTP/1.1 Host: www.hackr.jp | 返回index.html有关的响应首部 |
DELETE | 删除文件 | DELETE /example.html HTTP/1.1 Host: www.hackr.jp | 响应返回状态码 204 No Content(比如 :该 html 已从该服务器上删除) |
OPTIONS | 询问支持的方法 | OPTIONS * HTTP/1.1 Host: www.hackr.jp | HTTP/1.1 200 OK Allow: GET, POST, HEAD, OPTIONS (返回服务器支持的方法) |
TRACE | 追踪路径 | TRACE / HTTP/1.1 Host: hackr.jp Max-Forwards: 2 | HTTP/1.1 200 OK Content-Type: message/http 响应 Content-Length: 1024 TRACE / HTTP/1.1 Host: hackr.jp Max-Forwards: 2(返回响应包含请求内容) |
CONNECT | 要求用隧道协议连接代理 | CONNECT proxy.hackr.jp:8080 HTTP/1.1 Host: proxy.hackr.jp | HTTP/1.1 200 OK(之后进入网络隧道) |
在服务器上的资源类型有很多,比如图片类型、视频类型、 Js、Css、文本等。浏览器如何识别当前类型做不同的渲染呢?
MIME Type:是描述消息内容类型的因特网标准,常见的几种类型
文本文件:text/html,text/plain,text/css,application/xhtml+xml,application/xml
图片文件:image/jpeg,image/gif,image/png.
视频文件:video/mpeg,video/quicktime
我们可以通过两种方式来设置文件的渲染类型,第一种是 Accept,第二种是 Content-Type
Accept: 表示客户端希望接受的数据类型,即告诉服务器我需要什么媒体类型的数据,此时服务器应该根据 Accept 请求头生产指定媒体类型的数据
Content-Type: 表 示 发 送 端 发 送 的 实 体 数 据 类 型 , 比 如 我 们 应 该 写 过 类 似 的 : resposne.setContentType(“application/json;charset=utf-8”)的代码,表示服务端返回的数据 格式是 json。 如果 Accept 和 Content-Type 不一致,假如说 Accept 要接收的类型是 image/gif,但是服务 端返回的数据是 text/html,那么浏览器将会无法解析。
响应报文基本上由协议版本、状态码(表示请求成功或者失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主题构成。
如果用户访问的地址有问题,或者服务端在解析用户请求以 及处理请求逻辑时出现问题,怎么办呢?HTTP状态码会给出具体的响应结果。
类别 | 原因短语 | |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | ClientError(客户端错误状态码) | 服务器无法处理请求 |
5XX | ServerError(服务器错误状态码) | 服务器处理请求出错 |
常见的HTTP状态码:
200 OK:表示请求成功,服务器已经成功处理了客户端的请求。
201 Created:表示请求已经被成功处理,服务器创建了新的资源。
202 Accepted:表示请求已被接受,但尚未被执行。
204 No Content:表示请求已成功处理,但响应没有包含实体的主体部分。通常用于没有响应主体的DELETE请求。
206 Partial Content:表示服务器已经成功处理了部分GET请求,通常用于分段下载或断点续传。
301 Moved Permanently:表示请求的资源已永久性地移动到新的位置,客户端应该使用新的URL进行请求。
302 Found:表示请求的资源临时移动到了新的位置,客户端应该使用新的URL进行请求,但以后可能还会改回旧的URL。
304 Not Modified:表示资源未修改,客户端可以使用本地缓存的副本。
400 Bad Request:表示客户端发送的请求存在语法错误或无法理解的请求。
401 Unauthorized:表示客户端请求需要进行身份验证,但提供的认证信息无效。
403 Forbidden:表示客户端没有权限访问请求的资源,服务器拒绝了请求。
404 Not Found:表示请求的资源未找到。
408 Request Timeout:表示客户端请求超时。
500 Internal Server Error:表示服务器在处理请求时发生了内部错误。
502 Bad Gateway:表示服务器作为网关或代理服务器时,从上游服务器接收到无效的响应。
503 Service Unavailable:表示服务器暂时不可用,通常是因为服务器过载或维护。
504 Gateway Timeout:表示服务器作为网关或代理服务器时,从上游服务器接收到超时响应。
在最早的http协议中,每进行一次http通信,就需要做一次tcp的连接。而一次连接需要进行3次握手,这种通信方式会增加通信量的开销。
为了解决TCP连接问题,HTTP/1.1想出了持久连接的方法,通过Connection:Keep-Alive将连接作为持久连接。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态,HTTP/1.1持久连接在默认情况下是激活的。
要知道,HTTP 是无状态协议,它不对之前发生过的请求和响应的状态进行管 理。也就是说,无法根据之前的状态进行本次的请求处理。保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入 了 Cookie 技术。
客户端通过在请求和响应报文中写入Cookie信息来控制客户端的状态;Cookie会根据从服务器端发送的响应报文内的一 个叫做Set-Cookie的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。
没有Cookie信息状态下的请求
第2次以后(存有cookie信息状态)的请求
服务器端会提供session的机制来保存服务端的对象状态,服务器使用一种类似于散列表的结构来保存信 息,当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求是否包含了一个session标识- session id; 如果已包含一个session id则说明以前已经为客户端创建过session,服务器就按照 session id 把这个 session 检索出来使用(如果检索不到,会新建一个); 如果客户端请求不包含sessionid,则为此客户端创建一个 session 并且生成一个与此 session 相关联的 session id, session id 的值是一个既不会重复,又不容易被找到规律的仿造字符 串,这个 session id 将会返回给客户端保存。
HTTP协议可能存在信息窃听或者身份伪装等安全问题。关于未加密的协议有些明显的不足之处:
通信使用明文(不加密),内容可能被窃听
不验证通信方的身份,因此有可能遭遇伪装
无法证明报文的完整性,所以有可能已遭篡改
HTTPS(Hypertext Transfer Protocol Secure)是一种在HTTP基础上添加了安全性特性的通信协议。HTTPS之所以被认为是安全的,主要基于以下几个关键因素:
数据加密:HTTPS使用加密算法来保护数据的机密性。通信过程中传输的数据会被加密,使得恶意攻击者无法轻松窃取敏感信息。常见的加密算法包括TLS/SSL协议中使用的RSA、Diffie-Hellman、AES等。
身份验证:HTTPS使用SSL/TLS证书来验证服务器的身份。服务器必须获得由受信任的证书颁发机构(CA,Certificate Authority)签发的数字证书,这个数字证书包含了服务器的公钥,用于建立安全连接。这样,客户端可以确保它们正在与合法的服务器通信,而不是被劫持或伪装的服务器。
数据完整性:HTTPS还提供了数据完整性保护。通过使用消息摘要(Message Digest)和数字签名等技术,客户端可以确保在传输过程中数据没有被篡改或损坏。
防止中间人攻击:HTTPS的身份验证和加密机制可以防止中间人攻击(Man-in-the-Middle Attack)。中间人攻击是指攻击者通过篡改或窃听数据流量来窃取信息。HTTPS通过数字证书来验证通信双方的身份,从而降低了中间人攻击的风险。
强大的算法和协议:HTTPS使用强大的加密算法和协议来保护数据,这些算法和协议经过广泛的安全审查和测试,以确保它们的可靠性和安全性。
强制性:对于一些敏感信息的处理,如在线银行交易或个人身份验证,HTTPS通常是强制性的,网站必须使用HTTPS来保护用户的数据。
SSL(Secure Sockets Layer)是一种用于保护网络通信安全的协议。它最初由Netscape公司开发,后来发展为TLS(Transport Layer Security),TLS 1.0之后的版本不再称为SSL,而是TLS。SSL/TLS协议的主要目标是确保在网络上传输的数据隐私和完整性,同时提供身份验证机制。
以下是SSL/TLS的主要特点和功能:
加密:SSL/TLS使用加密算法来保护数据的机密性。数据在传输过程中会被加密,以防止未经授权的访问和窃取。
身份验证:SSL/TLS提供了服务器和客户端之间的身份验证机制。服务器需要提供数字证书,证明其身份是合法的,而客户端也可以提供证书进行双向身份验证。这确保了通信的双方都是合法的。
数据完整性:SSL/TLS通过使用消息摘要和数字签名等技术来确保数据在传输过程中没有被篡改或损坏,从而提供数据的完整性保护。
防止中间人攻击:SSL/TLS的身份验证和加密机制可以有效防止中间人攻击,确保通信双方的安全性。
支持多种加密算法:SSL/TLS支持多种加密算法,包括对称加密和非对称加密,以满足不同的安全需求。
版本升级:SSL/TLS有多个版本,每个版本都不断改进和加强安全性。TLS 1.2和TLS 1.3是目前广泛使用的版本,它们提供了更强的安全性和性能。
适用于各种应用:SSL/TLS不仅适用于Web浏览器和Web服务器之间的通信,还可以用于保护电子邮件、文件传输、即时通信等各种应用的通信。
广泛采用:SSL/TLS协议是互联网上广泛采用的安全协议,许多网站和服务都使用它来保护用户的数据和隐私。
按下SSL的实现设计暂时不表,我们看看HTTP演变到HTTPS的过程都发生了什么。
为了保证通信过程不被篡改和窃听,最开始想到的就是对内容加密,同时,该消息还需要能被服务端解密。那么就需要客户端和服务端用相同的密钥进行加密解密。
加密和解密同用一个密钥的方式称为共享密钥加密(Common key crypto system),也被叫做对称密钥加密。
以共享密钥方式加密时必须将密钥也发给对方。在互联网上转发密钥时,如果通信被监听那么密钥就可会落入攻击者之手,同时也就失去了加密的意义。另外还得设法安全地保管接收到的密钥。
公开密钥加密方式很好地解决了共享密钥加密的困难。公开密钥加密使用一对非对称的密钥。一把叫做私有密钥 (private key),另一把叫做公开密钥(public key)。顾名思义,私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。
HTTPS采用共享密钥加密和公开密钥加密两者并用的混合加密机制。若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处理速度要慢。所以选择了组合起来:在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。
混合加密的机制设计的确很巧妙,但是在公开密钥加密的环节中还是无法证明公开密钥本身就是货真价实的公开密钥。为了解决这个问题,我们可以借助数字证书机构和其颁发的公共密钥证书。
数字证书认证机构业务流程:
服务器的运营人员向数字证书认证机构提出公开密钥的申请。
数字证书认证机构在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起。
服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,以进行公开密钥加密方式通信。公钥证书也叫数字证书或者证书。
接到证书的客户端可使用数字证书认证机构的公开密钥,对那张证书上的数字签名进行验证,一旦验证通过,客户端便可明确两件事: 一,认证服务器的公开密钥的是真实有效的数字证书认证机构。二, 服务器的公开密钥是值得信赖的。
此处认证机关的公开密钥必须安全地转交给客户端。使用通信方式时,如何安全转交是一件很困难的事,因此,多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。
SSL协议是Netscape公司率先采用的网络安全协议;它是在传输通信协议(TCP/IP)上实现的一种安全协议,采用公开密钥技术;SSL广泛支持各种类型的网络,后来发展为TLS(Transport Layer Security),TLS 1.0之后的版本不再称为SSL,而是TLS。SSL/TLS协议的主要目标是确保在网络上传输的数据隐私和完整性,同时提供身份验证机制。
以下是SSL/TLS的主要特点和功能:
加密:SSL/TLS使用加密算法来保护数据的机密性。数据在传输过程中会被加密,以防止未经授权的访问和窃取。
身份验证:SSL/TLS提供了服务器和客户端之间的身份验证机制。服务器需要提供数字证书,证明其身份是合法的,而客户端也可以提供证书进行双向身份验证。这确保了通信的双方都是合法的。
数据完整性:SSL/TLS通过使用消息摘要和数字签名等技术来确保数据在传输过程中没有被篡改或损坏,从而提供数据的完整性保护。
防止中间人攻击:SSL/TLS的身份验证和加密机制可以有效防止中间人攻击,确保通信双方的安全性。
支持多种加密算法:SSL/TLS支持多种加密算法,包括对称加密和非对称加密,以满足不同的安全需求。
版本升级:SSL/TLS有多个版本,每个版本都不断改进和加强安全性。TLS 1.2和TLS 1.3是目前广泛使用的版本,它们提供了更强的安全性和性能。
适用于各种应用:SSL/TLS不仅适用于Web浏览器和Web服务器之间的通信,还可以用于保护电子邮件、文件传输、即时通信等各种应用的通信。
广泛采用:SSL/TLS协议是互联网上广泛采用的安全协议,许多网站和服务都使用它来保护用户的数据和隐私。
总的来说,SSL/TLS协议是网络通信安全的重要组成部分,它通过加密、身份验证和数据完整性保护等多种机制来确保通信的安全性和可信性。这使得用户可以在互联网上安全地传输敏感信息,如密码、信用卡信息和个人数据。不过需要注意的是,为了保持安全性,SSL/TLS协议的配置和使用需要得到正确的实施。
HTTPS 并非是应用层的一种新协议。只是 HTTP 通信接口部分用 SSL(Secure Socket Layer)和 TLS(Transport Layer Security)协议代替而已。
通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通 信,再由SSL和TCP通信了。简言之,所谓 HTTPS,其实就是身披SSL协议这层外壳的HTTP。
在采用SSL后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。