OpenSSL

OpenSSL 是一个软件库,供需要通过计算机网络进行安全通信以防止窃听,或需要识别对端身份的应用程序使用。它被互联网服务器广泛使用,包括绝大多数 HTTPS 网站。

 

此库是基于 Indy 库的组件在需要安全连接时所必需的。如果您的应用程序需要 OpenSSL,则必须在部署应用程序之前在文件系统中准备好必要的文件:

 

目前,sgcWebSockets 支持:1.0.21.1 以及 3.0 至 3.3 openSSL 版本。

 

平台 API 1.0 API 1.1 API 3.* 静态/动态链接
Windows(32 位和 64 位) libeay32.dll 和 ssleay32.dll libcrypto-1_1.dll 和 libssl-1_1.dll libcrypto-3.dll and libssl-3.dll 动态
OSX libcrypto.dylib, libssl.dylib libcrypto.1.1.dylib, libssl.1.1.dylib libcrypto.3.dylib, libssl.3.dylib 动态
iOS 设备(32 位和 64 位) libcrypto.a and libssl.a libcrypto.a and libssl.a libcrypto.a and libssl.a Static
iOS 模拟器 libcrypto.dylib, libssl.dylib libcrypto.1.1.dylib, libssl.1.1.dylib libcrypto.3.dylib, libssl.3.dylib 动态
Android 设备 libcrypto.so, libssl.so libcrypto.so, libssl.so libcrypto.so, libssl.so 动态

 

 

请参阅以下内容,了解如何为每个平台 配置 OpenSSL 库:

 

 

openSSL 配置

sgcWebSockets 基于 Indy 的组件允许您配置部分 OpenSSL 属性。可访问以下属性:

 

 

API 版本

 

标准 Indy 库仅允许加载 1.0.2 OpenSSL 库;这些库已被弃用,最新的 OpenSSL 版本使用 1.1.1 API。

sgcWebSockets Enterprise 允许您加载 1.1.1 openSSL 库,您可以在此属性中配置将加载哪个 openSSL API 版本。每个进程只能加载一个 API 版本(因此同一应用程序中不能混用 openSSL 1.0.2 和 1.1.1 库)。

 

 

LibPath

 

此属性允许您设置 openSSL 库的位置。这对 Android 或 OSX 项目非常有用,因为在这些平台上必须设置 openSSL 库的位置。

接受以下值:

 

 

 

加载附加的 OpenSSL 函数

使用回调加载默认情况下未定义的额外 OpenSSL 函数。您可以在 OpenSSL 加载额外函数中了解更多信息。

 

密码套件

如果您想在服务器上提供 TLS 1.2 和 1.3 支持,并使用最佳安全性和性能,请使用以下配置:

 

SSLOptions.Version := tls1_3;

SSLOptions.OpenSSL_Options.VersionMin := tls1_2;

SSLOptions.OpenSSL_Options.APIVersion := oslAPI_3_0;

 

并设置以下密码列表。

 

AEAD-AES128-GCM-SHA256:AEAD-AES256-GCM-SHA384:AEAD-CHACHA20-POLY1305-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384

 

自签名证书

您可以使用自签名证书进行测试。只需执行以下命令即可创建自签名证书:

 

openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem

该命令将创建 2 个文件:cert.pem(证书)和 key.pem(私钥)。您可以将两个文件合并为一个文件。只需创建一个新文件,将两个文件的内容复制进去即可,结构如下:

 

-----BEGIN PRIVATE KEY-----

....

-----END PRIVATE KEY-----

-----BEGIN CERTIFICATE-----

....

-----END CERTIFICATE-----

 

常见错误

SSL_GET_RECORD: 版本号错误

 

此错误表示服务器与客户端使用了不同版本的 SSL/TLS 协议。要修复此问题,请尝试在服务器和/或客户端组件中设置正确的版本。

 

Server.SSLOptions.Version

Client.TLSOptions.Version

 

SSL3_GET_RECORD: decryption failed or bad record mac

 

通常此错误在以下情况下触发:

 

1. 检查您使用的 OpenSSL 版本是否为最新版。若版本过旧,请更新至最新支持版本。

2. 若此错误随机出现,通常是因为多个线程正在访问同一个 OpenSSL 连接。您可以尝试将 NotifyEvents 设置为 neNoSync,这意味着 OnConnect、OnDisconnect、OnMessage 等事件将在连接线程的上下文中触发,可避免某些同步问题并提供更好的性能。但需注意,如果您在收到消息时更新窗体中的可视控件,必须自行实现同步方法,因为可视控件不是线程安全的。