ftr*_*ter 8 java ssl client-side
关于使用传统SSL创建的IP到域映射问题,NHIN Direct 的安全和信任工作组正在进行讨论.如果HISP(由NHIN Direct定义)想要为提供商托管数千个NHIN Direct"健康域名",那么必须为这些域中的每个域购买IP将是"人为膨胀的成本".
由于Apache和OpenSSL最近发布了支持SNI扩展的TLS,因此可以使用SNI作为服务器端此问题的解决方案.但是,如果我们决定允许 NHINDirect传输层的服务器实现支持TLS + SNI,那么我们必须要求所有客户端也支持SNI.默认情况下,基于OpenSSL的客户端应该这样做,如果您的给定编程语言SSL实现不支持SNI,我们总是可以实现TLS + SNI感知客户端代理.看来使用OpenJDK的本机Java应用程序还不支持SNI,但我无法从该项目中得到直接的答案.我知道有OpenSSL Java库可用,但我不知道这是否可行.
你能否给我一个关于TLS + SNI支持Java客户端的"最新技术"总结?我需要一个Java实现者的观点.
JavaSE 7在JSSE中具有SNI支持.
http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements-7.html
注意,它似乎有问题,你可以在这里阅读:
SSL握手警报:自升级到Java 1.7.0以来unrecognized_name错误
也可以使用某些行修补SUN JDK(bootclasspath)以使服务器SNI正常工作.
类:sun.security.ssl.ServerHandshaker
添加字段
    /** Use for SNI */
    private ServerNameExtension serverNameExtension = null;
补丁方法clientHello(添加这些行)
    /* Use for SNI */
    this.serverNameExtension = (ServerNameExtension)mesg.extensions.get(ExtensionType.EXT_SERVER_NAME);
补丁方法setupPrivateKeyAndChain(更改)
    if (this.conn != null) { alias = km.chooseServerAlias(algorithm      , null, this.conn);
    } else                 { alias = km.chooseEngineServerAlias(algorithm, null, this.engine); }
to
    final Principal[] principals = (this.serverNameExtension == null) ? null : this.serverNameExtension.getHostnamePrincipals();
    if (this.conn != null) { alias = km.chooseServerAlias(algorithm      , principals, this.conn);
    } else                 { alias = km.chooseEngineServerAlias(algorithm, principals, this.engine); }
添加到类sun.security.ssl.ServerNameExtension
static final class ServerNamePrincipal implements Principal {
    private final String name;
    ServerNamePrincipal(final String name) { this.name = name; }
    @Override public String getName() { return this.name; }
    @Override public String toString() { return this.name; }
}
public Principal[] getHostnamePrincipals() {
    final List<Principal> principals = new LinkedList<>();
    for(final ServerName name : this.names) {
        if(name.type == NAME_HOST_NAME) { principals.add(new ServerNamePrincipal(name.hostname)); }
    }
    return principals.toArray(new Principal[principals.size()]);
}
小智 3
我正在和 ftrotter 做同一个项目。
请注意支持数千个域的要求。我认为 SAN 不会放弃芥蒂,原因有二。首先,证书的大小将变得巨大,这可能至少会导致性能问题。其次,这些域名将会频繁出现和消失,尤其是在 NHIN Direct 的早期。恕我直言,每次域出现或消失时都必须更新证书的操作负担将是不可接受的。
应 ftrotter 的要求,我对 java、TLS 和 SNI 以及其他实现基于命名的虚拟主机情况(每个虚拟主机有一个证书)的方法进行了一些谷歌搜索。这是我想出的:
JSSE(Java Secure Socket Extension)支持TLS,并且对TLS+SNI有“部分支持”。我不知道部分支持在这种情况下意味着什么。我看到的评论表明现有的支持不足以执行基于命名的虚拟主机,而这基本上是我们所需要的。
我发现一篇文章声称 JSSE 的 JDK7 版本将支持 TLS+SNI(日期为 2008 年 11 月 20 日),我还找到了一篇文章声称不会支持 TLS+SNI(日期为 2009 年 2 月 27 日)。两者都不是特别权威。
早在 2009 年 2 月至 3 月,一些从事 OpenJDK 7 工作的人员就讨论了向 JSSE 添加 SNI 支持的问题,包括发布源补丁。(线程从这里开始: http://www.mail-archive.com/security-dev@openjdk.java.net/msg00612.html)。OpenJDK7 不会在 2010 年 9 月之前发布。我不知道 Java 7 平台什么时候发布。
java.sun.com上根本没有任何实质性内容,所以我真的不知道Sun的计划是什么。
显然有一种不同的方式来实现基于名称的虚拟主机,这种方式显然是广泛兼容的,即每个托管服务器使用一个证书,其中包含多个通用名称和多个主题替代名称。请参阅http://wiki.cacert.org/VhostTaskForce和通过连接器为同一 Tomcat 应用程序提供不同的证书?
如果您有大量虚拟主机,此方法将创建非常大的证书(由于所有这些 CN 和 SAN)。NHIN Direct 最近举行的面对面会议上的一位人士谈到想要支持数千个虚拟主机。我的猜测是这会破坏很多实现。此外,每次添加或删除虚拟主机时都必须更新证书,这听起来像是一个荒谬的操作负担。
总之,当前 Java 技术水平的基于名称的虚拟主机(每个虚拟主机具有单独的证书)似乎“无能为力”。此外,尚不清楚何时或是否会添加。
有人同意或不同意吗?有谁知道 OpenJDK 项目是否有意“向后移植”SNI 对 Java 6 的支持?
| 归档时间: | 
 | 
| 查看次数: | 23129 次 | 
| 最近记录: |