【问题标题】:NullPointerException at org.bouncycastle.crypto.signers.PSSSigner.generateSignature on Tomcat server. ERR_SSL_PROTOCOL_ERROR on chromeTomcat 服务器上 org.bouncycastle.crypto.signers.PSSSigner.generateSignature 的 NullPointerException。 chrome 上的 ERR_SSL_PROTOCOL_ERROR
【发布时间】:2021-01-12 20:20:26
【问题描述】:

Tomcat 服务器启动成功。但是一旦它点击 https://localhost:8443,我就会在服务器上看到重复的错误(下面的日志)。在 chrome 浏览器上,我看到此站点无法提供安全连接,localhost 发送了无效响应 ERR_SSL_PROTOCOL_ERROR。我如何设法在 safari 中运行 localhost 但 chrome 仍然存在问题。任何帮助,将不胜感激。谢谢

SEVERE [https-jsse-nio-8443-exec-7] org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun 
    java.lang.NullPointerException
        at org.bouncycastle.crypto.signers.PSSSigner.generateSignature(Unknown Source)
        at org.bouncycastle.jcajce.provider.asymmetric.rsa.PSSSignatureSpi.engineSign(Unknown Source)
        at java.security.Signature$Delegate.engineSign(Signature.java:1382)
        at java.security.Signature.sign(Signature.java:698)
        at sun.security.ssl.CertificateVerify$T13CertificateVerifyMessage.<init>(CertificateVerify.java:931)
        at sun.security.ssl.CertificateVerify$T13CertificateVerifyProducer.onProduceCertificateVerify(CertificateVerify.java:1105)
        at sun.security.ssl.CertificateVerify$T13CertificateVerifyProducer.produce(CertificateVerify.java:1098)
        at sun.security.ssl.SSLHandshake.produce(SSLHandshake.java:420)
        at sun.security.ssl.ClientHello$T13ClientHelloConsumer.goServerHello(ClientHello.java:1096)
        at sun.security.ssl.ClientHello$T13ClientHelloConsumer.consume(ClientHello.java:1032)
        at sun.security.ssl.ClientHello$ClientHelloConsumer.onClientHello(ClientHello.java:716)
        at sun.security.ssl.ClientHello$ClientHelloConsumer.consume(ClientHello.java:683)
        at sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:376)
        at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444)
        at sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:983)
        at sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:970)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.security.ssl.SSLEngineImpl$DelegatedTask.run(SSLEngineImpl.java:917)
        at org.apache.tomcat.util.net.SecureNioChannel.tasks(SecureNioChannel.java:423)
        at org.apache.tomcat.util.net.SecureNioChannel.handshakeUnwrap(SecureNioChannel.java:483)
        at org.apache.tomcat.util.net.SecureNioChannel.handshake(SecureNioChannel.java:238)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1475)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

【问题讨论】:

    标签: ssl ssl-certificate


    【解决方案1】:

    我在更新到 openjdk-1.8.0_275 时遇到了这个问题。在 java.security 中禁用“RSASSA-PSS”为我解决了这个问题。

    打开${JAVA_HOME}/jre/lib/security/java.security,找到jdk.certpath.disabledAlgorithms,将RSASSA-PSS添加到列表末尾:

    jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, \
    EC keySize < 224, 3DES_EDE_CBC, anon, NULL, RSASSA-PSS
    

    我还看到其他人不得不在 tomcat 中禁用 TLS1.3,但我不需要。

    注意:这应该是临时解决方法。支持和使用 TLSv1.3 是理想的方案 - 对我来说,由于我的客户的限制,现在这是不可能的。

    【讨论】:

    • 从 jdk-1.8.0_281 降级 jdk-1.8.0_211 解决了我的问题。谢谢。
    【解决方案2】:

    BouncyCastle 的升级解决了这个问题。确保您至少拥有 bouncycastle v1.65。

    https://github.com/bcgit/bc-java/issues/633

    【讨论】:

    • 解决了我的问题。
    【解决方案3】:

    这是一个不幸的事件组合。就我而言,我将 JDK 升级到 1.8.0_282,因为我想开始在 Tomcat 中使用 TLS v1.3,它依赖于底层 Java 运行时才能工作。

    所以一切都指向 JDK,但异常是在不属于 JDK 的 Bouncy Castle 组件中引发的。一些 Tomcat 实现(我的案例:TomEE 8.0.1)在(1.63 版)中包含一个 Bouncy Castle 库。

    事实证明,当 Java 调用证书签名的验证时,涵盖最佳算法的实现似乎来自 Bouncy Castle 实现,并且它在早期版本(最高 1.64)中有一个错误,即NullPointerException 在从随机发生器接收到空值后抛出。

    正如 Carles Barrobès 参考文献 Bouncy Castle Tracker 中所指出的,在 1.65 版之后发现并修复了该问题。

    所以你必须在你的 Tomcat lib 目录中找到 Bouncy Castle jar(在我的例子中名为 bcprov-jdk15on-1.63.jar - 寻找一个可能具有不同版本的类似文件名)并用来自 Bouncy Castle web site 的新文件替换它( bcprov-jdk15to18-168.jar 在撰写本文时)。

    注意:使用“-jdk15to18-”文件而不是“-jdk15on-”,因为后者是为较新版本的 JDK(1.8 之后)设计的,而整个问题正是 JDK 1.8 造成的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 2017-10-31
      • 2020-12-28
      • 1970-01-01
      相关资源
      最近更新 更多