在多个接口上使用简单的Java HttpsServer列表,每个接口使用单独的证书

时间:2018-11-13 12:25:02

标签: java ssl https ssl-certificate keystore

我需要一个简单的嵌入式HTTPS服务器(最好是com.sun.net.httpserver.HttpsServer),它可以侦听多个接口并为每个接口使用正确的证书。

幸运的是,每个接口的IP对应一个唯一的DNS名称。换句话说,DNS反向查找将为要使用的证书返回正确的CN,并且不需要SNI(服务器名称指示)。

第一步,我followed this answer将HTTPS服务器包含到我的应用程序中。我的证书使用两个中间CA和最终根CA的链进行签名。例如。信任链看起来像

certForInterfaceA --\
                     +-- intermediateCA1 -- intermediateCA2 -- rootCA
certForInterfaceB --/

如果我修改代码以使HTTPS服务器仅侦听特定接口,并且如果我将相应的证书(连同其私钥和链)作为单个{{1 }}条目。

我希望,如果HTTPS服务器侦听通配符地址,并且密钥库具有两个PrivateKey条目,每个接口一个,那么一切仍然可以工作。我希望Java库可以自己根据请求将正确的证书发送回客户端。

不幸的是,测试显示出不可靠且不可预测的行为。好像图书馆是随机选择其中一个键。例如。在一半的情况下,由于名称不匹配,导致出现证书错误。

我试图查看Java Reference for javax.net.sslJava Security Guide并弄清楚我可能会错过的内容。我认为应该建立SSL会话时,有一种方法可以挂接到库中以提供正确的密钥。但是我迷路了。我什至不了解各个类(PrivateKeyHttpsServerSSLContextSSLSessionTrustManager)如何相互影响以及正确的位置是什么根据请求选择正确的证书。整个文档都是这种“为供应商提供工厂,让您为对象的工厂提供策略”的样式,我不明白这一点。

0 个答案:

没有答案