协议链接

本协议描述了如何使用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的更多相关文章

  1. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

  2. 协议森林17 我和你的悄悄话 (SSL/TLS协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. TLS名为传输层安全协议(Transport Layer Protocol),这个协议是一套加密的 ...

  3. Paypal开发中遇到请求被中止: 未能创建 SSL/TLS 安全通道及解决方案

    最近在基于ASP.NET上开发了Paypal支付平台,在ASP.NET开发的过程中没有遇到这个问题,但是引用到MVC开发模式中的时候就出现了"未能创建 SSL/TLS 安全通道及解决方案&q ...

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

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

  5. openssl、x509、crt、cer、key、csr、ssl、tls 这些都是什么鬼?

    今天尝试在mac机上搭建docker registry私有仓库时,杯具的发现最新的registry出于安全考虑,强制使用ssl认证,于是又详细了解linux/mac上openssl的使用方法,接触了一 ...

  6. 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 ...

  7. 【svn】SSL error: A TLS warning alert has been received的解决方法

    第一次用svn(>_<),结果在运行下面语句时,svn很不友好的报错了..... svn co http:10.11.12.13/test1/test2 . 报错信息: svn: OPTI ...

  8. 【转】安全传输协议SSL和TLS及WTLS的原理

    一.首先要澄清一下名字的混淆 1.SSL(Secure Socket Layer)是Netscape公司设计的主要用于WEB的安全传输协议.这种协议在WEB上获得了广泛的应用. 2.IETF将SSL作 ...

  9. Centos6 yum安装openldap+phpldapadmin+TLS+双主配置

    原文地址:http://54im.com/openldap/centos-6-yum-install-openldap-phpldapadmin-tls-%E5%8F%8C%E4%B8%BB%E9%8 ...

随机推荐

  1. JSP的简单介绍

    什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写htm ...

  2. swap的实现(没有中间变量)

    两数交换最常用的方法 void swap(int &a,int &b) { int temp=a; a=b; b=temp; } 如果没有中间变量temp可以使用呢,还有其他的三种方法 ...

  3. vs2015调试断点无法命中

    问题描述: 我是从vc6.0的原工程导入的,用vs2015编译,在断点调试的时候遇到问题,断点无法命中; 修改方法:工程->属性->C/C++ 常规->调试信息格式->设置为C ...

  4. if语句和三元运算符的替换

    要求: 已经知道两个数,计算最大值 两个整数,比较大小 使用if还是三元 判断条件多,使用if 三元,必须有结果的, if 可以没有结果的*/public class IfElseDemo_1{ pu ...

  5. 【微信小程序开发】全局配置

    今天看看小程序全局配置. 上一篇[微信小程序开发]秒懂,架构及框架 配置,无非就是为了增加框架的灵活性,而定下的规则. 微信小程序的配置文件是一个树状结构,各个节点代表不同的配置项,小程序框架会解析这 ...

  6. mui.fire()触发自定义事件

    导读:添加自定义事件监听操作和标准js事件监听类似,可直接通过window对象添加,通过mui.fire()方法可触发目标窗口的自定义事件. 监听自定义事件 添加自定义事件监听操作和标准js事件监听类 ...

  7. linux mysql 5.7.25 安裝

    1.下载 https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz 2.解压 tar ...

  8. python3调用zabbix api

    前言 今天写了一个zabbix api,这里整理一下,过程中自己也学习了一些东西. 需求 我们需要查一个文件内容如下: cat /ops/flume_hosts node1 node2 需要把这个文件 ...

  9. Cura - CuraEngine - 架构分析

    参考: https://blog.csdn.net/justdoithai/article/details/52746094

  10. poj 2505 A multiplication game

    题目 题意:两个人轮流玩游戏,Stan先手,数字 p从1开始,Stan乘以一个2-9的数,然后Ollie再乘以一个2-9的数,直到谁先将p乘到p>=n时那个人就赢了,而且轮到某人时,某人必须乘以 ...