协议链接

本协议描述了如何使用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. JavaSE基础知识(5)—面向对象(5.1类和对象概念、创建及内存分配)

    一.类和对象的相关概念 1.面向对象和面向过程的理解 面向对象和面向过程都属于解决问题的思考方式.面向过程:以执行者的角度思考问题,侧重于“怎么做”,比较适合解决小型项目面向对象:以指挥者的角度思考问 ...

  2. PHP开发——数组

    数组的概念 l  数组是一组数的集合.如:$arr = array(1,2,3,4,5,6) l  标量数据类型是一个值的容器,而数组就是多个值的容器. 数组的分类 l  枚举数组:数组元素的下标(索 ...

  3. springboot中使用ContextLoaderListener.getCurrentWebApplicationContext();获取WebApplicationContext为空问题

    WebApplicationContext applicationContext = ContextLoaderListener.getCurrentWebApplicationContext(); ...

  4. js常用判断和语法

    1.js获取选中的redio元素 var version = $('.version input[name="input1"]:checked').val();//单选框默认选中& ...

  5. 判断是否是json

    转:https://blog.csdn.net/dy_smile/article/details/46739251 function isJson(obj) { var isjson = typeof ...

  6. 选择困难症的福音——团队Scrum冲刺阶段-Day 4

    选择困难症的福音--团队Scrum冲刺阶段-Day 4 今日进展 编写提问部分 做了不同问题所对应的游戏选项,但关于游戏分类的界面还没有做完 增加功能 昨天在主界面增加"关于我们" ...

  7. Django获取数据库数据时根据id筛选

    filter(id__in=models.Teacher.objects.all()[0:5]) teacher_list = models.Teacher.objects.filter(id__in ...

  8. rabbitmq初学之连接测试

    Login was refused using authentication mechanism PLAIN. 用户名或密码没有设置,或者错误

  9. Java并发编程:volatile关键字

    volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...

  10. 提高Linux运维效率的命令行常用快捷键

    提高Linux运维效率的命令行常用快捷键 tab 命令或路径等的补全键,Linux最有用快捷键 Ctrl+a 光标回到命令行首 Ctrl+e 光标回到命令行尾 Ctrl+k 剪切(删除)光标处到行尾的 ...