rfc2818 --- HTTP Over TLS
本协议描述了如何使用TLS来对Internet上的HTTP进行安全加固。
2.1. Connection Initiation(链接初始化)
HTTP client同时也作为TLS client(后续统一称为client)。在建立链接的时候,由client初始化TCP链接,并发出TLS ClientHello报文来开始TLS协商。当TLS协商完成后,client可以初始化首个HTTP请求,所有HTTP数据都被标记为TLS"application data"。
2.2. Connection Closure(链接结束)
TLS提供了安全关闭链接的方式,当client/server接收到一个有效的closure alert(rfc5246 7.2.1章节)报文时,认为该链接上不会接收到后续数据,TLS在结束链接前必须交换closure alert。但在实现中,当一端发送了closure alert之后,它可能会直接关闭链接而无需等待对端回复closure alert(此时上层应用应该接收了所有需要的数据),这种实现称之为"incomplete close",该实现可能用于重用tls session的场景。
RFC2246中描述了一种场景,在接受到首个closure alert之前接收到了(premature close ,如底层tcp断链)断链请求,此时不能重用该session。这种情况下需要处理HTTP数据可能被截断的问题。
2.2.1. Client Behavior(客户端行为)
由于HTTP通过执行关闭连接操作来表示数据传输的正常终止,因此当client遇到premature close的情况时,必须将其视为一种错误行为并假设已经接收到的数据可能会被截断。在一些情况下,HTTP协议允许client判断是否发生了数据截断,当接收到一个完整的数据回复时,client可能会"[be] strict when sending and tolerant when receiving" [RFC1958]容忍这些错误。如下两种情景需要特别注意:
- HTTP响应中不存在Content-Length header字段:这种情况下,由于数据长度字段是由产生premature close的server填写的,无法区分该close是否是攻击者发出的
- 在接收完所有数据前,HTTP响应中存在合法的Content-Length header字段:由于TLS没有提供文档层面的保护,因此无法判断是否是server端误算了Content-Length还是攻击者截断了数据
(如上两种情况用于处理截断攻击,如果此时http首部不存在Content-Length,该报文是不可信的,且如果报文的Content-Length和实际数据不匹配也是不可信的。但接收到一个有效的报文,即Content-Length与实际数据匹配时,做特殊处理,见下文)
当client遇到premature close时,如果此时client接收到了Content-Length的数据,则认为是链接正常完成。
client在检测到incomplete close时应该进行优雅恢复,可能会重用TLS session
Client在结束链接前必须发送closure alert报文
Client在没有准备好接受更多数据时,可能会选择关闭链接而不等待server回复closure alert,这样会使得server处于incomplete close状态
2.2.2. Server Behavior(服务端行为)
RFC 2616 允许HTTP client在任意时间关闭链接,并要求server进行优雅恢复。server应该应对client造成的incomplete close,sever也应该重用这种情况下关闭的TLS session。
在使用非长连接的情况下,server端通常会通过关闭链接来发送数据传输结束信号。当HTTP使用Content-Length时,client端可能已经发送closure alert并断开链接。
server在关闭链接前必须尝试跟client交互closure alerts。server可能在发送closure alerts之后关闭链接,这样会使得client处于incomplete close状态
2.3. Port Number(端口号)
建立链接时,HTTP server期望接收的首数据为Request-Line(rfc2616),TLS server(即http/TLS server)期望接收的首数据为ClientHello。因此HTTP和TLS需要允许在不同的端口上以区分不同的协议类型。当HTTP/TLS允许在TCP/IP之上,默认端口为443。TLS假定仅允许在面向链接的数据流之上。
2.4. URI Format(URI 格式)
HTTPS/TLS通过"https"来与"http"协议进行区分
3. Endpoint Identification
3.1. Server Identity
通常HTTP/TLS 请求与URI关联,因此client需要知道server的hostname,并且将其与server Certificate消息中的server identity进行校验,以防止中间人攻击。
如果client拥有与server identity相关的额外信息,有可能忽略对hostname的校验(如客户端连接的机器的地址和hostname是动态的,但client知道server 提供的证书),在这种情况下,会尽可能减少可接受证书的范围,以防止中间人攻击。特殊场景下,client可能会忽略server的identity,但必须意识到这种行为可能导致的攻击。
证书中如果subjectAltName(SAN)出现了dNSName,必须将该处定义的内容作为identity,否则使用Common Name字段作为identity。Certification Authorities鼓励使用dNSName。
如果证书中出现多种类型的identity(如多个dNSName名称,匹配任意一个即可),可能会包含通配符"*",表示可以匹配任意单个域名或域名段。如*.a.com匹配foo.a.com,但不匹配bar.foo.a.com。f*.com匹配foo.com,但不匹配bar.com(即通配符域名证书只匹配同级别的通配域名,不能跨级匹配)
一些场景下,URI使用IP而非hostname,这种情况下,证书中必须出现iPAddress subjectAltName且必须匹配URI中的IP。
如果hostname不匹配证书的identity,client端必须通知用户(是否继续连接)或结束链接(给出错误证书提示)。automated client必须记录该错误日志到审计日志(audit log --如linux的审计日志功能)并关闭连接
在很多情况下,URI的源不可信,此时需要检查server提供的证书的有效性,防止中间人攻击。
3.2. Client Identity
通常server并不了解client的identity,因此无法对client进行校验。反之,则应该对client进行校验
rfc2818 --- HTTP Over TLS的更多相关文章
- 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信
接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...
- 协议森林17 我和你的悄悄话 (SSL/TLS协议)
作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. TLS名为传输层安全协议(Transport Layer Protocol),这个协议是一套加密的 ...
- Paypal开发中遇到请求被中止: 未能创建 SSL/TLS 安全通道及解决方案
最近在基于ASP.NET上开发了Paypal支付平台,在ASP.NET开发的过程中没有遇到这个问题,但是引用到MVC开发模式中的时候就出现了"未能创建 SSL/TLS 安全通道及解决方案&q ...
- gRPC源码分析1-SSL/TLS
引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...
- openssl、x509、crt、cer、key、csr、ssl、tls 这些都是什么鬼?
今天尝试在mac机上搭建docker registry私有仓库时,杯具的发现最新的registry出于安全考虑,强制使用ssl认证,于是又详细了解linux/mac上openssl的使用方法,接触了一 ...
- JavaMail: SSL vs TLS vs STARTTLS
SSL vs TLS vs STARTTLS There's often quite a bit of confusion around the different terms SSL, TLS an ...
- 【svn】SSL error: A TLS warning alert has been received的解决方法
第一次用svn(>_<),结果在运行下面语句时,svn很不友好的报错了..... svn co http:10.11.12.13/test1/test2 . 报错信息: svn: OPTI ...
- 【转】安全传输协议SSL和TLS及WTLS的原理
一.首先要澄清一下名字的混淆 1.SSL(Secure Socket Layer)是Netscape公司设计的主要用于WEB的安全传输协议.这种协议在WEB上获得了广泛的应用. 2.IETF将SSL作 ...
- Centos6 yum安装openldap+phpldapadmin+TLS+双主配置
原文地址:http://54im.com/openldap/centos-6-yum-install-openldap-phpldapadmin-tls-%E5%8F%8C%E4%B8%BB%E9%8 ...
随机推荐
- Java15-java语法基础(十四)抽象类
Java15-java语法基础(十四)抽象类 一.抽象类的作用 三个类都有"执行任务"的方法,分别在这三个类中进行定义,因此需要重复编写代码,降低了程序开发效率,且增加了程序出现错 ...
- 大型互联网 b2b b2c o2o 电子商务微服务云平台
鸿鹄云商大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B2C.C2C.O2O.新零售.直播电商等子平台. 分布式.微服务.云架构电子商务平台 java ...
- Some Websites To Learning Laravel
https://learninglaravel.net/ https://learnku.com/laravel
- leveldb 学习记录(五)SSTable格式介绍
本节主要记录SSTable的结构 为下一步代码阅读打好基础,考虑到已经有大量优秀博客解析透彻 就不再编写了 这里推荐 https://blog.csdn.net/tankles/article/det ...
- Available Captures for Rook LT999
On an 8 x 8 chessboard, there is one white rook. There also may be empty squares, white bishops, an ...
- Spring 的属性注入
一.注入方式 (1)set方法注入 (2)构造函数注入 (3)p名称空间注入 (4)spel注入 二.复杂类型注入
- abaqus查询网格相关
怎样查询网格中总共有多少单元和节点: 可以进入mesh模块----tools----query----mesh----下面选择select elements----选中所有单元----鼠标中键就可以显 ...
- Beta冲刺 (3/7)
Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 组员1(组长)柯奇豪 过去两天完成了哪些任务 熟悉并编写小程序的自定义控件 编辑文 ...
- visual2017专业版MFC编程环境搭建及第一个MFC程序的创建
1.MFC介绍及环境搭建 MFC全程为Microsoft Foundation class Library,即微软的基本类库,MFC实际上是一个庞大的文件库,它由指向文件和源文件组成. 首先,打开vi ...
- 长方体类Java编程题
1. 编程创建一个Box类(长方体),在Box类中定义三个变量,分别表示长方体的长(length).宽(width)和高(heigth),再定义一个方法void setBox(int l, int w ...