【发布时间】:2019-11-02 14:04:52
【问题描述】:
我有一个在 Docker 容器(ubuntu 18.04)中运行的 DataSnap 服务器,当尝试连接到它时,它返回“连接正常关闭”。加密过滤器已打开,我知道此消息通常意味着我忘记包含应用程序可以找到的 OpenSSL 库。我相当有信心缺少 OpenSSL 库是问题所在,因为我在没有加密过滤器的情况下编译了 DataSnap 服务器并且连接正常。
这不是我们的第一个 DataSnap 服务器应用程序,而是第一次在 Linux 环境中运行。我们习惯于将 libeay32.dll 和 ssleay32.dll 包含在与我们的 Windows 应用程序相同的文件夹中,但是我在这个 Linux / ubuntu 环境中提供类似库文件的尝试没有奏效。
查看这篇文章 (http://docwiki.embarcadero.com/RADStudio/Rio/en/OpenSSL) 并查看 Indy10 源代码 (IdSSLOpenSSLHeaders.pas),似乎所需的库文件是 libssl.so 和 libcrypto.so。还有一个 SSLDLLVers 常量字符串数组,用于尝试加载不同版本的库文件。
我认为 OpenSSL 已经在 ubuntu 18.04 中,但我还运行了“apt-get -y install openssl”命令来确保。我已将生成的文件(libcrypto.so.1.1 和 libssl.so.1.1)从 /usr/lib/x86_64-linux-gnu 文件夹复制到与 DataSnap 服务器相同的文件夹和 /usr/lib 文件夹中。在每种情况下,我只用 .so 扩展名重命名了文件。我已经验证了该副本确实有效,但没有运气。
感觉有两个可能的障碍 - 库文件不在正确的位置并且没有被加载,或者存在库版本问题。 Indy10 源代码正在寻找最高 .1.0.2 的版本扩展,这是 .1.1。当我将文件复制到应用程序文件夹并保留 .so 扩展名时,我删除了完整的扩展名,这有点作弊,但我们运行最新 OpenSSL 库的 Windows DataSnap 服务器没有任何问题,所以我希望它是不是版本兼容性问题。
如果有任何帮助或建议,我将不胜感激。如果这引起了 Remy Lebeau 的个人回应,那将是一份提前的节日礼物!
【问题讨论】:
-
您怎么知道“Indy10 源代码正在寻找最高 .1.0.2 的版本扩展”? “我在复制文件时删除了完整的扩展名,这有点作弊”真的吗?什么是“完整的扩展”?
-
IdSSLOpenSSLHeaders.pas 中的 SSLDLLVers 常量数组在尝试加载其中一个库时使用。这个字符串数组有几个不同的版本,用作文件扩展名之后的文件后缀。它似乎会尝试加载
libcrypto.so、libcrytpto.so.10、libcrypto.so.1.0.2等。我称我正在做的事情是“作弊”,因为我正在将文件libcrypto.so.1.1复制到libcrypto.so并删除版本后缀希望加载常规的 .so 文件时不会出现任何版本兼容性问题。 -
Indy 还不支持 OpenSSL 1.1.x(相关工作正在进行中)。 1.0.2 是支持的最后一个版本。不要重命名文件。 1.1.x 不向后兼容 1.0.2
-
谢谢@RemyLebeau,我会去找1.0.2的库文件。