【问题标题】:javax.net.ssl.SSLHandshakeException: No available authentication schemejavax.net.ssl.SSLHandshakeException:没有可用的身份验证方案
【发布时间】:2019-09-15 05:13:38
【问题描述】:

谷歌发现 jdk11.0.2 中的一个错误,但我升级到 jdk11.0.3,这对我来说仍然存在。重现步骤

  1. git clone https://github.com/deanhiller/webpieces.git
  2. "org.gradle.java.home=/Library/Java/JavaVirtualMachines/jdk-11.0.3.jdk/Contents/Home" 添加到~/.gradle/gradle.properties 以将jdk 设置为11.0.3
  3. 从 webpieces 目录运行 ./gradlew :core:core-asyncserver:test

测试用例挂起并在日志中显示

Caused by: javax.net.ssl.SSLHandshakeException: No available authentication scheme
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:128)
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:308)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:255)
    at java.base/sun.security.ssl.CertificateMessage$T13CertificateProducer.onProduceCertificate(CertificateMessage.java:945)
    at java.base/sun.security.ssl.CertificateMessage$T13CertificateProducer.produce(CertificateMessage.java:934)
    at java.base/sun.security.ssl.SSLHandshake.produce(SSLHandshake.java:436)
    at java.base/sun.security.ssl.ClientHello$T13ClientHelloConsumer.goServerHello(ClientHello.java:1224)
    at java.base/sun.security.ssl.ClientHello$T13ClientHelloConsumer.consume(ClientHello.java:1160)
    at java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.onClientHello(ClientHello.java:849)
    at java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.consume(ClientHello.java:810)
    at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392)
    at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444)
    at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1065)
    at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1052)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask.run(SSLEngineImpl.java:999)
    at org.webpieces.ssl.impl.AsyncSSLEngine2Impl.createRunnable(AsyncSSLEngine2Impl.java:94)
    ... 12 common frames omitted

我应该提交另一个 JDK 错误,还是有人有任何想法?

已解决/相关的 JDK 错误:https://bugs.openjdk.java.net/browse/JDK-8211426

请注意,由于某种原因,这会修复它: System.setProperty("jdk.tls.server.protocols", "TLSv1.2");

hmmm,有人知道如何生成适用于 TLSv1.2 和 TLSv1.3 的自签名证书吗?

【问题讨论】:

  • 您链接为相关的错误的解决方案是“无法修复”,因此它没有被修复。有一个comment 展示了如何通过不使用 TLS 1.3 而是“降级”到 TLS 1.2 来解决该问题。检查是否能解决您的问题
  • 是的,我想我必须弄清楚如何将证书升级到 TLS 1.3,但是它们仍然可以在 TLS 1.2 中使用 jdk 8、9、10 等。希望新证书能够在所有jdk 8 到 jdk 12 的 5 个版本。
  • "...生成适用于 TLSv1.2 和 TLSv1.3 的自签名证书..." - 证书大多独立于 TLS 协议版本。除了 DSA 证书不能与 TLS 1.3 一起使用——但是今天谁在使用 DSA。请在证书中使用 ECC 密钥或 RSA 密钥。所以问题更多的是你是如何首先创建这个自签名证书的,它是什么样子的。

标签: ssl java-11


【解决方案1】:

假设这是链接的问题,而不是 TLS 1.3 周围的另一个问题。

您的证书正在使用 DSA 算法,该算法在不久前已被弃用,取而代之的是 RSA,并且在 TLS1.3 中根本不支持。请务必改为创建 RSA 证书。

似乎不那么旧的 java keytool 版本可能默认创建了 DSA 证书……不幸的默认设置。您可以使用此命令来验证证书类型。

openssl x509 -in certificate.crt -text

Certificate:
    ...
    Signature Algorithm: dsa_with_SHA256
        ...
        Subject Public Key Info:
            Public Key Algorithm: dsaEncryption

【讨论】:

  • 使用 Java 时,keytool -printcert -file $filekeytool -list -keystore $ksfile [-alias $name] -v 也会显示此信息。 (前者适用于 PEM 和 DER 文件而无需更改,而 openssl 需要 -inform der 或缩写为 -inform d。)
  • SHA-1 签名算法在 Java 的 TLSv1.3 中也不可用。在tools.ietf.org/html/rfc8446#section-4.4.2.4 中解释了“SHA-1 已被弃用,建议任何接收到任何证书的端点都需要使用任何签名算法使用 SHA-1 哈希进行验证,并通过“bad_certificate”警报中止握手。”
猜你喜欢
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多