如果有一个在码头的密钥存储多个证书,它是如何选择呢?(If there's more tha

2019-07-29 06:30发布

有一个在我们的系统中的一些代码自动生成自签名证书到密钥存储,然后使用码头。 如果给定主机的关键已经存在,那么什么都不会发生,但如果它不存在,我们生成一个新的密钥,就像这样:

public void generateKey(String commonName) {
    X500Name x500Name = new X500Name("CN=" + commonName);
    CertAndKeyGen keyPair = new CertAndKeyGen("DSA", "SHA1withDSA");
    keyPair.generate(1024);
    PrivateKey privateKey = keyPair.getPrivateKey();
    X509Certificate certificate = keyPair.getSelfCertificate(x500Name, 20*365*24*60*60);
    Certificate[] chain = { certificate };
    keyStore.setEntry(commonName, privateKey, "secret".toCharArray(), chain);
}

这一切只要有密钥存储器中的唯一一个密钥和证书工作正常。 一旦你有多个按键,奇怪的事情,当你试图连接发生:

java.io.IOException: HTTPS hostname wrong:  should be <127.0.0.1>

这是一个相当神秘的错误,但我终于写它连接到服务器,并声称该证书上的CN的主机名匹配一个单元测试,以追查。 我发现很有意思 - 码头似乎任意选择呈现给客户端的证书,但以一致的方式。

例如:

  • 如果“CN =本地主机”和“CN = cheese.mydomain”是在密钥存储,它总是选择“CN = cheese.mydomain”。
  • 如果 “CN = 127.0.0.1” 和 “CN = cheese.mydomain” 是在密钥存储,它总是选择 “CN = cheese.mydomain”。
  • 如果 “CN = 192.168.222.100”(cheese.mydomain)和 “CN = cheese.mydomain” 是在密钥存储,它总是选择 “CN = 192.168.222.100”。

我写了一些代码,它通过在商店中的证书循环到打印出来,发现它没有始终如一地选择第一个证书或任何琐碎的那样。

那么究竟它用什么样的标准? 起初我还以为是本地主机特殊但随后的第三个例子我彻底难倒了。

我认为这是某种由的KeyManagerFactory,这是SunX509在我的情况决定。

Answer 1:

这确实是通过最终的决定KeyManager (通常由获得KeyManagerFactory )。

密钥库可以具有多个在不同的别名存储的证书的。 如果没有别名是通过明确的配置certAlias在码头的配置中, SunX509实施,将挑选它发现了其中有一个私钥和正确的类型为选择的加密套件(通常是RSA密钥对第一别名,但可能DSA在你的情况在这里)。 还有更多的是有点的选择逻辑,如果你看一下Sun提供实现 ,但你真的不应该依靠在一般情况下,只是别名的顺序。

当然,你可以给你的码头自己SSLContext用自己的X509KeyManager选择别名。 你将不得不执行:

 chooseServerAlias(String keyType, Principal[] issuers, Socket socket)

不幸的是,除了keyTypeissuers ,所有你必须做出决定是socket本身。 在最好的情况,你会得到有用的信息,也有本地IP地址和远程之一。

除非你的服务器监听同一端口上的多个IP地址,你总是会得到相同的本地IP地址。 (在这里,很明显,你至少有两个: 127.0.0.1192.168.222.100 ,但我怀疑你是不是除了自己的测试在本地主机很感兴趣。)您需要在服务器上的服务器名称指示(SNI)支持方能够使基于该请求的主机名的决定(通过支持它的客户端)。 不幸的是, SNI是只在Java 7中引入的,但只有在客户端上 。

您将在这里面临的另一个问题是, Java客户端会抱怨在主题DN的CN的IP地址 。 一些浏览器会容许这样做,但这是不符合HTTPS规范(RFC 2818)。 IP地址必须是IP地址类型的主题备用名称条目。



文章来源: If there's more than one certificate in Jetty's key store, how does it choose?