`
xcxinghai
  • 浏览: 31737 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

TLS之上的HTTP

阅读更多

111

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》

weixin

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

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

关于我:成长的企鹅简介

0
0
分享到:
评论

相关推荐

    基于Netty的WebSocket实现,使用注解快速实现websocket服务.rar

    WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许...Websocket使用ws或wss的统一资源标志符,类似于HTTPS,其中wss表示在TLS之上的Websocket.

    aws-c-io:这是适用于C的AWS开发工具包的模块。它处理应用程序协议的所有IO和TLS工作

    典型的用例是在已嵌入TLS的异步io之上编写类似Http之类的内容。所有平台和安全问题都已为您解决。 它被设计为轻巧,快速,便携式且灵活的,可用于多种领域的用例,例如:嵌入式,服务器,客户端和移动。 执照 该库...

    falcon:用于Ruby的高性能Web服务器,支持HTTP1,HTTP2和TLS

    Falcon是建立在 , , 和之上的多进程,多光纤机架兼容HTTP服务器。 每个请求都在轻量级光纤中执行,并且可以阻止上游请求,而不会延迟整个服务器进程。 Falcon本机支持HTTP / 1和HTTP / 2。动机最初,当我开发,我...

    HTTP协议详解需要可以下载

    协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信 ...常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常

    用于Ruby的高性能Web服务器,支持HTTP / 1,HTTP / 2和TLS。-Ruby开发

    每个请求都在轻量级光纤中执行,并且可以阻止上游请求,而Falcon是构建在异步,async-io,async-container和async-http之上的多进程,多光纤机架兼容HTTP服务器。 每个请求都在轻量级光纤中执行,并且可以阻止上游...

    k6:现代负载测试工具,使用 Go 和 JavaScript - https

    k6是一种现代负载测试工具,建立在在负载和性能测试行业多年的经验之上。 它提供了一个干净、平易近人的脚本 API、和以及灵活的配置。 这就是负载测试在 21 世纪的样子。 菜单 特征 安装 运行 k6 概述 需要帮助...

    Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法

    HTTPS(Hyper Text Transfer Protocol Secure),是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上进行传输的。HTTPS协议是在HTTP协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层...

    WCF消息安全模式之自定义用户名密码

    消息安全模式之UserName客户端身份验证需要服务器需要一个有效的可用于TLS 加密和向客户端验证服务身份的 X.509 证书,并且客户端必须信任此服务器证书。 这里使用http协议。建议安全上下文以后,使用共享安全上下文...

    sys-api:NodeJS 的模块化 System-API 框架 - 在 RestifyJS 之上

    NodeJS 的模块化 System-API 框架 - 在 RestifyJS 之上。 它是用 Coffeescript 编写并编译为 Javascript。 特征: 授权(可选 bcrypt,匿名) CORS(跨源资源共享) HTTP/S (TLS) 验证引擎 正文解析器(JSON,...

    利用Docker搭建本地https环境的完整步骤

    HTTPS 是将 HTTP 置于 SSL/TLS 之上,其效果是加密 HTTP 流量( traffic ),包括请求的 URL、结果页面、cookies、媒体资源和其他通过 HTTP 传输的内容。企图干扰 HTTPS 连接的人既无法监听流量,也无法更改其

    urllib3-1.26.13.zip 安装包,免费下载

    Python 的 urllib3 库是一个用于处理 HTTP 请求和响应的库,它建立在 Python 标准库的 urllib 模块之上,提供了更高级别、更健壮的 API。与标准库中的 urllib 和 urllib2 模块相比,urllib3 提供了更加友好和方便的...

    malloy:在boost之上构建的C ++ Web服务器库

    实用程序包装程序来设置boost::asio I / O上下文和辅助线程 HTTP客户端 Websocket客户端 发牌 该库是MIT许可的。 依赖项附带了自己的许可模型。 要求 构建(和使用)此库需要: 具有C ++ 20功能的编译器 CMake ...

    hummingbird:用Swift编写的轻巧,灵活的HTTP服务器框架

    蜂鸟用Swift编写的轻量级,灵活的...蜂鸟Hummingbird是在HummingbirdCore之上运行的轻量级且灵活的Web应用程序框架。 它被设计为需要最少数量的依赖项: swift-backtrace , swift-log , swift-nio , swift-nio-e

    async-http-client:基于 SwiftNIO 构建的 HTTP 客户端库

    异步HTTP客户端这个包提供了构建在 SwiftNIO 之上的简单 HTTP 客户端库。 该库提供以下内容: 异步和非阻塞请求方法简单的后续重定向(删除 cookie 标头) 流媒体下载TLS 支持Cookie 解析(但不是存储) 注意:您...

    kwik:Java中的QUIC客户端(和客户端库)实现。 支持带有“ Flupke”插件的HTTP3

    QUIC客户端Java库 Kwik是Java中协议的客户端实现。 QUIC是由IETF开发的... 如果您正在寻找Java HTTP3客户端,请查看 ,它是在Kwik之上构建的。 Kwik由Peter Doornbosch维护。 最新的最伟大的总是可以在上找到。 不

    websocket

    运行在TLS之上时,默认使用443端口。其协议标识符为ws,如果加密使用wss,服务器网址为URL,如: ws://www.example.com/ wss://www.example.com/ Webscoket具有以下优点: 较少的控制开销:在连接创建后,服务器和...

    mio_httpc:基于mio的异步和同步HTTP客户端

    mio_httpc是仅在mio之上运行的异步http客户端。 为了方便起见,它还为简单的单行阻塞HTTP调用提供了CallBuilder :: exec。 除了CallBuilder :: exec以外,任何呼叫都不会阻塞,即使是DNS解析也不会阻塞,因为它是...

    http_ng:下一代 HTTP 的描述

    这些问题,而不是稍微更快地提供超重量级页面,应该是对互联网上使用最广泛的协议之一进行改进的重点。 更好的身份验证 ,包括 2012 年的 IETF 草案,用于,将是一个很好的起点。 相互身份验证不需要用户通过网络...

    HTTPS为什么更安全,先看这些

    是建立在密码学基础之上的一种安全通信协议,严格来说是基于HTTP协议和SSL/TLS的组合。理解 HTTPS之前有必要弄清楚一些密码学的相关基础概念,比如:明文、密文、密码、密钥、对称加密、非对称加密、信息摘要、数字...

    huma:用于带有OpenAPI 3的Golang的Huma REST API框架

    该项目的目标是提供: 适用于Go开发人员的现代REST API后端框架由和描述对中间件,JSON / CBOR和其他功能的一流支持护栏防止常见错误永不过时的文档高质量的开发人员工具功能包括: 内置HTTP,HTTPS(TLS)和 之上的...

Global site tag (gtag.js) - Google Analytics