Kubernetes 如何拯救了我的桌面应用程序

如果您有一个损坏的 Java 桌面应用程序,但又不是加密专家,请记住这个修复方法。
110 位读者喜欢这篇文章。
Puzzle pieces coming together to form a computer screen

Opensource.com

最近,Opensource.com 的同事 James Farrell 写了一篇精彩的文章,题为Ansible 如何为我的家庭带来和平。除了这篇很棒的文章外,我真的很喜欢这个标题,这是一个意想不到的短语,我相信它给许多人带来了笑容。

我最近也经历了一次奇怪但积极的体验,这需要一个类似的意想不到的标签。我一直在努力解决一个难题,这个问题是在升级一些服务器和网络基础设施时出现的,这破坏了一个自 2000 年代初期以来我一直支持的 Java 应用程序。奇怪的是,我在一篇关于 Kubernetes 的信息量很大且非常好的文章中找到了解决方案,真是出乎意料。

废话不多说,这是我的问题

我猜大多数读者看到这条消息会想到诸如“我希望日志文件中能有更多信息”或“我真的很高兴我从来没有收到过这样的消息”之类的话。

不幸的是,日志文件中没有太多信息,实际上只有相同的消息。为了调试这个问题,我做了三件事

  1. 我在网上搜索了这条消息。有趣的是,或者也许是不祥之兆,只有大约 200 条关于这个字符串的搜索结果,其中一条建议 开启多的调试输出,这涉及到添加设置

    -Djavax.net.debug=ssl:handshake:verbose

    到运行应用程序的 java 命令。

  2. 我尝试了这个建议,这导致了很多输出(很好),但其中大多数对我来说只是有点道理,因为我不是像 SSL 这样的底层内容的专家。但我注意到的一件事是,在所有这些输出中,没有关于服务器响应的信息;

  3. 所以我又搜索了一些。

这个问题的另一个有趣之处在于,当使用 OpenJDK 中捆绑的 Java 命令执行代码时,代码运行良好,但在使用以这种方式从相同的 OpenJDK 创建的定制运行时运行时,代码会失败并出现此错误。因此,从上面的搜索 #1 中出现的相对较少的明显类似问题实际上并没有那么相关,因为它们似乎主要处理服务器上与 PostgreSQL JDBC 检查服务器凭据的能力相关的错误 SSL 证书。

我还应该提到,我花了一段时间才意识到问题是由使用自定义 Java 运行时引入的,因为我设法检查了沿途的许多其他可能性(实际上,我确实在解决问题的过程中修复了一些小错误)。我的努力包括获取最新的 OpenJDK,检查和重新检查所有 URL,以防出现拼写错误等等。

正如经常发生的那样,在将问题搁置几个小时后,我突然想到一个主意——也许我的自定义 Java 运行时中缺少一些模块。虽然我没有收到任何直接暗示该问题的错误,但标准 OpenJDK 环境工作而自定义环境失败的明显事实似乎暗示了这种可能性。我快速查看了 OpenJDK 安装中的 jmods/ 文件夹,但那里大约有 70 个模块,没有引起我的注意。

但同样,奇怪的是,在打开调试(参见上面的 #1)的情况下,没有迹象表明服务器会接受什么,只是客户端主要无法提供什么,很多行像这样

Ignoring unavailable cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA

所以此时我至少在想,也许缺少的是提供这些类型的密码套件的模块。所以我开始使用“jdbc crypto”之类的字符串进行搜索,在搜索过程中,最不可能出现的一篇文章出现了:优化 Kubernetes 服务—第 2 部分:Spring Web,由 Juan Medina 撰写。在文章中途,我看到了以下内容

哈!想象一下,他的脚本正在创建一个自定义 Java 运行时,就像我的脚本一样。但他说他需要手动添加模块 jdk.crypto.ec 才能通过 SSL 连接到他的 PostgreSQL 环境。听起来确实很熟悉。

事实上,这也是我问题的解决方案;缺少的模块是 jdk.crypto.ec,我能够像这样将其添加到我的构建中

DEPS=$(JAVA_HOME)/bin/jdeps --print-module-deps $(TEST_HOME)/MyApp.jar \ $(TEST_HOME)/lib/*.jar,jdk.crypto.ec;
$(JAVA_HOME)/bin/jlink --module-path $(W64_JAVA_HOME)/jmods
–no-header-files --no-man-pages --compress=2 –strip-debug
–add-modules $$DEPS --output $(TEST_HOME)/java-runtime

(我在这里交叉构建 Windows Java 运行时;有关此主题的更多信息,请参阅我之前的文章)。

结论

对于像我这样不太了解加密的人来说,这真是一个很大的解脱。再一次,开源,更重要的是,与开源相关的分享意愿,非常重要。哇,使用 Kubernetes 来修复 Java 桌面应用程序,这也太棒了!再次感谢 Juan Medina!

接下来阅读什么
标签
Chris Hermansen portrait Temuco Chile
自从 1978 年毕业于不列颠哥伦比亚大学以来,我一直离不开各种电脑。自 2005 年以来,我一直是全职 Linux 用户,从 1986 年到 2005 年是全职 Solaris 和 SunOS 用户,在此之前是 UNIX System V 用户。

6 条评论

这篇文章对我来说也很及时,因为我也在解决类似的问题。谢谢!

好文章... 感谢您提及我之前的工作 :)

就其优点而言,Java 及其安全部分可能真的很难调试。

鉴于软件日益增长的复杂性,似乎越来越有必要在看似不相关的项目和帖子中找到调试解决方案。

我还认为,像这样记录不充分且神秘的问题最终会使人们更难采纳良好的安全实践,有时会导致绝望的解决方法,从而使安全性变得更糟。

谢谢!

James,感谢您的友好评论。

关于 Java - 最近我一直在涉足整个流和收集器的事情,我不得不说,当我搞砸语法时,编译器发出的消息也可能非常晦涩难懂。

我认为,随着每六个月做一些有用的事情(除了修复所有错误之外)的压力开始压在人们身上,我们将面临更多这类事情。此外,我不清楚那些旨在使用这些新东西的出色项目将如何跟上步伐。

不要过于悲观!只是有点担心。

回复 作者 JamesF

我认为自包含环境的概念揭示了关于软件、依赖项和故障排除的一些有趣的事情。Kubernetes 和 pod 和容器和命名空间与 Java 模块化、Python 环境等很好地对齐。协同作用!

感谢您的评论,Seth!当然,存在概念上的一致性,我想这就是我的文章(有点开玩笑)的重点 - Kubernetes 如何与大约 20 年前设计的经典胖桌面应用程序相关?好吧,首先是部署...

回复 作者 sethkenlon

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.