1 个不稳定版本
0.0.2+rustls.0.22.0 | 2024年1月16日 |
---|
#1529 in 加密学
1MB
24K SLoC
Craftls是Rustls库的分支,具有可自定义的ClientHello指纹。
状态
Craftls正在积极开发中。我们旨在保持合理的API表面稳定性,但API可能会随着我们为适应新功能或性能改进而进行更改。
变更日志
每次发布的详细更改列表可以在https://github.com/3andne/craftls/releases找到。
文档
方法
Craftls
是一个TLS库,旨在作为Rustls
的替代品,同时提供可自定义的ClientHello
,同时保持强大的安全性和易于使用。
当前功能(使用默认crate功能)
- 从Rustls继承的功能
ClientHello
扩展的自定义选项ClientHello
密码套件的自定义选项。- 支持使用
zlib
、zstd
和brotli
压缩方法(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