1.介绍

HTTP[RFC2616]最初是在INTERNET上不用密码的应用。但随着HTTP的敏感性应用日益增加,对安全性的要求也随之增加。SSL及其后继TLS[RFC2246]提供了面向通道的安全性。本文介绍怎样在TLS之上应用HTTP。

相关术语

在本文中的关键字“必须”,“必须不”,“要求”,“应该”,“不应该”和“可能”的解释见[RFC2119]。

2. TLS之上的HTTP

从概念上讲,HTTP/TLS非常简单。简单地在TLS上应用HTTP,如同在TCP上应用HTTP一样。

2.1 初始化连接

作为HTTP客户的代理同时也应作为TLS的客户。它应该向服务器的适当端口发起一个连接,然后发送TLS ClientHello来开始TLS握手。当TLS握手完成,客户可以初始化第一个HTTP请求。所有的HTTP数据必须作为TLS的“应用数据”发送。正常的HTTP行为,包括保持连接,应当被遵守。

2.2 关闭连接

TLS提供了安全关闭连接的机制。当收到一个有效的关闭警告时,实现上必须保证在这个连接上不再接收任何数据。TLS的实现在关闭连接之前必须发起交换关闭请求。TLS实现可能在发送关闭请求后,不等待对方发送关闭请求即关闭该连接,产生一个“不完全的关闭”。注意:这样的实现可能选择重用该对话。这只应在应用了解(典型的是通过检测HTTP的消息边界)它已收到所有它关心的数据的情况下进行。

如[RFC2246]中所定义的,任何未接收一个有效的关闭警告(一个“未成熟关闭”)即接到一个连接关闭必须不重用该对话。注意:一个未成熟请求并不质疑数据已被安全地接收,而仅意味着接下来数据可能被截掉。由于TLS并不知道HTTP的请求/响应边界,为了解数据截断是发生在消息内还是在消息之间,有必要检查HTTP数据本身(即Content-Length头)。

2.2.1 客户行为

由于HTTP使用连接关闭表示服务器数据的终止,客户端实现上对任何未成熟的关闭要作为错误对待,对收到的数据认为有可能被截断。在某些情况下HTTP协议允许客户知道截断是否发生,这样如果客户收到了完整的应答,则在遵循“严出松入[RFC1958]”的原则下可容忍这类错误,经常数据截断不体现在HTTP协议数据中;有两种情况特别值得注意:

一个无Content-Length头的HTTP响应。在这种情况下数据长度由连接关闭请求通知,我们无法区分由服务器产生的未成熟关闭请求及由网络攻击者伪造的关闭请求。

一个带有有效Content-Length头的HTTP响应在所有数据被读取完之前关闭。由于TLS并不提供面向文档的保护,所以无法知道是服务器对Content-Length计算错误还是攻击者已截断连接。

以上规则有一个例外。当客户遇到一个未成熟关闭时,客户把所有已接收到的数据同Content-Length头指定的一样多的请求视为已完成。

客户检测到一个未完成关闭时应予以有序恢复,它可能恢复一个以这种方式关闭的TLS对话。

客户在关闭连接前必须发送关闭警告。未准备接收任何数据的客户可能选择不等待服务器的关闭警告而直接关闭连接,这样在服务器端产生一个不完全的关闭。

2.2.2 服务器行为

RFC2616允许HTTP客户在任何时候关闭连接,并要求服务器有序地恢复它。特别是,服务器应准备接收来自客户的不完全关闭,因为客户往往能够判断服务器数据的结束。服务器应乐于恢复以这种方式关闭的TLS对话。

实现上注意:在不使用永久连接的HTTP实现中,服务器一般期望能通过关闭连接通知数据的结束。但是,当Content-Length被使用时,客户可能早已发送了关闭警告并断开了连接。

服务器必须在关闭连接前试图发起同客户交换关闭警告。服务器可能在发送关闭警告后关闭连接,从而形成了客户端的不完全关闭。

2.3端口号

HTTP服务器期望最先从客户收到的数据是Request-Line production。TLS服务器期望最先收到的数据是ClientHello。因此,一般做法是在一个单独的端口上运行HTTP/TLS,以区分是在使用哪种协议。当在TCP/IP连接上运行HTTP/TLS时,缺省端口是443。这并不排除HTTP/TLS运行在其它传输上。TLS只假设有可靠的、面向连接的数据流。

2.4 URI格式

HTTP/TLS和HTTP的URI不同,使用协议描述符https而不是http。使用HTTP/TLS的一个URI例子是:

https://www.example.com/~smith/home.html

3 端标识

3.1 服务器身份

通常,解析一个URI产生HTTP/TLS请求。结果客户得到服务器的主机名。若主机名可用,为防止有人在中间攻击,客户必须把它同服务器证书信息中的服务器的身份号比较检查。

若客户有相关服务器标志的外部信息,主机名检查可以忽略。(例如:客户可能连接到一个主机名和IP地址都是动态的服务器上,但客户了解服务器的证书信息。)在这种情况下,为防止有人攻击,尽可能缩小可接受证书的范围就很重要。在特殊情况下,客户简单地忽略服务器的身份是可以的,但必须意识到连接对攻击是完全敞开的。

若dNSName类型的subjectAltName扩展存在,则必须被用作身份标识。否则,在证书的Subject字段中必须使用Common Name字段。虽然使用Common Name是通常的做法,但不受赞成,而Certification Authorities被鼓励使用dNSName。

使用[RFC2459]中的匹配规则进行匹配。若在证书中给定类型的身份标识超过一个(也就是,超过一个dNSName和集合中的相匹配),名字可以包括通配符*表示和单个域名或其中的一段相匹配。例如:*.a.com和foo.a.com匹配但和bar.foo.a.com不匹配。f*.com和foo.com匹配但和bar.com不匹配。

