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
描述
定义接口,以便为特定的服务器名称指示选择特定的密钥管理器和信任管理器。
对于虚拟托管基础架构,即在同一平台上托管具有相同 IP 地址和不同主机名的多个服务器,不同的服务器应使用不同的密钥管理器和信任管理器。
增加根据特定服务器名称指示将连接委托给虚拟机的能力。
对于虚拟机基础架构,即在不同虚拟机中托管具有不同主机名但具有相同主机 IP 地址的不同服务器,主机应该能够根据特定的服务器名称指示将 SSL/TLS 连接委托给目标虚拟机。
替代方案
为了在 Java 计算环境中解决 TLS 问题,许多 ISP 不得不为每个 TLS/HTTPS 服务器单独分配一个新的 IP 地址,或者切换到使用其他 TLS 实现作为代理。
测试
- 需要验证新接口是否按预期工作。
- 需要验证实现是否不会以意外的方式破坏向后兼容性。
- 需要验证实现是否不会以意外的方式引入新的互操作性问题。
- 需要验证即使服务器在委托模式下工作以支持虚拟机,也不会对性能产生显著影响。
影响
- JCP:对 JCP 无影响
- 其他 JDK 组件:对其他 JDK 组件无影响
- 兼容性:影响极小
- 安全性:对安全性无影响
- 可移植性:对可移植性影响有限
- 用户界面:无图形用户界面
- 文档:需要为新接口编写文档
- 国际化:影响极小,可能会添加新的错误消息
- 本地化:影响极小,可能会添加新的错误消息
- 法律:无法律问题
- 其他:已知无其他影响