您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Java SSLHandshakeException“没有共同的密码套件”

Java SSLHandshakeException“没有共同的密码套件”

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

java 2022/1/1 18:19:41 有457人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