如何在禁用安全性较低的 TLS 协议版本的情况下构建 OpenSSL 1.0 DLL?
How to build OpenSSL 1.0 DLLs with less secure TLS protocol versions disabled?
我有一个提供 FTPS 服务的闭源 Windows 服务器应用程序。已强制要求该服务应拒绝使用低于 1.2 的协议版本的 TLS 连接。
该应用程序使用 32 位版本的 DLL libssl32.dll
和 libeay32.dll
实现其 OpenSSL,因此我的想法是编译这些 DLL 的自定义版本,不允许使用 TLS 1.0和 1.1.
经过多次搜索,我发现 this answer 描述了配置标志,例如 no-tls1
和 no-tls1-method
分别禁用给定协议版本的协商和实现。然而,这是一个死胡同,因为这些标志仅在 OpenSSL 1.1 及更高版本中可用。
我能够为 OpenSSL 1.1.1 编译 DLL,但它们与应用程序不兼容。编译 OpenSSL 1.0.2 会生成兼容的 DLL,但我无法使用 1.0.2 中可用的标志实现所需的行为。该版本确实有一个 no-tls1
标志,但它的行为与 1.1.x 中的标志不同,使用它对 TLS 协议协商没有影响。
在这一点上,我唯一的选择似乎是修改 OpenSSL 1.0.2u 的源代码以防止使用不需要的 TLS 版本。由于不熟悉代码库,我发布这个是希望有人可以通过描述需要修改什么来实现我的目标来提供帮助。我也愿意考虑替代解决方案。
我能够通过修改 ssl\s23_srvr.c
中的 ssl23_get_client_hello()
函数来检查请求的版本并在低于 TLS 1.2 时抛出 SSL_R_UNSUPPORTED_PROTOCOL
错误来实现我的目标。
我有一个提供 FTPS 服务的闭源 Windows 服务器应用程序。已强制要求该服务应拒绝使用低于 1.2 的协议版本的 TLS 连接。
该应用程序使用 32 位版本的 DLL libssl32.dll
和 libeay32.dll
实现其 OpenSSL,因此我的想法是编译这些 DLL 的自定义版本,不允许使用 TLS 1.0和 1.1.
经过多次搜索,我发现 this answer 描述了配置标志,例如 no-tls1
和 no-tls1-method
分别禁用给定协议版本的协商和实现。然而,这是一个死胡同,因为这些标志仅在 OpenSSL 1.1 及更高版本中可用。
我能够为 OpenSSL 1.1.1 编译 DLL,但它们与应用程序不兼容。编译 OpenSSL 1.0.2 会生成兼容的 DLL,但我无法使用 1.0.2 中可用的标志实现所需的行为。该版本确实有一个 no-tls1
标志,但它的行为与 1.1.x 中的标志不同,使用它对 TLS 协议协商没有影响。
在这一点上,我唯一的选择似乎是修改 OpenSSL 1.0.2u 的源代码以防止使用不需要的 TLS 版本。由于不熟悉代码库,我发布这个是希望有人可以通过描述需要修改什么来实现我的目标来提供帮助。我也愿意考虑替代解决方案。
我能够通过修改 ssl\s23_srvr.c
中的 ssl23_get_client_hello()
函数来检查请求的版本并在低于 TLS 1.2 时抛出 SSL_R_UNSUPPORTED_PROTOCOL
错误来实现我的目标。