文|Seraph
00 | 缩写
缩写 | 全称 |
---|---|
HTTP | HyperText Transfer Protocol,超文本传输协议 |
SGML | Standard Generalized MarkupLanguage,标准通用标记语言 |
HTML | HyperText MarkupLanguage,超文本标记语言 |
URL | Uniform Resource Locator,统一资源定位符 |
FTP | File Transfer Protocol,文件传输协议 |
DNS | Domain Name System,域名系统 |
TCP | Transmission Control Protocol,传输控制协议 |
UDP | User Data Protocol,用户数据报协议 |
NIC | NetworkInterface Card,网络适配器 |
URI | Uniform Resource Identifier,统一资源标识符 |
NNTP | Network News Transfer Protocol |
01 | 了解Web及网络基础
- 不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议(protocol)。
- 绝对URI的格式:
- 并不是所有的应用程序都是完全依据RFC来实现HTTP的。
02 | 简单的HTTP协议
- HTTP是不保存状态的协议。
- HTTP方法
-
GET,获取资源。
-
POST,传输实体主体。
如果请求的资源是文本,那就保持原样返回;如果是像CGI(Common GatewayInterface,通用网关接口)那样的程序,则返回经过执行后的输出结果。 -
PUT:传输文件
HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的Web网站不使用该方法。若配合Web应用程序的验证机制,或架构设计采用REST(Representational State Transfer,表征状态转移)标准的同类Web网站,就可能会开放使用PUT方法。 -
HEAD:获得报文首部
HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性及资源更新的日期时间等。 -
DELETE:删除文件
HTTP/1.1的DELETE方法本身和PUT方法一样不带验证机制。 -
OPTIONS:询问支持的方法
-
TRACE:追踪路径
TRACE方法是让Web服务器端将之前的请求通信环回给客户端的方法。
发送请求时,在Max-Forwards首部字段中填入数值,每经过一个服务器端就将该数字减1,当数值刚好减到0时,就停止继续传输,最后接收到请求的服务器端则返回状态码200 OK的响应。
TRACE方法本来就不怎么常用,再加上它容易引发XST(Cross-Site Tracing,跨站追踪)攻击,通常就更不会用到了。 -
CONNECT:要求用隧道协议连接代理
CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
- 持久化连接(HTTPPersistent Connections,也称为HTTP keep-alive或HTTP connection reuse)
- 管线化
- Cookie
Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。
服务器端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息
- 没有Cookie信息状态下的请求
请求报文
响应报文
- 有Cookie信息状态的请求
请求报文
03 | HTTP报文内的HTTP信息
-
HTTP报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。
-
HTTP报文结构(可以没有报文主体)
-
请求报文和响应报文结构
-
请求报文和响应报文实例
-
各个字段内容数据
字段 | 内容 |
---|---|
请求行 | 包含用于请求的方法,请求URI和HTTP版本。 |
状态行 | 包含表明响应结果的状态码,原因短语和HTTP版本。 |
首部字段 | 包含表示请求和响应的各种条件和属性的各类首部。一般有4种首部,分别是:通用首部、请求首部、响应首部和实体首部。 |
其它 | 可能包含HTTP的RFC里未定义的首部(Cookie等) |
- HTTP可对实体(实体首部+实体主体)进行压缩编码传输。
支持的压缩方法:gzip(GNU zip)compress(UNIX系统的标准压缩)deflate(zlib)identity(不进行编码) - 分割发送分块的传输编码,为了浏览器能逐步显示页面,而不需要等待数据完全接受完,才显示。
实体主体的最后一块会使用“0(CR+LF)”来标记。 - 多部分对象集合
- multipart/form-data
在Web表单文件上传时使用。 - multipart/byteranges
状态码206(Partial Content,部分内容)响应报文包含了多个范围的内容时使用。
使用boundary字符串来划分多部分对象集合指明的各类实体。在boundary字符串指定的各个实体的起始行之前插入“–”标记(例如:–AaB03x、–THIS_STRING_SEPARATES),而在多部分对象集合对应的字符串的最后插入“–”标记(例如:–AaB03x–、--THIS_STRING_SEPARATES–)作为结束。
-
获取部分内容的范围请求
如果服务器端无法响应范围请求,则会返回状态码200 OK和完整的实体内容。 -
内容协商(Content Negotiation)
内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。
包含在请求报文中的某些首部字段(如下)就是判断的基准:
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
内容协商技术类型: - 服务器驱动协商(Server-driven Negotiation)
- 客户端驱动协商(Agent-driven Negotiation)
- 透明协商(Transparent Negotiation)
04 | 返回结果的HTTP状态码
- 状态码类别:
- 常用状态码
状态码 | 含义 |
---|---|
200 OK | 表示从客户端发来的请求在服务器端被正常处理了 |
204 No Content | 该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。 |
206 Partial Content | 该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。 |
301 Moved Permanently | 永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。 |
302 Found | 临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。因为是临时重定向,所以不会去更新书签 |
303 See Other | 该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。303状态码和302 Found状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源,这点与302状态码有区别。 |
304 Not Modified | 服务器端资源未改变,可直接使用客户端未过期的缓存 |
307 Temporary Redirect | 307会遵照浏览器标准,不会从POST变成GET。尽管302标准禁止POST变换成GET,但实际使用时大家并不遵守 |
400 Bad Request | 该状态码表示请求报文中存在语法错误。 |
401 Unauthorized | 该状态码表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。当浏览器初次接收到401响应,会弹出认证用的对话窗口。 |
403 Forbidden | 该状态码表明对请求资源的访问被服务器拒绝了。 |
404 Not Found | 该状态码表明服务器上无法找到请求的资源。 |
500 Internal Server Error | 该状态码表明服务器端在执行请求时发生了错误。 |
503 Service Unavailable | 该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。 |
- 状态码和实际状况会经常不一致。
05 | 与HTTP协作的Web服务器
-
代理服务
使用代理服务器的理由有:利用缓存技术(稍后讲解)减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的。
缓存代理:代理转发响应时,缓存代理(Caching Proxy)会预先将资源的副本(缓存)保存在代理服务器上。当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。
透明代理:转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理(TransparentProxy)。反之,对报文内容进行加工的代理被称为非透明代理。 -
网关
利用网关可以由HTTP请求转化为其他协议通信
利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。 -
隧道
隧道可按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。
隧道本身不会去解析HTTP请求。也就是说,请求保持原样中转给之后的服务器。隧道会在通信双方断开连接时结束。
06 | HTTP首部
一、首部字段介绍
-
通用首部字段
-
请求首部字段
-
响应首部字段
-
实体首部字段
-
非HTTP/1.1首部字段
这些非正式的首部字段统一归纳在RFC4229 HTTP Header Field Registrations中。 -
End-to-end首部和Hop-by-hop首部
HTTP首部字段将定义成缓存代理和非缓存代理的行为,分成2种类型:
-
端到端首部(End-to-end Header)
分在此类别中的首部会转发给请求/响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。 -
逐跳首部(Hop-by-hop Header)
分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1和之后版本中,如果要使用hop-by-hop首部,需提供Connection首部字段。
HTTP/1.1中的逐跳首部字段(其它都为端到端首部):Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgrade。
二、通用首部字段
- Cache-Control
通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制。
缓存请求指令:
缓存响应指令:
- Connection
-
控制不再转发给代理的首部字段
-
管理持久连接
HTTP/1.1版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定Connection首部字段的值为Close。
HTTP/1.1之前的HTTP版本的默认连接都是非持久连接。为此,如果想在旧版本的HTTP协议上维持持续连接,则需要指定Connection首部字段的值为Keep-Alive。
-
Date
HTTP/1.1协议使用在RFC1123中规定的日期时间的格式,格式如下:
Date: Tue, 03 Jul 2012 04:40:59 GMT
-
Pragma(HTTP/1.1之前版本的历史遗留字段)
Pragma: no-cache
该首部字段属于通用首部字段,但只用在客户端发送的请求中。客户端会要求所有的中间服务器不返回缓存的资源。 -
Trailer
首部字段Trailer会事先说明在报文主体后记录了哪些首部字段。 -
Transfer-Encoding
Transfer-Encoding规定了传输报文主体时采用的编码方式。
使用分块传输编码,分别被分成3312字节和914字节大小。 -
Upgrade
用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
Upgrade首部字段产生作用的Upgrade对象仅限于客户端和邻接服务器之间。因此,使用首部字段Upgrade时,还需要额外指定Connection:Upgrade。 -
Via
使用首部字段Via是为了追踪客户端与服务器之间的请求和响应报文的传输路径。
首部字段Via不仅用于追踪报文的转发,还可避免请求回环的发生。所以必须在经过代理时附加该首部字段内容。 -
Warning
HTTP/1.1的Warning首部是从HTTP/1.0的响应首部(Retry-After)演变过来的。该首部通常会告知用户一些与缓存相关的问题的警告。格式如下:
Warning: [警告码][警告的主机:端口号]"[警告内容]"([日期时间])
三、请求首部字段
- Accept
Accept首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。
媒体类型:
媒体类型 | 代码 |
---|---|
文本文件 | text/html, text/plain, text/css |
图片文件 | image/jpeg, image/gif, image/png |
视频文件 | video/mpeg, video/quicktime |
应用程序使用的二进制文件 | application\octet-stream, application/zip |
若想要给显示的媒体类型增加优先级,则使用q=来额外表示权重值[插图],用分号(;)进行分隔。权重值q的范围是0~1(可精确到小数点后3位),且1为最大值。不指定权重q值时,默认权重为q=1.0。
当服务器提供多种内容时,将会首先返回权重值最高的媒体类型。
-
Accept-Charset
Accept-Charset首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。 -
Accept-Encoding
Accept-Encoding首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。
Accept-Encoding: gzip, deflate, compress, identity
可使用星号(*)作为通配符,指定任意的编码格式。 -
Accept-Language
首部字段Accept-Language用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。
Accept-Language: zh-cn, zh; q=0.7, en-us, en; q=0.3
-
Authorization
首部字段Authorization是用来告知服务器,用户代理的认证信息(证书值)。 -
Expect
客户端使用首部字段Expect来告知服务器,期望出现的某种特定行为。
因服务器无法理解客户端的期望作出回应而发生错误时,会返回状态码417 Expectation Failed。 -
From
首部字段From用来告知服务器使用用户代理的用户的电子邮件地址。 -
Host
首部字段Host会告知服务器,请求的资源所处的互联网主机名和端口号。Host首部字段在HTTP/1.1规范内是唯一一个必须被包含在请求内的首部字段。
请求被发送至服务器时,请求中的主机名会用IP地址直接替换解决。但如果这时,相同的IP地址下部署运行着多个域名,那么服务器就会无法理解究竟是哪个域名对应的请求。因此,就需要使用首部字段Host来明确指出请求的主机名。 -
If-Match
形如If-xxx这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
-
If-Modified-Since
首部字段If-Modified-Since,它会告知服务器若If-Modified-Since字段值早于资源的更新时间,则希望能处理该请求。 -
If-None-Match
首部字段If-None-Match用于指定If-None-Match字段值的实体标记(ETag)值与请求资源的ETag不一致时,它就告知服务器处理该请求。 -
If-Range
首部字段If-Range告知服务器若指定的If-Range字段值(ETag值或者时间)和请求资源的ETag值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。 -
If-Unmodified-Since
告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。 -
Max-Forwards
通过TRACE方法或OPTIONS方法,发送包含首部字段Max-Forwards的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。服务器在往下一个服务器转发请求之前,会将Max-Forwards的值减1后重新赋值。当服务器接收到Max-Forwards值为0的请求时,则不再进行转发,而是直接返回响应。
加上Max_Forwards可用来探测请求失败的原因,避免如下陷入循环:
-
Proxy-Authorization
接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需要的信息。 -
Range
对于只需获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的指定范围。 -
Referer
首部字段Referer会告知服务器请求的原始资源的URI。 -
TE
首部字段TE会告知服务器客户端能够处理响应的传输编码方式及相对优先级。
首部字段TE除指定传输编码之外,还可以指定伴随trailer字段的分块传输编码的方式。应用后者时,只需把trailers赋值给该字段值。 -
User-Agent
首部字段User-Agent会将创建请求的浏览器和用户代理名称等信息传达给服务器。
五、响应首部字段
-
Accept-Ranges
首部字段Accept-Ranges是用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。
可指定的字段值有两种,可处理范围请求时指定其为bytes,反之则指定其为none。 -
Age
首部字段Age能告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。
若创建该响应的服务器是缓存服务器,Age值是指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时必须加上首部字段Age。 -
ETag
首部字段ETag能告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的ETag值。
强ETag值:不论实体发生多么细微的变化都会改变其值。
弱ETag值:只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变ETag值。这时,会在字段值最开始处附加W/。 -
Location
使用首部字段Location可以将响应接收方引导至某个与请求URI位置不同的资源。
5. Proxy-Authenticate
首部字段Proxy-Authenticate会把由代理服务器所要求的认证信息发送给客户端。
-
Retry-After
首部字段Retry-After告知客户端应该在多久之后再次发送请求。主要配合状态码503 ServiceUnavailable响应,或3xx Redirect响应一起使用。 -
Server
首部字段Server告知客户端当前服务器上安装的HTTP服务器应用程序的信息。 -
Vary
-
WWW-Authenticate
首部字段WWW-Authenticate用于HTTP访问认证。它会告知客户端适用于访问请求URI所指定资源的认证方案(Basic或是Digest)和带参数提示的质询(challenge)。状态码401Unauthorized响应中,肯定带有首部字段WWW-Authenticate。
WWW-Authenticate: Basic realm="Usagidesign Auth
realm字段的字符串是为了辨别请求URI指定资源所受到的保护策略。
六、实部首部字段
-
Allow
首部字段Allow用于通知客户端能够支持Request-URI指定资源的所有HTTP方法。当服务器接收到不支持的HTTP方法时,会以状态码405 Method Not Allowed作为响应返回。与此同时,还会把所有能支持的HTTP方法写入首部字段Allow后返回。 -
Content-Encoding
首部字段Content-Encoding会告知客户端服务器对实体的主体部分选用的内容编码方式。 -
Content-Language
首部字段Content-Language会告知客户端,实体主体使用的自然语言(指中文或英文等语言)。 -
Content-Length
首部字段Content-Length表明了实体主体部分的大小(单位是字节)。对实体主体进行内容编码传输时,不能再使用Content-Length首部字段。 -
Content-Location
首部字段Content-Location给出与报文主体部分相对应的URI。和首部字段Location不同,Content-Location表示的是报文主体返回资源对应的URI。 -
Content-MD5
首部字段Content-MD5是一串由MD5算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。
-
Content-Range
针对范围请求,返回响应时使用的首部字段Content-Range,能告知客户端作为响应返回的实体的哪个部分符合范围请求。字段值以字节为单位,表示当前发送部分及整个实体大小。 -
Content-Type
首部字段Content-Type说明了实体主体内对象的媒体类型。和首部字段Accept一样,字段值用type/subtype形式赋值。参数charset使用iso-8859-1或euc-jp等字符集进行赋值。 -
Expires
首部字段Expires会将资源失效的日期告知客户端。缓存服务器在接收到含有首部字段Expires的响应后,会以缓存来应答请求,在Expires字段值指定的时间之前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。
当首部字段Cache-Control有指定max-age指令时,比起首部字段Expires,会优先处理max-age指令。 -
Last-Modified
首部字段Last-Modified指明资源最终修改的时间。
七、为Cookie服务的首部字段
- Set-Cookie
当服务器准备开始管理客户端的状态时,会事先告知各种信息。以下为Set-Cookie字段的属性:
- Cookie
首部字段Cookie会告知服务器,当客户端想获得HTTP状态管理支持时,就会在请求中包含从服务器接收到的Cookie。接收到多个Cookie时,同样可以以多个Cookie形式发送。
八、其他首部字段
HTTP首部字段是可以自行扩展的。所以在Web服务器和浏览器的应用上,会出现各种非标准的首部字段。
- X-Frame-Options
首部字段X-Frame-Options属于HTTP响应首部,用于控制网站内容在其他Web网站的Frame标签内的显示问题。其主要目的是为了防止点击劫持(clickjacking)攻击。
首部字段X-Frame-Options有以下两个可指定的字段值。
- DENY:拒绝
- SAMEORIGIN:仅同源域名下的页面(Top-level-browsing-context)匹配时许可。
- X-XSS-Protection
首部字段X-XSS-Protection属于HTTP响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器XSS防护机制的开关。
首部字段X-XSS-Protection可指定的字段值如下。
- 0 :将XSS过滤设置成无效状态
- 1 :将XSS过滤设置成有效状态
- DNT
首部字段DNT属于HTTP请求首部,其中DNT是Do Not Track的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。首部字段DNT可指定的字段值如下。
- 0 :同意被追踪
- 1 :拒绝被追踪
- P3P
首部字段P3P属于HTTP响应首部,通过利用P3P(The Platform for Privacy Preferences,在线隐私偏好平台)技术,可以让Web网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。
要进行P3P的设定,需按以下操作步骤进行。
步骤1: 创建P3P隐私
步骤2: 创建P3P隐私对照文件后,保存命名在/w3c/p3p.xml
步骤3: 从P3P隐私中新建Compact policies后,输出到HTTP响应中
07 | 确保Web安全的HTTPS
一、HTTP的缺点
- HTTP主要有以下不足:
- 通信使用明文(不加密),内容可能会被窃听。
- 不验证通信方的身份,因此有可能遭遇伪装。
- 无法证明报文的完整性,所以有可能已遭篡改。
- 通信加密方式
- 通信加密
通过和SSL(Secure SocketLayer,安全套接层)或TLS(Transport Layer Security,安全传输层协议)的组合使用,加密HTTP的通信内容。
与SSL组合使用的HTTP被称为HTTPS(HTTP Secure,超文本传输安全协议)或HTTP over SSL。 - 内容加密
把HTTP报文里所含的内容进行加密处理。
- 不验证通信方的身份就可能遭遇伪装
隐患:
- 无法确定请求发送至目标的Web服务器是否是按真实意图返回响应的那台服务器。有可能是已伪装的Web服务器。
- 无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。有可能是已伪装的客户端。
- 无法确定正在通信的对方是否具备访问权限。因为某些Web服务器上保存着重要的信息,只想发给特定用户通信的权限。
- 无意义的请求也会照单全收。无法阻止海量请求下的DoS攻击(Denial ofService,拒绝服务攻击)。
可使用SSl查明对手证书来辨明身份:
- 无法证明报文完整性,可能已遭篡改
常用的确定报文完整性的方法是MD5和SHA-1等散列值校验的方法,以及用来确认文件的数字签名方法。
二、HTTP+加密+完整性保护=HTTPS
- HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。
- SSL采用一种叫做公开密钥加密(Public-key cryptography)的加密处理方式。
-
共享密钥加密方式:
-
公开密钥加密方式:
-
HTTPS采用共享密钥加密和公开密钥加密两者并用的混合加密机制。
若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处理速度要慢。
在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。 -
公开密钥加密方式无法证明公开密钥本身就是货真价实的公开密钥。或许在公开密钥传输途中,真正的公开密钥已经被攻击者替换掉了。
-
公开密钥证书
-
证书的一个作用是用来证明作为通信一方的服务器是否规范,另外一个作用是可确认对方服务器背后运营的企业是否真实存在。拥有该特性的证书就是EV SSL证书(Extended Validation SSLCertificate)。
-
用以确认客户端的客户端证书
客户端证书存在的另一个问题点是,客户端证书毕竟只能用来证明客户端实际存在,而不能用来证明用户本人的真实有效性。例如银行支付客户端证书。 -
由自认证机构颁发的证书称为自签名证书
如果使用OpenSSL这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书。但该服务器证书在互联网上不可作为证书使用,似乎没什么帮助。 -
HTTPS的安全通信机制
步骤1: 客户端通过发送Client Hello报文开始SSL通信。报文中包含客户端支持的SSL的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。
步骤2: 服务器可进行SSL通信时,会以Server Hello报文作为应答。和客户端一样,在报文中包含SSL版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。
步骤3: 之后服务器发送Certificate报文。报文中包含公开密钥证书。
步骤4: 最后服务器发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束。步骤5: SSL第一次握手结束之后,客户端以Client Key Exchange报文作为回应。报文中包含通信加密中使用的一种被称为Pre-master secret的随机密码串。该报文已用步骤3中的公开密钥进行加密。
步骤6: 接着客户端继续发送Change Cipher Spec报文。该报文会提示服务器,在此报文之后的通信会采用Pre-master secret密钥加密。
步骤7: 客户端发送Finished报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
步骤8: 服务器同样发送Change Cipher Spec报文。
步骤9: 服务器同样发送Finished报文。
步骤10: 服务器和客户端的Finished报文交换完毕之后,SSL连接就算建立完成。当然,通信会受到SSL的保护。从此处开始进行应用层协议的通信,即发送HTTP请求。
步骤11: 应用层协议通信,即发送HTTP响应。
步骤12: 最后由客户端断开连接。断开连接时,发送close_notify报文。上图做了一些省略,这步之后再发送TCP FIN报文来关闭与TCP的通信。
(注:,应用层发送数据时会附加一种叫做MAC(Message Authentication Code)的报文摘要。MAC能够查知报文是否遭到篡改,从而保护报文的完整性。)
-
HTTPS使用SSL(Secure Socket Layer)和TLS(Transport Layer Security)这两个协议。
IETF以SSL3.0为基准,后又制定了TLS1.0、TLS1.1和TLS1.2。TSL是以SSL为原型开发的协议,有时会统一称该协议为SSL。当前主流的版本是SSL3.0和TLS1.0。 -
和使用HTTP相比,HTTPS网络负载可能会变慢2到100倍。在服务器和客户端都需要进行加密和解密的运算处理。因此从结果上讲,比起HTTP会更多地消耗服务器和客户端的硬件资源,导致负载增强。
-
如果是非敏感信息则使用HTTP通信,只有在包含个人信息等敏感数据时,才利用HTTPS加密通信。
08 | 确认访问用户身份的认证
一、何为认证
- 核对的信息通常是指以下:
- 密码:只有本人才会知道的字符串信息。
- 动态令牌:仅限本人持有的设备内显示的一次性密码。
- 数字证书:仅限本人(终端)持有的信息。
- 生物认证:指纹和虹膜等本人的生理信息。
- IC卡等:仅限本人持有的信息。
- HTTP使用的认证方法
- BASIC认证(基本认证)
- DIGEST认证(摘要认证)
- SSL客户端认证
- FormBase认证(基于表单认证)
二、BASIC认证
- BASIC认证的认证步骤
- BASIC认证虽然采用Base64编码方式,但这不是加密处理。在HTTP等非加密通信的线路上进行BASIC认证的过程中,如果被人窃听,被盗的可能性极高。
- 想再进行一次BASIC认证时,一般的浏览器却无法实现认证注销操作,这也是问题之一。
- BASIC认证使用上不够便捷灵活,且达不到多数Web网站期望的安全性等级,因此它并不常用。
三、DIGEST认证
- DIGEST认证步骤
- DIGEST认证提供了高于BASIC认证的安全等级,但是和HTTPS的客户端认证相比仍旧很弱。DIGEST认证提供防止密码被窃听的保护机制,但并不存在防止用户伪装的保护机制。
- DIGEST的MD5码的Key是怎么交换的?
四、SSL客户端认证
- SSL客户端认证的认证步骤:
- 步骤1: 接收到需要认证资源的请求,服务器会发送Certificate Request报文,要求客户端提供客户端证书。
- 步骤2: 用户选择将发送的客户端证书后,客户端会把客户端证书信息以Client Certificate报文方式发送给服务器。
- 步骤3: 服务器验证客户端证书验证通过后方可领取证书内客户端的公开密钥,然后开始HTTPS加密通信。
- SSL客户端认证采用双因素认证
第一个认证因素的SSL客户端证书用来认证客户端计算机,另一个认证因素的密码则用来确定这是用户本人的行为。
五、基于表单认证
- 基于表单的认证方法并不是在HTTP协议中定义的。
如果Session ID被第三方盗走,对方就可以伪装成你的身份进行恶意操作了。
2. 通常,一种安全的保存方法是,先利用给密码加盐(salt)[插图]的方式增加额外信息,再使用散列(hash)函数计算出散列值后保存。但是我们也经常看到直接保存明文密码的做法,而这样的做法具有导致密码泄露的风险。