首页  >  文章  >  Java  >  当使用带有空 KeyManager 数组的 SSLContext.init 时,为什么会出现'忽略不可用的密码套件”和'没有通用的密码套件”错误?

当使用带有空 KeyManager 数组的 SSLContext.init 时,为什么会出现'忽略不可用的密码套件”和'没有通用的密码套件”错误?

Barbara Streisand
Barbara Streisand原创
2024-11-01 08:52:021017浏览

Why am I getting

您正在使用空的 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn