你正在SSLContext
使用null KeyManager
数组进行初始化。
密钥管理器负责处理服务器证书(在服务器端),这是使用时可能要设置的目标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());
} finally {
if (ksIs != null) {
ksIs.close();
}
}
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory
.getDefaultAlgorithm());
kmf.init(ks, "keypassword".tocharArray());
使用kmf.getKeyManagers()
作为第一个参数SSLContext.init()
。
对于其他两个参数,由于显然不请求客户端证书身份验证,因此应将信任管理器保留为默认值(null),而不是复制/粘贴可能导致漏洞的信任管理器,并且还可以使用默认值null SecureRandom。