SNIMatcher没有返回正确的证书

时间:2014-05-17 00:37:50

标签: java-8 sni

我有一台服务器,我已根据此示例添加了一个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)的方式进行,但它为两者返回相同的证书。只是想知道什么是正确的方法?

谢谢

1 个答案:

答案 0 :(得分:0)

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

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

AFAIK,SNI服务器端机制不执行该密钥选择,它仅限制整个密钥库/密钥管理器所允许的主机名。

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