Java 运行时创建jlink的SSLHandshakeException

Java 运行时创建jlink的SSLHandshakeException,java,java-11,jlink,Java,Java 11,Jlink,我有一个dropwizard应用程序,在标准JRE中运行良好 我尝试过使用jlink创建一个运行时,它要小得多: /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home/bin/jlink --no-header-files --no-man-pages --compress=2 --strip-debug --add-modules java.base,java.compiler,java.desktop,java.instrume

我有一个dropwizard应用程序,在标准JRE中运行良好

我尝试过使用jlink创建一个运行时,它要小得多:

/Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home/bin/jlink --no-header-files --no-man-pages --compress=2 --strip-debug --add-modules java.base,java.compiler,java.desktop,java.instrument,java.logging,java.management,java.naming,java.scripting,java.security.jgss,java.sql,java.xml,jdk.attach,jdk.jdi,jdk.management,jdk.unsupported --output jre
如果我使用jlink创建的运行时运行它,它会在连接到redis(前面有stunnel)时抛出此错误

stunnel服务器日志显示:

redis_1  | 09:12:20 stunnel.1 | 2019.03.31 09:12:20 LOG7[23]: TLS alert (write): fatal: handshake failure
redis_1  | 09:12:20 stunnel.1 | 2019.03.31 09:12:20 LOG3[23]: SSL_accept: 141F7065: error:141F7065:SSL routines:final_key_share:no suitable key share
redis_1  | 09:12:20 stunnel.1 | 2019.03.31 09:12:20 LOG5[23]: Connection reset: 0 byte(s) sent to TLS, 0 byte(s) sent to socket
jlink是否遗漏了一些加密算法?

正如rich在一篇文章中提到的那样


嗯。如果我添加jdk.crypto.ec,它就可以工作了——为什么jdeps会漏掉这个,如果是那个,还会漏掉其他的吗


将jdk.crypto.ec添加到模块列表解决了这个问题

还可以将
--bind services
(服务提供者模块及其依赖项中的链接)添加到jlink命令中。但根据我的经验,这将使生成的运行时更大。但至少这是一个选项,可以快速找出观察到的问题是否是由于缺少服务实现造成的。

添加
需要jdk.crypto.ec
进入module-info.java为我解决了这个问题。

我不得不添加
jdk.crypto.ec
jdk.crypto.cryptoki

Hmmn。如果我添加jdk.crypto.ec,它就可以工作了——为什么jdeps会漏掉这个,如果是那个,还会漏掉其他的吗?我似乎记得JCA提供者是扩展:库中没有任何东西直接依赖于它们,它们必须显式地放入类路径中(像其他典型的适配器扩展:数据库连接器等)因此,您可以使用HTTPS支持jlink一个非常好的运行时,但不需要任何SSL/TLS/。。。实现并仅在握手失败时通知,错误消息为。。。混淆。我明白为什么会发生这种情况,但这肯定不方便,也不遵循最小意外的原则。这非常令人沮丧,这就是解决办法。我在JRE上部署了几个月的应用程序,然后它突然失去了与服务器对话的能力(这意味着没有更新)。为什么它们不包括这个呢?在OpenJDK11.0.9/Win64上,它通过
0.3MIB
简化了JRE大小。
redis_1  | 09:12:20 stunnel.1 | 2019.03.31 09:12:20 LOG7[23]: TLS alert (write): fatal: handshake failure
redis_1  | 09:12:20 stunnel.1 | 2019.03.31 09:12:20 LOG3[23]: SSL_accept: 141F7065: error:141F7065:SSL routines:final_key_share:no suitable key share
redis_1  | 09:12:20 stunnel.1 | 2019.03.31 09:12:20 LOG5[23]: Connection reset: 0 byte(s) sent to TLS, 0 byte(s) sent to socket