【问题标题】:Spring Boot 2.1.1: UnsatisfiedLinkError: org.apache.tomcat.jni.SSL.renegotiatePendingSpring Boot 2.1.1:UnsatisfiedLinkError:org.apache.tomcat.jni.SSL.renegotiatePending
【发布时间】:2019-05-04 21:18:11
【问题描述】:

从 Spring Boot 2.1.0.RELEASE 更新到 2.1.1.RELEASE 后,所有 HTTPS 请求都失败并出现以下错误:

2018-12-03 14:23:46,089 PID=21726 LEVEL=ERROR THREAD=https-openssl-nio-443-exec-2 LOGGER=org.apache.tomcat.util.net.NioEndpoint METHOD=log:175 MESSAGE="java.lang.UnsatisfiedLinkError: org.apache.tomcat.jni.SSL.renegotiatePending(J)I
        at org.apache.tomcat.jni.SSL.renegotiatePending(Native Method) ~[tomcat-embed-core-9.0.13.jar!/:9.0.13]
        at org.apache.tomcat.util.net.openssl.OpenSSLEngine.getHandshakeStatus(OpenSSLEngine.java:1021) ~[tomcat-embed-core-9.0.13.jar!/:9.0.13]
        at org.apache.tomcat.util.net.openssl.OpenSSLEngine.wrap(OpenSSLEngine.java:457) ~[tomcat-embed-core-9.0.13.jar!/:9.0.13]
        at java.base/javax.net.ssl.SSLEngine.wrap(SSLEngine.java:471) ~[na:na]
        at org.apache.tomcat.util.net.SecureNioChannel.handshakeWrap(SecureNioChannel.java:440) ~[tomcat-embed-core-9.0.13.jar!/:9.0.13]
        at org.apache.tomcat.util.net.SecureNioChannel.handshake(SecureNioChannel.java:211) ~[tomcat-embed-core-9.0.13.jar!/:9.0.13]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1394) ~[tomcat-embed-core-9.0.13.jar!/:9.0.13]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.13.jar!/:9.0.13]
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135) [na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [na:na]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.13.jar!/:9.0.13]
        at java.base/java.lang.Thread.run(Thread.java:844) [na:na]
"

恢复到 2.1.0.RELEASE 解决了这个问题。

  • 操作系统:Ubuntu 18.04.1 LTS
  • Java:OpenJDK 运行时环境(构建 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
  • libtcnative:1.2.16-1build1

怀疑这与:https://github.com/spring-projects/spring-boot/issues/15261

显式锁定对 tomcat-embed-core 9.0.12 的依赖解决了该问题。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>9.0.12</version>
        </dependency>
    </dependencies>
</dependencyManagement>

怀疑 libtcnative 更新也会解决这个问题,但 Ubuntu LTS 的当前版本是 1.2.16-1build1,因此我们认为这是 Spring Boot 中的回归。

https://packages.ubuntu.com/search?keywords=libtcnative-1

使用上面列出的依赖锁解决了问题。

【问题讨论】:

    标签: java spring spring-boot tomcat


    【解决方案1】:

    Spring Boot 2.1.1 从 9.0.12 升级到 Tomcat 9.0.13。由于this change,Tomcat 9.0.13 需要包含this change 的Tomcat Native 版本。它在 1.2.18 及更高版本中可用。在升级到 Tomcat 的新补丁版本时,需要使用 Tomcat Native 的新补丁版本。同样,预计 Spring Boot 的新补丁版本将更新为其依赖项之一的新补丁版本。

    如果您的操作系统没有提供您可以使用的最新 Tomcat Native 包,我建议您自己构建它。可以在Tomcat's documentation 中找到这样做的说明。这比将 Tomcat 降级到 9.0.12 更可取,因为卡在旧版本上会增加您将来受到错误或安全漏洞影响的风险。

    【讨论】:

    • 谢谢,我不得不在 Fedora 中降级到 9.0.10 才能让它再次工作。
    • 有人有机会测试 Tomcat 9.0.20 吗?
    【解决方案2】:

    我无法添加 cmets,所以这里是对上述答案的一个简单的补充,用于稍微不同的设置(使用运行在 tomcat 8.5 上的 spring 框架开发的 webapp)。

    当从源代码构建 tcnative 并使用来自 repos 的 tomcat 时,请记住将 tcnative 库复制到 /usr/lib64 文件夹并在该文件夹中重新创建符号链接。

    对我来说,问题开始于 2019 年 4 月初,当时 Tomcat 从 8.5.32 升级到 8.5.35,但 tomcat native 仍然是 1.2.17 版本,并且 repos 中没有可用的更新。 Andy Wilkinson 的答案是我能找到的唯一正确解释问题并提供帮助的答案。

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 2020-03-13
      • 1970-01-01
      • 2019-05-28
      • 2019-05-15
      • 2019-05-25
      • 2019-06-08
      • 2019-05-26
      • 1970-01-01
      相关资源
      最近更新 更多