【问题标题】:SNIMatcher not returning correct certificateSNIMatcher 未返回正确的证书
【发布时间】:2014-05-17 00:37:49
【问题描述】:

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

谢谢

【问题讨论】:

    标签: java-8 sni


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2022-01-03
      • 2015-07-05
      • 1970-01-01
      • 2019-01-27
      • 2016-09-23
      • 1970-01-01
      相关资源
      最近更新 更多