你正在
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。



