跳到主要内容

JEP 114:TLS 服务器名称指示 (SNI) 扩展

概括

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

动机

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

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

几乎所有主流浏览器都支持 SNI 扩展(来自维基百科):

  • Internet Explorer 7(Vista 或更高版本,而非 XP)或更高版本
  • Mozilla Firefox 2.0 或更高版本
  • Opera 8.0 或更高版本(必须启用 TLS 1.1 协议)
  • Android 上的 Opera Mobile 至少版本 10.1 beta
  • Google Chrome(Vista 或更高版本。Chrome 6 上的 XP 或更高版本 OS X 10.5.7 或 Chrome 5.0.342.1 或更高版本上的更高版本)
  • Safari 2.1 或更高版本(Mac OS X 10.5.6 或更高版本以及 Windows Vista 或更高版本)
  • Apple iOS 4.0 或更高版本中的 MobileSafar
  • Windows 手机 7
  • 前茂

以下 Web 服务器支持 SNI 扩展(来自维基百科):

  • Apache 2.2.12 或更高版本使用 mod_ssl(或者使用实验性 mod_gnutls)
  • Cherokee(如果编译时支持 TLS)
  • 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 组件没有影响
  • 兼容性:最小
  • 安全性:不影响安全性
  • 便携性:限制对便携性的影响
  • 用户界面:无图形用户界面
  • 文档:需要记录新接口
  • 国际化:影响最小,可能会添加新的错误消息
  • 本地化:影响最小,可能会添加新的错误消息
  • 法律:无法律问题
  • 其他:没有已知的其他影响