OpenSSL 是一个软件库,供需要通过计算机网络进行安全通信以防止窃听,或需要识别对端身份的应用程序使用。它被互联网服务器广泛使用,包括绝大多数 HTTPS 网站。
此库是基于 Indy 库的组件在需要安全连接时所必需的。如果您的应用程序需要 OpenSSL,则必须在部署应用程序之前在文件系统中准备好必要的文件:
目前,sgcWebSockets 支持:1.0.2、1.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 库:
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 加载额外函数中了解更多信息。
如果您想在服务器上提供 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 等事件将在连接线程的上下文中触发,可避免某些同步问题并提供更好的性能。但需注意,如果您在收到消息时更新窗体中的可视控件,必须自行实现同步方法,因为可视控件不是线程安全的。