将Indy库升级以使用最新的OpenSSL库

4
升级Indy库以使用最新功能(例如TLS v1.3)的OpenSSL库的过程是什么?
我找到的最后一个版本的Indy库使用了libssl32.dll和ssleay32.dll动态链接库。而最新的OpenSSL库生成了libssl-1_1.dll和libcrypto-1_1.dll动态链接库。通过更改Indy库中的DLL名称,OpenSSL DLL的动态加载失败,因为Indy定义的许多函数与OpenSSL DLL的函数不匹配。因此,OpenSSL API已经发生了变化。
据我所知,应该升级Delphi源文件IdSSL*.pas的Indy库:
  • IdSSL.pas
  • IdSSLDotNET.pas
  • IdSSLOpenSSL.pas
  • IdSSLOpenSSLHeaders.pas
  • IdSSLOpenSSLHeaders_static.pas
  • IdSSLOpenSSLUtils.pas
3个回答

8
正如您所观察到的,OpenSSL 1.1 有另一个API。目前,Indy仅使用1.0调用,不使用1.1特定的功能,如异步处理。让Indy切换到Open SLL 1.1将是一个大的重构(请参见下面Remy的评论)。
但是,Indy使用的OpenSSL DLL没有被弃用。Fulgan Reference WebSite 目前具有例如openssl-1.0.2o-i386-win32.zip,这是分支上可用的最新稳定修订版,正如官方OpenSSL源代码所述。您混淆了分支(1.0 vs 1.1 = API更改)和修订版本(1.0.2a vs 1.0.2o = 新修复)。
所以不用担心。如果你使用带有适当Cypher名称列表和最新Fulgan DLL的Indy,那么你就非常更新和安全了。有时比一些旧的Linux发行版更安全,因为它们可能落后于系统附带的修订版。即使TLS 1.3还远未成为强制性要求,因为它尚未在客户端启用。我相信Indy团队将在某些功能变为强制性要求时支持1.1(或切换到Windows SChannel API)。

1
OpenSSL 1.0.2多年来支持TLS 1.2 - 我不明白你的观点。请检查1.0和1.1分支的功能集。您正在混淆分支和修订版本。 1.0.2o比1.1.0a更加现代化和安全。 - Arnaud Bouchez
2
@Flaviu Indy目前仅支持OpenSSL 1.0.2及更早版本,尚不支持OpenSSL 1.1.0。TLS 1.3将不会在OpenSSL 1.0.2中实现,它需要OpenSSL 1.1.1。但是,OpenSSL 1.1.0与OpenSSL 1.0.2相比具有重大的API更改,即使是TLS 1.3也是对TLS 1.2的重大重写。因此,这不是简单地放入新的DLL或对Indy进行简单的调整。它本质上是一个新的框架,因此需要迁移现有代码。这是一项艰巨的工作。 - Remy Lebeau
2
Indy将最终支持OpenSSL 1.1.x,但不会在近期内实现。而TLS 1.3尚未标准化。到TLS 1.3准备好广泛公开使用的时候(OpenSSL仍在进行实验),Indy 可能已经更新以支持OpenSSL 1.1.0。或者它可能已经实现了不同的解决方案(在Windows上使用SChannel)。现在还为时过早,无法确定。 - Remy Lebeau
1
谢谢!我以为你是使用脚本从头文件、def文件和/或map文件将OpenSSL C符号翻译成Delphi,然后有一个通常的更新Indy的过程。但现在我明白了,在Indy中支持TLS v1.3将是一个重大变化,因为API发生了变化。当你开始这样的升级时,我可以在Github上做出贡献。 - Flaviu
1
@Toby 请查看Radek的答案。支持OpenSSL 1.1.x的工作仍在进行中。 - Remy Lebeau
显示剩余5条评论

3

1
由于OpenSSL库的最新特性1.1.x与支持的OpenSSL库1.0.x之间存在API不兼容性,因此Indy代码必须进行重新编写。这样的升级没有简单/通用的过程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接