首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java客户机中的带有SNI的TLS

问Java客户机中的带有SNI的TLS
EN

Stack Overflow用户
提问于 2010-05-10 16:48:08
回答 3查看 27.1K关注 0票数 10

目前正在就NHIN直接安全和信任工作组 关于使用传统SSL创建的IP到域映射问题。进行讨论。如果HISP (由NHIN Direct定义)想为提供商托管数千个NHIN直接“健康域”,那么必须为每个域名购买一个IP将是“人为夸大的成本”。

因为Apache和OpenSSL最近发布了支持SNI扩展的TLS,所以可以使用SNI作为服务器端上这个问题的解决方案。但是,如果我们决定允许NHINDirect传输层的服务器实现支持TLS+SNI,那么我们必须要求所有客户端也支持SNI的。默认情况下,基于OpenSSL的客户端应该这样做,如果给定的编程语言SSL实现不支持SNI,则可以始终阻止我们实现TLS+SNI感知客户端到代理。使用OpenJDK的原生Java应用程序似乎还不支持SNI,但我无法从该项目中得到一个直接的答案。我知道有可用的OpenSSL Java库,但我不知道这是否可行。

你能给我一个“最先进”的总结,说明TLS+SNI对Java的支持在哪里吗?我需要一个Java实现者透视图。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-10 18:00:59

我和ftrotter在做同一个项目。

请注意对数千个域的支持要求。我不认为桑斯会削减芥末有两个原因。首先,证书的大小将变得巨大,这可能会导致最低限度的性能问题。第二,这些域将频繁地出现和消失,特别是在NHIN Direct的早期。IMHO认为,每当域出现或离开时,必须更新证书的操作负担将是不可接受的。

应ftrotter的请求,我在java、TLS和SNI的主题上做了一些谷歌搜索,以及实现相当于基于名称的虚拟主机的情况的其他方法,每个虚拟主机都有一个证书。以下是我想出的:

  • JSSE (扩展)支持TLS,并对TLS+SNI有“部分支持”。在这方面,我不知道部分支持是甚麽意思。我看到的评论表明,现有的支持不足以执行基于名称的虚拟主机,这基本上是我们所需要的。
  • 我找到了一篇声称JSSE的JDK7版本将支持TLS+SNI (日期为11/20/2008)的文章,还有一篇声称它不会支持的文章(日期为2/27/2009)。两者都不是特别权威的。
  • 一些致力于OpenJDK 7的人在2009年2月-3月讨论了将SNI支持添加到JSSE的问题,包括发布一个源补丁。(线程从这里开始:http://www.mail-archive.com/security-dev@openjdk.java.net/msg00612.html)。OpenJDK7不会在2010年9月之前发布。我不知道Java 7平台何时发布。
  • java.sun.com根本没有实质性的内容,所以我真的不知道Sun的计划是什么。
  • 显然有一种不同的方法来实现基于名称的虚拟主机,这显然是广泛兼容的,每个主机都使用一个证书,其中包含多个公共名称和多个主题alt名称。见http://wiki.cacert.org/VhostTaskForce和通过连接器为同一Tomcat应用程序提供不同的证书?

如果您有大量虚拟主机,这种方法将创建非常大的证书(由于所有这些CNs和SAN)。在NHIN最近的面对面会议上,有一位朋友正在谈论想要支持成千上万的虚拟主机。我的猜测是,这将破坏许多实现。此外,每次添加或删除虚拟主机时都必须更新证书,这听起来像是一个荒谬的操作负担。

总之,当前基于名称的虚拟主机的Java状态(每个虚拟主机都有单独的证书)似乎是“不能做”。此外,还不清楚何时或是否会添加。

有人同意还是不同意?有谁知道OpenJDK项目是否有意“支持”Java6的SNI?

票数 3
EN

Stack Overflow用户

发布于 2012-01-05 15:55:10

JavaSE 7在JSSE中支持SNI。

http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements-7.html

注意,它似乎有一个问题,因为您可以在这里阅读:

升级到Java 1.7.0后出现的名称错误

票数 8
EN

Stack Overflow用户

发布于 2012-12-27 09:56:53

还可以用原始Sun JDK (bootclasspath)的一些行进行修补,以使Server正常工作。

班级: sun.security.ssl.ServerHandshaker

加法字段

代码语言:javascript
复制
    /** Use for SNI */
    private ServerNameExtension serverNameExtension = null;

修补方法clientHello (添加这些行)

代码语言:javascript
复制
    /* Use for SNI */
    this.serverNameExtension = (ServerNameExtension)mesg.extensions.get(ExtensionType.EXT_SERVER_NAME);

贴片法setupPrivateKeyAndChain (变更)

代码语言:javascript
复制
    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中

代码语言:javascript
复制
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()]);
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2804551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档