TsgcUDPCLient › Properties › DTLSOptions
启用 DTLS 时应用的证书、验证和 OpenSSL 设置。
property DTLSOptions: TsgcUDPDTLSClient_Options read FDTLSOptions write SetDTLSOptions;
—
对驱动 DTLS 握手的参数进行分组。RootCertFile 是用于验证对端的信任存储,与该属性在 TLS 和 QUIC 传输上的含义相同。CertFile 是本客户端的证书,它读取的文件可以同时包含证书及其中间证书,因此证书链文件也可以使用。KeyFile 是与 CertFile 配对的私钥。VerifyCertificate 切换服务器证书验证,VerifyDepth 限制证书链的长度。当 VerifyCertificate 为 True 且 RootCertFile 为空时,将使用操作系统的证书存储作为信任锚。OpenSSL_Options 选择 OpenSSL API 版本(oslAPI_1_1 或 oslAPI_3_0)以及加载 OpenSSL 库的文件夹。这些设置仅在 DTLS 为 True 时生效,对普通 UDP 流量忽略。
IOHandler(默认 iohOpenSSL)选择 DTLS 引擎。iohNativeTLS 让握手和记录层运行在 sgcCrypto 包的原生 DTLS 1.2 引擎上,因此不会加载任何 OpenSSL 库。它仅支持带前向保密的 ECDHE AEAD 密码套件(AES-128-GCM、AES-256-GCM 和 ChaCha20-Poly1305),证书使用 ECDSA 或 RSA,密钥交换基于 X25519、P-256 或 P-384,需要扩展主密钥,且不进行会话恢复。CertFile 和 KeyFile 可以是 PEM 或 DER 格式。在未包含 sgcCrypto 包的构建中使用 iohNativeTLS 会引发错误。其他任何值都保留 OpenSSL 路径。原生路径上不会触发 OnDTLSVerifyPeer,因为那里没有 OpenSSL 证书对象可以传递。当 VerifyCertificate 为 True 时,证书链会依据 RootCertFile 或系统根证书进行校验,本组件背后的 DTLS 引擎 TsgcDTLS_Component 会改为在其 OnVerifyPeerNative 事件中提供 DER 格式(叶证书在前)的对端证书链、验证结果和一个 var Accept 参数。参阅不使用 OpenSSL 运行。
RootCertFile 的含义已经改变,这是一项破坏性变更。它以前会被当作本端自身的证书加载,这与库中其他部分的做法并不一致。如果配置在 RootCertFile 中指定证书、在 KeyFile 中指定密钥而将 CertFile 留空,组件启动时现在会引发错误:
DTLS_error: RootCertFile is the trust store used to verify the other end, not this endpoint's own certificate. Set CertFile to the certificate that goes with KeyFile.
要更新这类配置,请把证书路径从 RootCertFile 移到 CertFile,并让 RootCertFile 保留用于验证对端的证书颁发机构。该错误是有意设计为致命错误的。如果没有它,客户端会在每次运行时静默地出示一个指纹各不相同的自签名证书。
VerifyCertificate 现在会被强制执行。以前验证结果虽被计算但随即被丢弃,因此即使打开了验证,任何证书也都会被接受,包括由不受信任的颁发机构签发的证书。现在证书链验证失败会终止握手。VerifyCertificate 默认仍为 False,因此默认配置保持不变。
TsgcRTCPeerConnection 不受影响。WebRTC 通过 SDP 中携带的指纹而不是证书链来认证对端,并且保持 VerifyCertificate 处于关闭状态。这才是通常的 WebRTC 配置,它的工作方式与以前完全相同。
oClient.DTLS := True;
oClient.DTLSOptions.CertFile := 'client.pem';
oClient.DTLSOptions.KeyFile := 'client.key';
oClient.DTLSOptions.VerifyCertificate := True;
oClient.DTLSOptions.OpenSSL_Options.APIVersion := oslAPI_3_0;