You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu 18.04下启动Delphi 10.3.2 DataSnap服务器遇OpenSSL异常求助

解决Ubuntu 18.04下Delphi 10.3.2 DataSnap服务器的SSL库加载异常问题

我之前帮同行排查过类似的跨平台DataSnap SSL加载故障,结合你的场景,给你几个针对性的解决方案和排查方向:

1. 先处理前置的EThreadNameException异常

这个异常是Delphi在Linux平台下线程命名机制的兼容性问题,本身不会影响核心服务,但会干扰后续SSL问题的排查,建议先处理:

  • 在服务器主入口的最开始注册该异常类,避免抛出未处理异常:
    {$IFDEF LINUX}
    System.SysUtils.RegisterExceptionClass(EThreadNameException);
    {$ENDIF}
    
  • 或者在主程序的try-except块中捕获并忽略它:
    try
      Application.Initialize;
      Application.CreateForm(TServerContainer1, ServerContainer1);
      Application.Run;
    except
      {$IFDEF LINUX}
      on E: EThreadNameException do; // 仅忽略线程命名异常
      {$ELSE}
      raise; // Windows下正常抛出其他异常
      {$ENDIF}
    end;
    

2. 修正OpenSSL库的部署方式(关键!)

你之前部署的是静态库(.a文件),但Indy在Linux下仅支持动态链接库(.so,这是核心问题之一:

  • 确认你编译的OpenSSL在/opt/openssl/lib目录下生成了libcrypto.so.1.1libssl.so.1.1动态库文件。
  • 配置系统库路径,让服务器能找到这些动态库:
    • 临时生效:启动服务器前执行以下命令(适合测试):
      export LD_LIBRARY_PATH=/opt/openssl/lib:$LD_LIBRARY_PATH
      ./YourDataSnapServerExecutable
      
    • 永久生效:将OpenSSL库路径添加到系统配置:
      echo "/opt/openssl/lib" | sudo tee /etc/ld.so.conf.d/openssl-1.1.1.conf
      sudo ldconfig
      
  • 如果编译生成的是不带版本号的libcrypto.solibssl.so,需要手动创建版本号软链接,匹配Indy的加载规则:
    cd /opt/openssl/lib
    sudo ln -s libcrypto.so libcrypto.so.1.1
    sudo ln -s libssl.so libssl.so.1.1
    

3. 优化Indy组件的SSL配置

Delphi 10.3.2自带的Indy版本(约10.6.2)对OpenSSL 1.1.x的支持有细节需要调整:

  • 打开DataSnap的ServerContainer数据模块,找到IdSSLIOHandlerSocketOpenSSL组件,检查其SSLVersions属性,确保勾选了sslvTLSv1_2sslvTLSv1_3(这两个是OpenSSL 1.1.1支持的主流版本),不要仅保留旧版TLS选项。
  • 条件允许的话,手动更新Indy到最新的10.6.3版本(需匹配Delphi 10.3.2的编译环境),新版本修复了不少OpenSSL 1.1.x的兼容性问题。

4. 验证库加载状态

如果问题仍存在,用以下方式排查依赖:

  • ldd命令检查服务器可执行文件的SSL库依赖:
    ldd ./YourDataSnapServerExecutable | grep -E "(crypto|ssl)"
    
    若输出显示not found,说明库路径配置仍有问题,需重新检查LD_LIBRARY_PATHldconfig的配置。
  • 在Delphi代码中添加调试输出,查看Indy尝试加载的SSL库路径:
    {$IFDEF LINUX}
    ShowMessage('SSL库路径: ' + IdSSLOpenSSLHeaders.GetLibSSLPath);
    ShowMessage('Crypto库路径: ' + IdSSLOpenSSLHeaders.GetLibCryptoPath);
    {$ENDIF}
    
    确认输出路径指向你部署的正确动态库文件。

内容的提问来源于stack exchange,提问作者Jens.F

火山引擎 最新活动