我正在连接一个安全的网络服务。
尽管我的密钥存储库和信任存储库设置正确,但是我的握手失败了。
经过几天的沮丧,无休止的搜索和询问周围的每个人,我发现唯一的问题是 Java 在握手时没有选择发送客户端证书到服务器。
具体来说:
- 服务器请求一个客户端证书(CN = RootCA)-即“给我一个由根 CA 签名的证书”
- Java 查看了密钥存储库,只找到了我的客户端证书,它由“ SubCA”签名,并由“ RootCA”发布。它没有费心去查信托商店... ... 嗯,还好吧,我想
- 遗憾的是,当我试图将“ SubCA”证书添加到密钥存储库时,它一点用也没有。我确实检查了证书是否被加载到密钥存储库中。是的,但是 KeyManager 忽略除客户机证书之外的所有证书。
- 所有这些都导致了这样一个事实: Java 决定它没有任何证书来满足服务器的请求,并且没有发送任何东西... ... tadaaa 握手失败:-(
我的问题是:
- 有没有可能我以“中断证书链”的方式将“ SubCA”证书添加到密钥存储库中,或者其他方式使 KeyManager 只加载客户端证书而忽略其他证书?(Chrome 和 openssl 设法解决了这个问题,那么为什么 java 不行呢?--请注意,“ SubCA”证书总是单独显示为受信任的权威,因此 Chrome 显然在握手时正确地将其与客户端证书一起打包)
- 这是服务器端的正式“配置问题”吗?服务器是第三方。我希望服务器请求由“ SubCA”权威机构签名的证书,因为这是他们提供给我们的。我怀疑 Chrome 和 openssl 之所以可以这么做,是因为它们“限制较少”,而 Java 只是“照章办事”,结果失败了。
I did manage to put together a dirty workaround for this, but I'm not very happy about it so I'll be glad if anyone can clarify this one for me.