2

我有一台服务器,并且基于此示例添加了一个 SNIMatcher

http://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#SNIExamples

SSLServerSocket sslServerSocket = ...;
SNIMatcher matcher = SNIHostName.createSNIMatcher("www\\.example\\.(com|org)");
Collection<SNIMatcher> matchers = new ArrayList<>(1);
matchers.add(matcher);

SSLParameters params = sslServerSocket.getSSLParameters();
params.setSNIMatchers(matchers);
sslServerSocket.setSSLParameters(params);

我在 hosts 文件中添加了 example.com 和 example.org 为 127.0.0.1

当我访问 example.com 和 example.org 时,它们都获得了相同的 localhost 证书(我为 example.org 创建了一个单独的证书)

我的问题是附加 SNIMatcher 的正确方法是什么

我是否需要为每个拥有自己证书的虚拟主机创建一个单独的匹配器?(我这样做了,但我得到了一个 IllegalArgumentException,因为两个主机都具有相同的类型 0 (StandardConstants.SNI_HOST_NAME)

http://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SSLParameters.html#setSNIMatchers-java.util.Collection-

所以我改变了我附加的方式,只是按照示例 (com|org) 的方式进行操作,但它为两者返回了相同的证书。只是想知道正确的方法是什么?

谢谢你

4

1 回答 1

0

我相信它与用于发布 sslserversocketfactory 的 sslcontext 的密钥库中的密钥证书中的 x509 内容(专有名称)有关。

选择密钥并提供 x509 证书(鉴于“仅接受”sni 主机名)与 x509 中的某些 DN 有关,因为这是唯一可用的映射知识。主机映射当然不是使用密钥库别名完成的!来自密钥库的映射信息必须在证书中,证书是证书颁发机构签署的主机名。

AFAIK,SNI 服务器端机制不进行密钥选择,它只限制连接的整个密钥库/密钥管理器允许的主机名。

PS:如果您想切换密钥库,那么您实际上必须使用您自己的 X509KeyManager 构建一个 sslcontext,它可以提供所有密钥库的所有材料。您可能会从 KeyManagerFactory 中包装出一系列密钥管理器......并且对我的支持到此结束,因为我记得它变得丑陋得太快了!

于 2016-02-06T21:51:03.133 回答