我有一個客戶端和服務器,用于SSL_set_fd()在現有連接上啟動握手。基本上服務器會:
auto ctx = SSL_CTX_new(TLS_server_method());
SSL_CTX_set_options(ctx, SSL_OP_ENABLE_KTLS);
SSL_CTX_use_certificate_chain_file(ctx, "cert.pem");
SSL_CTX_use_PrivateKey_file(ctx, "priv.pem", SSL_FILETYPE_PEM);
auto ssl = SSL_new(ctx);
SSL_set_fd(ssl, sock);
SSL_accept(ssl); // client does SSL_connect()
std::cerr << BIO_get_ktls_send(SSL_get_wbio(ssl)) << "\n";
std::cerr << BIO_get_ktls_recv(SSL_get_rbio(ssl)) << "\n";
我已經排除了錯誤處理和額外的證書檢查,但我的問題是為什么它只在 TX 上啟用 ktls,而不是 RX。換句話說,這會列印一個 1,然后是一個 0。
當我 strace 時,我看到 OpenSSL 確實在套接字上激活 TLS,并為 TX 啟用它:
setsockopt(4, SOL_TCP, TCP_ULP, [7564404], 4) = 0
setsockopt(4, SOL_TLS, TLS_TX, "…algorithm and key material…") = 0
那是整數形式的“tls”,可以開始使用 KTLS。當套接字打開時,內核模塊tls的使用會增加(見lsmod | grep tls)。
對于 TX,這看起來像是在執行內核檔案的兩個步驟,但為什么不TLS_RX呢?
我不太了解BIOOpenSSL,所以我懷疑我需要附加一個BIO,這將激活它?至少我推斷我錯過了與 KTLS 兼容的BIO閱讀此評論。但話又說回來,它在沒有它的情況下適用于 TX。
我的問題是:我要在上面添加什么來使 KTLS 為 RX “啟動”?
當然,我也會接受任何其他更改建議,例如“哦,您使用的是舊界面,這更好”。但是,雖然可能有更高級別的 API,但通過修改我目前擁有的內容,這肯定也是可行的嗎?
也許我可以從 OpenSSL 中提取加密引數并呼叫setsockopt(…… TLX_RX, …)自己?雖然看起來 OpenSSL 應該能夠以更便攜的方式打開它。
OpenSSL 版本是 Ubuntu 22.04.1 LTS 附帶的版本:3.0.2-ubuntu1.7。openssl version說OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)。
檢查apt-get source libssl-dev源看起來它應該支持 RX 和 TX。
客戶端和服務器都在 TX 上獲得 KTLS,但在 RX 上沒有,所以不應該是他們協商了不同的演算法,只有其中一個是 KTLS 兼容的。
uname -a是Linux myhost 5.15.0-46-generic #49-Ubuntu SMP Thu Aug 4 18:03:25 UTC 2022 x86_64 x86_64 GNU/Linux
uj5u.com熱心網友回復:
在此之前未為 TLS 1.3 啟用接收路徑上的 KTLS提交,在撰寫本文時,似乎尚未將其集成到任何 OpenSSL 版本中(最新為 1.1.1 和 3.0.7)。
強制 TLS 版本為 1.2 為 RX 和 TX 啟用 KTLS:
SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION);
SSL_CTX_set_max_proto_version(ctx, TLS1_2_VERSION);
在此修復后,測驗程式回傳1并1用于 TX 和 RX KTLS。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/531634.html
上一篇:使用TLS1.2將edtftpj/pro7.3.0連接到FileZilla服務器1.5.1:未找到支持的密碼套件錯誤
