原文 https://datatracker.ietf.org/doc/html/rfc2818 HTTP Over TLS 基于TLS的HTTP

本文描述了如何使用 TLS 来保护 Internet 上的 HTTP 连接。 当前的做法是通过 SSL(TLS 的前身)对 HTTP 进行分层,通过使用不同的服务器端口来区分安全流量和不安全流量。 本文档记录了使用 TLS 的练习。 配套文档描述了一种在与普通 HTTP [RFC2817] 相同的端口上使用HTTP/TLS 的方法。

目录

1. 简介
    1.1. 需求术语
    2. 基于 TLS 的 HTTP
    2.1. 连接启动
    2.2. 连接关闭
    2.2.1. 客户端行为
    2.2.2. 服务器行为
    2.3. 端口号
    2.4. URI格式
    3. 端点识别
    3.1. 服务器身份
    3.2. 客户端身份
    参考
    安全注意事项
    作者地址
    完整的版权声明

1. 简介

HTTP [RFC2616] 最初是在互联网上明文使用的。但是,敏感应用程序越来越多地使用 HTTP 需要采取安全措施。 SSL 及其后继 TLS [RFC2246] 旨在提供面向通道的安全性。本文档描述了如何通过 TLS 使用 HTTP。

2. 基于 TLS 的 HTTP

从概念上讲,HTTP/TLS 非常简单。简单地使用 HTTP over TLS,就像使用 HTTP over TCP 一样。

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.服务器行为

RFC 2616 允许 HTTP 客户端随时关闭连接,并要求服务器正常恢复。特别是,服务器应该准备好接收来自客户端的不完整关闭,因为客户端通常可以确定服务器数据的结束时间。服务器应该愿意恢复以这种方式关闭的 TLS 会话。

实现说明:在不使用持久连接的 HTTP 实现中,服务器通常希望能够通过关闭连接来表示数据结束。但是,当使用 Content-Length 时,客户端可能已经发送了关闭警报并断开了连接。

在关闭连接之前,服务器必须尝试启动与客户端的关闭警报交换。服务器可以在发送关闭警报后关闭连接,从而在客户端生成不完整的关闭。

2.3.端口号

HTTP 服务器期望从客户端接收的第一个数据是 Request-Line 产品。 TLS 服务器(因此也是 HTTP/TLS 服务器)期望接收的第一个数据是 ClientHello。因此,通常的做法是在单独的端口上运行 HTTP/TLS,以区分正在使用的协议。当 HTTP/TLS 在 TCP/IP 连接上运行时,默认端口是 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.服务器身份

通常,HTTP/TLS 请求是通过取消引用 URI 生成的。因此,客户端知道服务器的主机名。如果主机名可用,客户端必须根据服务器证书消息中显示的服务器身份检查它,以防止中间人攻击。

如果客户端有关于服务器预期身份的外部信息,主机名检查可以省略。 (例如,客户端可能连接到一台地址和主机名是动态的机器,但客户端知道服务器将提供的证书。)在这种情况下,尽可能缩小可接受证书的范围很重要以防止中间人攻击。在特殊情况下,客户端简单地忽略服务器的身份可能是合适的,但必须理解这会使连接对主动攻击开放。

