目前正在就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实现者透视图。
发布于 2010-05-10 18:00:59
我和ftrotter在做同一个项目。
请注意对数千个域的支持要求。我不认为桑斯会削减芥末有两个原因。首先,证书的大小将变得巨大,这可能会导致最低限度的性能问题。第二,这些域将频繁地出现和消失,特别是在NHIN Direct的早期。IMHO认为,每当域出现或离开时,必须更新证书的操作负担将是不可接受的。
应ftrotter的请求,我在java、TLS和SNI的主题上做了一些谷歌搜索,以及实现相当于基于名称的虚拟主机的情况的其他方法,每个虚拟主机都有一个证书。以下是我想出的:
如果您有大量虚拟主机,这种方法将创建非常大的证书(由于所有这些CNs和SAN)。在NHIN最近的面对面会议上,有一位朋友正在谈论想要支持成千上万的虚拟主机。我的猜测是,这将破坏许多实现。此外,每次添加或删除虚拟主机时都必须更新证书,这听起来像是一个荒谬的操作负担。
总之,当前基于名称的虚拟主机的Java状态(每个虚拟主机都有单独的证书)似乎是“不能做”。此外,还不清楚何时或是否会添加。
有人同意还是不同意?有谁知道OpenJDK项目是否有意“支持”Java6的SNI?
发布于 2012-01-05 15:55:10
JavaSE 7在JSSE中支持SNI。
http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements-7.html
注意,它似乎有一个问题,因为您可以在这里阅读:
发布于 2012-12-27 09:56:53
还可以用原始Sun JDK (bootclasspath)的一些行进行修补,以使Server正常工作。
班级: 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()]);
}https://stackoverflow.com/questions/2804551
复制相似问题