Skip to content

JEP 114: TLS Server Name Indication (SNI) Extension | TLS 服务器名称指示(SNI)扩展

摘要

增加对 TLS 服务器名称指示(SNI)扩展的支持,以允许基于 SSL/TLS 协议的更灵活的安全虚拟托管和虚拟机基础架构。

动机

由于 TLS 协议的限制,如果没有 SNI 扩展,HTTPS 服务器无法在虚拟托管基础架构和虚拟机基础架构中托管,其中多个域共享相同的 IP 地址。在云计算时代,这个问题变得更加严重。

SunJSSE 从 JDK 7 开始默认在客户端启用了 SNI 扩展。我们需要在 JDK 8 中支持服务器端的 SNI 扩展,以支持虚拟托管和云计算市场。

几乎所有主要的浏览器都支持 SNI 扩展(来自 Wikipedia):

  • Internet Explorer 7(Vista 或更高版本,不包括 XP)或更高版本
  • Mozilla Firefox 2.0 或更高版本
  • Opera 8.0 或更高版本(必须启用 TLS 1.1 协议)
  • Opera Mobile 在 Android 上至少为 10.1 beta 版本
  • Google Chrome(Vista 或更高版本。Chrome 6 或更高版本上的 XP,Chrome 5.0.342.1 或更高版本上的 OS X 10.5.7 或更高版本)
  • Safari 2.1 或更高版本(Mac OS X 10.5.6 或更高版本和 Windows Vista 或更高版本)
  • Apple iOS 4.0 或更高版本上的 MobileSafari
  • Windows Phone 7
  • Maemo

以下 Web 服务器支持 SNI 扩展(来自 Wikipedia):

  • 使用 mod_ssl 的 Apache 2.2.12 或更高版本(或者使用实验性的 mod_gnutls)
  • 如果编译时支持 TLS,则 Cherokee 支持
  • Lighttpd 1.4.x 和 1.5.x
  • Nginx

描述

  1. 定义接口,以便为特定的服务器名称指示选择特定的密钥管理器和信任管理器。

    对于虚拟托管基础架构,即在同一平台上托管具有相同 IP 地址和不同主机名的多个服务器,不同的服务器应使用不同的密钥管理器和信任管理器。

  2. 增加根据特定服务器名称指示将连接委托给虚拟机的能力。

    对于虚拟机基础架构,即在不同虚拟机中托管具有不同主机名但具有相同主机 IP 地址的不同服务器,主机应该能够根据特定的服务器名称指示将 SSL/TLS 连接委托给目标虚拟机。

替代方案

为了在 Java 计算环境中解决 TLS 问题,许多 ISP 不得不为每个 TLS/HTTPS 服务器单独分配一个新的 IP 地址,或者切换到使用其他 TLS 实现作为代理。

测试

  1. 需要验证新接口是否按预期工作。
  2. 需要验证实现是否不会以意外的方式破坏向后兼容性。
  3. 需要验证实现是否不会以意外的方式引入新的互操作性问题。
  4. 需要验证即使服务器在委托模式下工作以支持虚拟机,也不会对性能产生显著影响。

影响

  • JCP:对 JCP 无影响
  • 其他 JDK 组件:对其他 JDK 组件无影响
  • 兼容性:影响极小
  • 安全性:对安全性无影响
  • 可移植性:对可移植性影响有限
  • 用户界面:无图形用户界面
  • 文档:需要为新接口编写文档
  • 国际化:影响极小,可能会添加新的错误消息
  • 本地化:影响极小,可能会添加新的错误消息
  • 法律:无法律问题
  • 其他:已知无其他影响