在某些情况下,URI定义的不是主机名而是IP地址。在这种情况下,证书中必须有iPAddress subjectAltName字段且必须精确匹配在URI中的IP地址。

若主机名和证书中的标识不相符,面向用户的客户端必须或者通知用户(客户端可以给用户机会来继续连接)或终止连接并报证书错。自动客户端必须将错误记录在适当的审计日志中(若有的话)并应该终止连接(带一证书错)。自动客户端可以提供选项禁止这种检查,但必须提供选项使能它。

注意,在很多情况下URI本身是从不可信任的源得到的。以上描述的检查并未提供对危害源的攻击的保护。例如,若URI是从一个未采用HTTP/TLS的HTML页面得到的,某个人可能已在中间已替换了URI。为防止这种攻击,用户应仔细检查服务器提供的证书是否是期望的。

3.2 客户标识

典型情况下,服务器并不知道客户的标识是什么也就无法检查(除非有合适的CA证书)。若服务器知道的话(通常是在HTTP和TLS之外的源得到的),它应该象上面描述的那样检查。

文档下载    《RFC2818-TLS之上的HTTP.doc》

原创文章,转载请注明: 转载自成长的企鹅

本文链接地址: TLS之上的HTTP

关于我:成长的企鹅简介

TLS之上的HTTP的更多相关文章

  1. gRPC源码分析1-SSL/TLS

    引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...

  2. TLS版本

    常见应用: https其实就是建构在SSL/TLS之上的 http协议. 1) setProtocol="TLS" will enable SSLv3 and TLSv1 2) s ...

  3. TLS/SSL 梳理

    数据加密通篇都是为了防止第三方的劫持伪造,保证连接安全, 毫无遮掩的明文传输只有民风淳朴的时候才是安全的. 先是一些基础的内容: 对称加密 最开始为了对数据进行加密,使用的是对称加密算法,即双方协商好 ...

  4. HTTP、HTTP2

      HTTP.HTTP2.0.SPDY.HTTPS 你应该知道的一些事 原文链接:http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-readi ...

  5. HTTP协议请求响应过程和HTTPS工作原理

    HTTP协议 HTTP协议主要应用是在服务器和客户端之间,客户端接受超文本. 服务器按照一定规则,发送到客户端(一般是浏览器)的传送通信协议.与之类似的还有文件传送协议(file transfer p ...

  6. 理解HTTP和HTTPS的区别

    原问转载于https://www.mysubmail.com/chs/blog/view/47 这两天闲来无事,在网上看了一下,发现 HTTP 和 HTTPS 的区别很受关注,多位大牛做了很详细的阐述 ...

  7. Hosts知多少?

    Hosts知多少?   老D hosts 定期更新地址: http://laod.cn/hosts/2016-google-hosts.html   老Dhosts 页面长期更新最新Google.谷歌 ...

  8. RFC(请求注解)--各种协议-标准

    转自:http://blog.sina.com.cn/s/blog_65d6476a0101cj8n.html RFC(Request For Comments)-意即“请求注解”,包含了关于Inte ...

  9. java技术知识点

    1   自我介绍 2  做过的项目 (Java 基础) 3  Java的四个基本特性(抽象.封装.继承,多态),对多态的理解(多态的实现方式)以及在项目中那些地方用到多态 Java的四个基本特性 ◦  ...

随机推荐

  1. JavaBean中DAO设计模式介绍

    一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是client,简单的来说就是浏览器. 2.显示层:JSP/ ...

  2. 【百度地图API】如何制作公交线路的搜索?如331路

    原文:[百度地图API]如何制作公交线路的搜索?如331路 摘要: 从A点到B点的公交导航大家都知道怎么做了,那么单独查询331路公交车的公交路线,如何制作呢?我们一起来学习一下~ --------- ...

  3. 完整具体解释GCD系列(二)dispatch_after;dispatch_apply;dispatch_once

    原创Blog,转载请注明出处 本文阅读的过程中,如有概念不懂,请參照前专栏中之前的文章,假设还有疑惑,请留言. 这是我关于GCD专栏的地址 http://blog.csdn.net/column/de ...

  4. C#中使用ref 和 out 的一点认识

    ref 通常我们向方法中传递的是值,方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不会受到影响. 这种情况是通常的,当然还有另外一种情况,我们向方法传递 ...

  5. C语言练手自己编写学生成绩管理系统

    #include<stdio.h> #include<stdlib.h> /*定义学生结构体*/ struct Student { ]; ]; float Mark1; flo ...

  6. Fckeditor用法

    试Fckeditor版本号:2.6.3 眼下Fckeditor仅仅能用于基于ie内核的浏览器,假设要使用于chrome等浏览器,请使用ckeditor. 详细用法: 1.将解压后的fckeditor整 ...

  7. C# 窗口间传递数据

    C#两个窗口之间传递数据 1 公用变量值传递 public partial class Form1 : Form //parent form { public string name="&q ...

  8. View中的Razor使用

    View中的Razor使用   上一节:ASP.NET MVC5 + EF6 入门教程 (5) Model和Entity Framework 源码下载:点我下载 一.Razor简介 在解决方案资源管理 ...

  9. Linux的错误码

    在使用时需要包含头文件 #include <errno.h> merlin@tfAnalysis:~/projects/tfradius$ cat /usr/include/asm-gen ...

  10. HTML5表单提示placeholder属性兼容IE

    placeholder 属性提供可描述输入字段预期值的提示信息(hint). 该提示会在输入字段为空时显示,并会在字段获得焦点时消失. 注释:placeholder 属性适用于以下的 <inpu ...