您正在使用空的 KeyManager 数组初始化 SSLContext。
密钥管理器负责处理服务器证书(在服务器端),这就是您可能打算在使用 javax.net.ssl.keyStore 时进行设置。
但是,如 JSSE 参考指南中所述,对第一个参数使用 null 并不会实现您认为的效果:
如果 KeyManager[] 参数为 null,则将为该上下文定义一个空的 KeyManager
。如果 TrustManager[] 参数为 null,
将在已安装的安全提供程序中搜索
TrustManagerFactory 的最高优先级实现,从中获取
适当的 TrustManager。同样,
SecureRandom 参数可能为 null,在这种情况下,将使用默认的
实现。
空的 KeyManager 不包含任何 RSA 或 DSA 证书。因此,所有依赖此类证书的默认密码套件都被禁用。这就是为什么您收到所有这些“忽略不可用的密码套件”消息,最终导致“没有共同的密码套件”消息。
如果您希望将密钥库用作密钥库,您将需要加载它并用它初始化一个 KeyManagerFactory:
KeyStore ks = KeyStore.getInstance("JKS");
InputStream ksIs = new FileInputStream("...");
try {
ks.load(ksIs, "password".toCharArray());
} 最后 {
if (ksIs != null) { ksIs.close(); }
}
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory
.getDefaultAlgorithm());
kmf.init(ks , "keypassword".toCharArray());
使用 kmf.getKeyManagers() 作为 SSLContext.init() 的第一个参数。
对于其他两个参数,因为你明显不请求客户端证书身份验证,您应该将信任管理器保留为其默认值(空),而不是复制/粘贴可能导致漏洞的信任管理器,并且您还可以使用默认的空 SecureRandom。
以上是当使用带有空 KeyManager 数组的 SSLContext.init 时,为什么会出现“忽略不可用的密码套件”和“没有通用的密码套件”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!