Compio 的内核 TLS (kTLS) 支持!
- 基于 ktls-core 实现
- 不锁定特定的 Compio 运行时实现
- 可插拔的 TLS 实现(目前支持 Rustls)
- 目前仅支持 TLS 1.3
- 支持 NewSessionTicket、KeyUpdate 和 Alert 消息处理
- 支持读写分离(不是那种读写互斥式的),实现真正意义上的并发 I/O
rustls(默认):启用 Rustls 集成ring:使用 ring 作为加密后端sync:单线程无须开启,多线程才需要。仅对读写分离有用。
use compio_ktls::{KtlsConnector, KtlsAcceptor};
// 客户端
let connector = KtlsConnector::from(client_config);
match connector.connect("example.com", tcp_stream).await? {
Ok(stream) => {
// 成功启用 kTLS
}
Err(stream) => {
// kTLS 不可用,回退到原始 stream
}
}
// 服务端
let acceptor = KtlsAcceptor::from(server_config);
match acceptor.accept(tcp_stream).await? {
Ok(stream) => {
// 成功启用 kTLS
}
Err(stream) => {
// kTLS 不可用,回退到原始 stream
}
}可以将 KtlsStream 拆分为“独立”的读、写两半,在不同的协程上并发使用:
use compio::io::util::Splittable;
let (mut reader, mut writer) = stream.split();
// 现在 reader 和 writer 可以并发使用除了比如 KeyUpdate 这种内部处理的特殊消息之外,读写两半之间没有任何交互了,所以不需要担心死锁问题。
需要 Linux 内核支持 kTLS,建议使用 6.6 或更新版本的 LTS 内核。
检查内核是否已加载 kTLS 模块:
lsmod | grep tls如果没有加载,可以手动加载:
sudo modprobe tls另需 Rustls 启用 enable_secret_extraction:
use std::sync::Arc;
use rustls::ClientConfig;
let mut config = ClientConfig::builder()
.dangerous()
.with_custom_certificate_verifier(/* ... */)
.with_no_client_auth();
config.enable_secret_extraction = true;
let config = Arc::new(config);- 我大幅参考了 ktls-core 的实现,但介于 I/O 不兼容无法 100% 直接用,所以很多东西只能重写一遍,致谢的同时,许愿之后能合并到上游!
adaptor.rs是仿照 compio-tls 来做的。
可选以下任一许可证:
- Apache License, Version 2.0
- 木兰宽松许可证,第 2 版
SPDX-License-Identifier: Apache-2.0 OR MulanPSL-2.0