如果存在 dNSName 类型的 subjectAltName 扩展,则必须将其用作标识。否则,必须使用证书主题字段中的(最具体的)通用名称字段。虽然通用名称的使用是现有的做法,但它已被弃用,并鼓励证书颁发机构使用 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】(翻译)相关推荐

  1. 综述:基于GAN的图像翻译模型盘点

    作者丨薛洁婷 学校丨北京交通大学硕士生 研究方向丨图像翻译 图像翻译(Image translation)是将一个物体的图像表征转换为该物体的另一种图像表征,也就是找到一个函数能让 A 域图像映射到 ...

  2. Qt Linguist基于文本ID的翻译

    Qt Linguist基于文本ID的翻译 基于文本ID的翻译 使用文本ID进行国际化 使用文本ID进行本地化 高级用法 基于文本ID的翻译 文本ID转换机制是用于国际化和本地化的"工业力量& ...

  3. 计算机专利英语笔译,基于Trados2014的专利翻译实践报告-英语笔译专业论文.docx...

    基于Trados2014的专利翻译实践报告-英语笔译专业论文 Abstract Patent documents are a kind of publications making the new t ...

  4. python实现离线翻译_基于python实现百度翻译功能

    运行环境: python 3.6.0 今天处于练习的目的,就用 python 写了一个百度翻译,是如何做到的呢,其实呢就是拿到接口,通过这个接口去访问,不过中间确实是出现了点问题,不过都解决掉了 先晾 ...

  5. 网络爬虫:基于有道的文本翻译

    参考书籍:<零基础入门学习Python>小甲鱼 编著 1.下载网络上图片 现要在百度上下载一张图片,直接给出Python代码: import urllib.request #图片的网络地址 ...

  6. python软件菜单翻译_制作属于自己的翻译软件(基于PyQt5+Python+实时翻译)

    制作属于自己的翻译软件(基于PyQt5+Python+实时翻译) 翻译软件上传到github上. 源码地址: 源码 软件截图 主要的思想 界面方面 界面主要采用PyQt5的QtDesigner来制作, ...

  7. python软件菜单翻译_制作属于自己的翻译软件(基于PyQt5+Python+实时翻译)!

    制作属于自己的翻译软件(基于PyQt5+Python+实时翻译) @(目录) 翻译软件上传到github上. 源码地址: 软件截图 主要的思想 界面方面 界面主要采用PyQt5的QtDesigner来 ...

  8. Ai-WB2模组基于TLS的MQTT连接服务器使用示例

    前言 1. 准备工作 2. 连接路由器 3. 基于 TLS 的 MQTT 连接 5. 联系我们 1. 准备工作 需要准备的软硬件:Ai-WB2系列模组或者开发板,Type-C数据线 2. 连接路由器 ...

  9. 制作属于自己的翻译软件(基于PyQt5+Python+实时翻译)

    制作属于自己的翻译软件(基于PyQt5+Python+实时翻译) @(目录) 软件截图 主要的思想 界面方面 源码: https://github.com/LiYangSir/Translate    ...

最新文章

  1. Java总复习(二)
  2. Hibernate4.x之Session
  3. vba手机号码归属_Android手机号码归属地的查询
  4. 只知道大数据?你out了
  5. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第31篇]Game Hopping证明
  6. IntelliJ 启动不同端口的两个spring cloud项目
  7. 远端仓库初始化成裸仓库 git init --bare
  8. 为Autodesk Infrastructure Map Server(AIMS) Mobile Viewer创建自定义控件
  9. 二叉树中获取从根节点到某个节点的路径
  10. 机械动力学瑞利法matlab程序,工业机器人的动力学建模与仿真+MATLAB程序
  11. 跨界营销策划案例合集(共13份)
  12. android获取悬浮窗权限,Android 悬浮窗权限校验
  13. postman9.12汉化
  14. 【2021/7/19 更新】【梳理】简明操作系统原理 附录一 虚拟内存子系统案例选讲(VAX/VMS + Linux)(docx)
  15. 内核驱动 (二)Linux按键驱动分析
  16. 笛卡尔坐标为什么叫Cartesian coordinate而不是Descartes coordinate?
  17. html js鼠标滚轮事件,JS事件-鼠标滚轮事件
  18. Big Sur风格应用图标制作软件:Acon
  19. 独立站引流技巧和营销思路
  20. 1312_适用7z命令进行压缩与解压

热门文章

  1. 教程:个人深度学习工作站配置指南
  2. linux纯文本无法键入密码,Apple Mac OS X FileVault纯文本密码本地安全限制绕过漏洞...
  3. nRF52 PWM 使用
  4. 【数据攻略】字节面试真题(含答案)+100道面试题库
  5. 使用ingress暴露kubernetes集群内部的pod服务
  6. 本地apk安装是什么意思_移动端爬虫-安装模拟器
  7. 开关电源正负极两端加104电容的作用是什么?
  8. 若依开发文档手册[持续更新:拥抱初次使用若依的开发者]
  9. rp导入图片大小_Axure制作图像的放大与缩小效果的四种方式
  10. Python|泰坦尼克号幸存者画像