1 个不稳定版本

0.0.2+rustls.0.22.02024年1月16日

#1529 in 加密学

Apache-2.0 OR ISC OR MIT

1MB
24K SLoC

Craftls是Rustls库的分支,具有可自定义的ClientHello指纹。

状态

Craftls正在积极开发中。我们旨在保持合理的API表面稳定性,但API可能会随着我们为适应新功能或性能改进而进行更改。

变更日志

每次发布的详细更改列表可以在https://github.com/3andne/craftls/releases找到。

文档

https://docs.rs/craftls/

方法

Craftls是一个TLS库,旨在作为Rustls的替代品,同时提供可自定义的ClientHello,同时保持强大的安全性和易于使用。

当前功能(使用默认crate功能)

  • Rustls继承的功能
  • ClientHello扩展的自定义选项
  • ClientHello密码套件的自定义选项。
  • 支持使用zlibzstdbrotli压缩方法(rfc8879)进行客户端证书压缩。
  • ClientHello填充扩展(rfc7685)。
  • Grease扩展(rfc8701
  • TLS ClientHello扩展排列(chrome
  • 预定义的浏览器指纹
    • CHROME_108
    • CHROME_112
    • SAFARI_17_1
    • FIREFOX_105

非功能特性

我们将不支持Rustls README中列出的任何非功能特性,包括过时的TLS版本和过时的密码套件。

尽管这些非功能特性可能包含在浏览器指纹中以确保完整性,但任何服务器尝试使用它们都将导致连接终止。大多数现代和安全的服务器都不会使用这些过时的选项,因此这项措施不应影响常规使用。

示例代码

参见 examples/src/bin/craftclient.rs

配置

直接使用

要直接使用 craftls,只需在您的 Cargo.toml 中添加 craftls

作为 rustls 的替代品

如果您想在嵌套依赖(依赖的依赖)中使用 craftls 替代 rustls,您可以在 Cargo.toml 中使用 patch.crates-io 部分。

[patch.crates-io]
rustls = { git = 'https://github.com/3andne/craftls.git', tag = "your version" }

请确保将 "your version" 替换为您打算使用的 craftls 的具体版本标签。 此补丁将确保在整个项目中(包括 tokio-rustls 等库中)使用 craftls 替代 rustls

使用方法

Craftls 被设计为 Rustls 的直接替代品,并增加了指定 TLS 指纹的功能。以下是如何在 Craftls 中配置 ClientConfig 以使用特定指纹的指南。

let mut config: rustls::ClientConfig = rustls::ClientConfig::builder()
    .with_root_certificates(root_store)
    .with_no_client_auth()
    .with_fingerprint( // Specifies the fingerprint we want to use, i.e., CHROME v108
        rustls::craft::CHROME_108
            .builder(),
    );

设置好带有首选指纹的 ClientConfig 后,您可以像使用 Rustls 一样继续操作。其余的 API 与 Rustls 库保持一致。

与 http 客户端一起使用

例如 hyper 的 http 客户端内部管理 ALPN 设置。如果 ALPN 是外部设置的,则可能会引发问题。使用以下配置以避免恐慌

let mut config: rustls::ClientConfig = rustls::ClientConfig::builder()
    .with_root_certificates(root_store)
    .with_no_client_auth()
    .with_fingerprint(
        rustls::craft::CHROME_108
            .builder()
            .do_not_override_alpn(), // let the http client manage the alpn
    );

与 http/1.1 或非 http 客户端一起使用

警告:浏览器是 h2 客户端。《Http1.1 和非 http 变体偏离了浏览器标准浏览器行为,应谨慎使用。

let mut config: rustls::ClientConfig = rustls::ClientConfig::builder()
    .with_root_certificates(root_store)
    .with_no_client_auth()
    .with_fingerprint(
        rustls::craft::CHROME_108
            .test_alpn_http1 // alpn: ["http/1.1"]
            .builder(),
    );

或者

let mut config: rustls::ClientConfig = rustls::ClientConfig::builder()
    .with_root_certificates(root_store)
    .with_no_client_auth()
    .with_fingerprint(
        rustls::craft::CHROME_108
            .test_no_alpn // no alpn extension
            .builder(),
    );

许可证

Craftls 在以下三个许可证下分发

  • Apache License 版本 2.0。
  • MIT 许可证。
  • ISC 许可证。

这些分别包括为 LICENSE-APACHE、LICENSE-MIT 和 LICENSE-ISC。您可以选择在任意一个许可证的条款下使用此软件。

行为准则

本项目采用 Rust 行为准则。有关不当行为的报告,或对行为准则有任何评论或问题,请发送电子邮件至 [email protected]


图标由 icons8 提供

依赖项

~17–36MB
~833K SLoC