【问题标题】:AES KeyManagerFactory not availableAES KeyManagerFactory 不可用
【发布时间】:2015-07-24 09:54:27
【问题描述】:

我遇到了一个异常,告诉我“AES KeyManagerFactory 不可用”。

这是我的代码:

try {
    LOG.warn("Configuring SSL connection on port 8085");
    KeyStore keystore = KeyStore.getInstance("JCEKS");
    keystore.load(new FileInputStream("/.peg.jceks"),
            "password".toCharArray());

    KeyStore kstrust = KeyStore.getInstance("JCEKS");
    String truststorelocation = "/.peg.jceks";
    kstrust.load(new FileInputStream(truststorelocation), "changeit".toCharArray());

    KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    kmf.init(keystore, "password".toCharArray());

    TrustManagerFactory tmf =
            TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(kstrust);

    context = SSLContext.getInstance("TLS");
    context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
    SSLServerSocketFactory sf = context.getServerSocketFactory();
    SSLServerSocket ss = (SSLServerSocket)sf.createServerSocket(8085);
    ss.setNeedClientAuth(true);

} catch (Exception e) {
    e.printStackTrace();
    LOG.error("Problem configuring SSL", e.getMessage());
}

我正面临这个异常

java.security.NoSuchAlgorithmException: AES KeyManagerFactory not available
     at sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
     at javax.net.ssl.KeyManagerFactory.getInstance(KeyManagerFactory.java:10)

有人能解决这个问题吗?

【问题讨论】:

  • 我对异常发生的位置进行了有根据的猜测。但请始终在代码中指出异常的位置。我们没有行号!
  • 我还稍微编辑了标签和异常。 encryption 经常被滥用为cryptography。 TLS 提供的不仅仅是加密。 java-securitysecurity 太笼统了;只需使用 javacryptography 就足够了。注意java-security有0个关注者,只有28个问题;即没有人对标签感兴趣。
  • 也很重要:我看到您提出的问题已经得到明确回答。您似乎不接受这些问题,因此它们不会保持开放。请选择适合您需要的答案和accept that one,或者指出答案中仍然缺少的内容。

标签: java security ssl cryptography


【解决方案1】:

来自KeyManagerFactory.getDefaultAlgorithm的文档:

可以在运行时通过设置"ssl.KeyManagerFactory.algorithm" 安全属性的值(在Java 安全属性文件中设置或通过将Security.setProperty(java.lang.String, java.lang.String)) 调用为所需的算法名称来更改默认算法。

所以有人 - 可能是你 - 将此值设置为错误的值。密钥管理器应指明其处理的身份验证密钥和证书的种类。它不应指示对称密码。在 TLS 的身份验证阶段不使用对称密码(可能除非正在使用 PSK 密码套件)。

在我的系统上,算法返回SunX509,这是一个更合理的结果,X509 是用于在 TLS 中执行常规客户端/服务器身份验证的证书。

【讨论】:

  • 上一个错误得到了解决,这是我坚持的新错误.. java.security.UnrecoverableKeyException: Given final block not proper padding
  • 我们可以使用单个密钥库文件作为信任库和密钥库吗?
  • 应该是可以的。未正确填充的最终块通常意味着不正确的密钥或密码。
  • 嗨 Maarten,我使用以下命令列出了密钥.. keytool -list -keystore -storetype JCEKS -storepass java.security.UnrecoverableKeyException:给定最终块不正确填充 如果存在不正确的密钥,如何确定问题出在存储的密钥上。我确定密码。这个命令是公平的。它列出了所有的键.. 但它以编程方式抛出了这个异常
  • 我唯一能想到的是密钥特定密码不正确。但事实证明这是一个调试问题......从这里开始有点难以做到。
猜你喜欢
  • 1970-01-01
  • 2010-12-21
  • 2022-07-28
  • 2022-01-26
  • 2017-05-08
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多