Skip to content

Latest commit

 

History

History
109 lines (78 loc) · 4.46 KB

File metadata and controls

109 lines (78 loc) · 4.46 KB

compio-ktls

Compio 的内核 TLS (kTLS) 支持!

English CI 许可 许可

概述

  • 基于 ktls-core 实现
  • 不锁定特定的 Compio 运行时实现
  • 可插拔的 TLS 实现(目前支持 Rustls)
  • 目前仅支持 TLS 1.3
  • 支持 NewSessionTicket、KeyUpdate 和 Alert 消息处理
  • 支持读写分离(不是那种读写互斥式的),实现真正意义上的并发 I/O

可选 features

  • 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