JEP 114:TLS 服务器名称指示 (SNI) 扩展
概述
添加对 TLS 服务器名称指示(SNI)扩展的支持,以允许基于 SSL/TLS 协议的更灵活的安全虚拟主机和虚拟机基础设施。
动机
由于 TLS 协议的限制,在没有 SNI 扩展的情况下,HTTPS 服务器无法托管在虚拟主机基础架构和虚拟机基础架构中(多个域共享同一个 IP 地址)。在云计算时代,这个问题变得更加严重。
从 JDK 7 开始,SunJSSE 默认在客户端启用了 SNI 扩展。我们需要在 JDK 8 的服务器端支持 SNI 扩展,以支持虚拟主机和云计算市场。
几乎所有的主流浏览器都支持 SNI 扩展(来自维基百科):
- Internet Explorer 7 (Vista 或更高版本,非 XP)或更高版本
- Mozilla Firefox 2.0 或更高版本
- Opera 8.0 或更高版本(必须启用 TLS 1.1 协议)
- Android 上至少为 10.1 beta 版本的 Opera Mobile
- Google Chrome (Vista 或更高版本。XP 在 Chrome 6 或更新版本上,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 或更高版本中的 MobileSafari
- Windows Phone 7
- Maemo
以下 Web 服务器支持 SNI 扩展(来自维基百科):
- Apache 2.2.12 或更高版本,使用 mod_ssl(或者实验性的 mod_gnutls)
- 如果编译时启用了 TLS 支持的 Cherokee
- Lighttpd 1.4.x 和 1.5.x
- Nginx
描述
-
定义接口,以根据特定的服务器名称指示(Server Name Indication)选择特定的密钥管理器和信任管理器。
对于虚拟主机基础设施,即多个服务器托管在同一个平台中,具有相同的 IP 地址但不同的主机名,不同的服务器应使用不同的密钥管理器和信任管理器。
-
增加根据特定的服务器名称指示将连接委派给虚拟机的能力。
对于虚拟机基础设施,即不同服务器托管在不同的虚拟机中,具有不同的主机名但共享相同的主机 IP 地址,主机应能够根据特定的服务器名称指示将 SSL/TLS 连接委派给目标虚拟机。
替代方案
为了解决 Java 计算环境中的 TLS 问题,许多 ISP 不得不为每个 TLS/HTTPS 服务器单独分配一个新的 IP 地址,或者转而使用其他 TLS 实现作为代理。
测试
- 需要验证新接口是否按预期运行。
- 需要验证实现不会以意外方式破坏向后兼容性。
- 需要验证实现不会以意外方式带来新的互操作性问题。
- 需要验证即使服务器在委派模式下运行以支持虚拟机,也没有显著的性能影响。
影响
- JCP:对 JCP 无影响
- 其他 JDK 组件:对其他 JDK 组件无影响
- 兼容性:影响最小
- 安全性:对安全性无影响
- 可移植性:对可移植性的影响有限
- 用户界面:无图形用户界面
- 文档:需要记录新接口
- 国际化:影响最小,可能会添加新的错误消息
- 本地化:影响最小,可能会添加新的错误消息
- 法律:无法律问题
- 其他:无其他已知影响