我需要一个简单的嵌入式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.ssl
和Java Security Guide并弄清楚我可能会错过的内容。我认为应该建立SSL会话时,有一种方法可以挂接到库中以提供正确的密钥。但是我迷路了。我什至不了解各个类(PrivateKey
,HttpsServer
,SSLContext
,SSLSession
,TrustManager
)如何相互影响以及正确的位置是什么根据请求选择正确的证书。整个文档都是这种“为供应商提供工厂,让您为对象的工厂提供策略”的样式,我不明白这一点。