
🦀 Стелс-HTTP-клиент для Rust. Имитирует TLS-отпечатки реальных браузеров для необнаруживаемых запросов. Быстрый, типобезопасный и создан для точной сетевой работы.
. Продвинутый скрытный HTTP-клиент для Rust.
Создан для разработчиков, заботящихся о конфиденциальности, которым нужен полный контроль над своим сетевым отпечатком.
Выглядит как браузер. Работает как браузер. Написан на Rust.
Построен на основе bogdanfinn/tls-client — ведущей библиотеки TLS-отпечатков, которой доверяют специалисты по безопасности по всему миру. Мы используем проверенные в бою общие библиотеки bogdanfinn (.dll/.so/.dylib) через FFI-привязки, потому что:
RustTLSX привносит эту проверенную технологию в Rust с типобезопасным и эргономичным API, который в 6 раз быстрее Python-альтернатив.
Современные веб-приложения анализируют каждый аспект ваших HTTP-запросов — не только заголовки и cookie, но и глубокие криптографические сигнатуры вашего TLS-рукопожатия. Стандартные HTTP-клиенты на Rust (reqwest, hyper, ureq) создают легко обнаруживаемые паттерны, которые сразу выдают автоматизированный трафик.
RustTLSX решает эту проблему, предоставляя:
Загрузите необходимую библиотеку TLS-клиента для вашей платформы из релизов tls-client:
tls-client-windows-64-1.3.3.dlltls-client-linux-ubuntu-amd64-1.3.3.sotls-client-darwin-amd64-1.3.3.dylibПоместите файл библиотеки в корень вашего проекта, системный путь библиотек (/usr/local/lib/) или убедитесь, что он доступен через PATH.
Добавьте RustTLSX в ваш Cargo.toml:
[dependencies]
rust-tlsx = "0.1"
use rust_tlsx::{TlsClient, BrowserProfile};
fn main() -> anyhow::Result<()> {
let client = TlsClient::new(BrowserProfile::Firefox120)
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0")
.timeout(30);
let response = client.get("https://example.com")?;
println!("Status: {}", response.status);
println!("Body: {}", response.body);
Ok(())
}
RustTLSX поддерживает более 30 профилей браузеров среди основных браузеров:
// Chrome versions
BrowserProfile::Chrome103
BrowserProfile::Chrome107
BrowserProfile::Chrome109
BrowserProfile::Chrome120
// Firefox versions
BrowserProfile::Firefox102
BrowserProfile::Firefox105
BrowserProfile::Firefox108
BrowserProfile::Firefox120
// Safari versions
BrowserProfile::Safari15_6_1
BrowserProfile::Safari16_0
BrowserProfile::SafariIos16_0
// Opera and others
BrowserProfile::Opera89
BrowserProfile::Opera90
let client = TlsClient::new(BrowserProfile::Chrome109)
.header("Accept", "application/json")
.header("Accept-Language", "en-US,en;q=0.9")
.cookie("session", "abc123")
.cookie("token", "xyz789");
let response = client.get("https://api.example.com")?;
let body = r#"{"username": "user", "password": "pass"}"#;
let response = client.post("https://example.com/login", Some(body.to_string()))?;
let client = TlsClient::new(BrowserProfile::Firefox120)
.timeout(60); // seconds
let response = client.get("https://slow-api.example.com")?;
RustTLSX построен на фундаменте проверенного превосходства, а не на изобретении велосипеда. Мы используем скомпилированные библиотеки bogdanfinn (.dll/.so/.dylib) через FFI, потому что:
Инвестиции в исследования: Bogdanfinn вложил тысячи часов в обратную разработку TLS-поведения браузеров. Повторение этих исследований заняло бы годы и, скорее всего, дало бы худшие результаты.
Проверенная в бою надежность: Эти библиотеки используются крупными компаниями по безопасности, инструментами конфиденциальности и исследовательскими институтами по всему миру. Они протестированы против каждой крупной системы защиты.
Непрерывная эволюция: Отпечатки браузеров постоянно меняются. Библиотеки bogdanfinn получают регулярные обновления для соответствия новым версиям браузеров и обновлениям систем защиты.
Оптимизация производительности: Нативная реализация на C/Go сильно оптимизирована по скорости и эффективности памяти, обеспечивая производительность, которую чистые реализации на Rust не могут превзойти.
Динамическая загрузка во время выполнения: Библиотеки загружаются по требованию через FFI, устраняя сложность статической компоновки и сохраняя производительность.
Управление памятью: Модель владения Rust обеспечивает безопасное взаимодействие с нативными библиотеками, предотвращая утечки памяти и ошибки use-after-free, распространенные в реализациях на C/C++.
Обработка ошибок: Исчерпывающая обработка ошибок на основе Result предоставляет подробную диагностику, сохраняя типобезопасность.
Управление соединениями: Интеллектуальный пул и повторное использование TLS-соединений с точными паттернами поведения браузера.
Базовые библиотеки управляют каждым аспектом TLS-поведения браузера:
use rust_tlsx::{TlsClient, BrowserProfile};
fn main() -> anyhow::Result<()> {
let client = TlsClient::new(BrowserProfile::Chrome109);
let response = client.get("https://httpbin.org/get")?;
println!("Status: {}", response.status);
println!("Body: {}", response.body);
Ok(())
}
use rust_tlsx::{TlsClient, BrowserProfile};
fn main() -> anyhow::Result<()> {
let client = TlsClient::new(BrowserProfile::Firefox120);
let response = client.get("https://tls.peet.ws/api/all")?;
println!("TLS Fingerprint Analysis:\n{}", response.body);
Ok(())
}
use rust_tlsx::{TlsClient, BrowserProfile};
fn main() -> anyhow::Result<()> {
let client = TlsClient::new(BrowserProfile::Chrome109)
.header("Authorization", "Bearer YOUR_TOKEN")
.header("Content-Type", "application/json");
let response = client.get("https://api.example.com/data")?;
match response.status {
200 => println!("Success: {}", response.body),
401 => eprintln!("Authentication failed"),
_ => eprintln!("Request failed with status {}: {}", response.status, response.body),
}
Ok(())
}
use rust_tlsx::{TlsClient, BrowserProfile};
fn main() -> anyhow::Result<()> {
// Create a client that appears as a real Firefox browser
let client = TlsClient::new(BrowserProfile::Firefox120)
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0")
.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
.header("Accept-Language", "en-US,en;q=0.5")
.header("Accept-Encoding", "gzip, deflate, br")
.header("DNT", "1") // Privacy-focused: Do Not Track
.timeout(30);
// Include session cookies for authenticated requests
let client = client.cookie("session_id", "your_session_token");
let response = client.get("https://example-site.com/data")?;
match response.status {
200 => println!("Data retrieved successfully with browser-like privacy"),
403 => println!("Authentication required - check session cookies"),
_ => println!("Response: {}", response.status),
}
Ok(())
}
use rust_tlsx::{TlsClient, BrowserProfile};
use std::collections::HashMap;
fn main() -> anyhow::Result<()> {
// Simulate a specific browser environment
let mut headers = HashMap::new();
headers.insert("User-Agent".to_string(),
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36".to_string());
headers.insert("Sec-Fetch-Site".to_string(), "same-origin".to_string());
headers.insert("Sec-Fetch-Mode".to_string(), "navigate".to_string());
headers.insert("Sec-Fetch-Dest".to_string(), "document".to_string());
let client = TlsClient::new(BrowserProfile::Chrome120)
.headers(headers)
.timeout(45);
// Make request that's indistinguishable from real browser
let response = client.get("https://api.example.com/sensitive-data")?;
println!("Retrieved data with perfect browser mimicry");
println!("Protocol used: {}", response.used_protocol);
Ok(())
}
RustTLSX обеспечивает превосходную производительность и конфиденциальность по сравнению со всеми стандартными Rust HTTP-клиентами:
Zero-Copy операции: Прямые FFI-вызовы оптимизированных C/Go библиотек устраняют ненужное копирование данных, от которого страдают чистые реализации на Rust.
Пул соединений: Интеллектуальное повторное использование TLS-соединений с точным поведением keep-alive, как в браузере, снижающее накладные расходы на рукопожатие до 80%.
Эффективность памяти: Модель владения Rust в сочетании с оптимизированными нативными библиотеками обеспечивает на 40% меньшее использование памяти по сравнению с эквивалентными решениями на Python.
Параллельная производительность: Нативная async-поддержка с правильным мультиплексированием соединений масштабируется линейно с числом ядер CPU.
По сравнению с Python-привязками tls-client:
По сравнению с Go tls-client:
По сравнению с Node.js-решениями:
Загрузите подходящий бинарный файл из релизов tls-client:
tls-client-windows-64-1.3.3.dlltls-client-linux-ubuntu-amd64-1.3.3.sotls-client-darwin-amd64-1.3.3.dylibПоместите файл библиотеки в корень проекта, системную директорию библиотек или убедитесь, что он доступен через PATH.
[dependencies]
rust-tlsx = "0.1"
anyhow = "1.0"
use rust_tlsx::{TlsClient, BrowserProfile};
fn main() -> anyhow::Result<()> {
let client = TlsClient::new(BrowserProfile::Firefox120);
let response = client.get("https://example.com")?;
println!("Status: {}", response.status);
Ok(())
}
Основной интерфейс клиента для выполнения HTTP-запросов с TLS-отпечатками, как у браузера.
impl TlsClient {
pub fn new(profile: BrowserProfile) -> Self
pub fn header(self, key: &str, value: &str) -> Self
pub fn headers(self, headers: HashMap<String, String>) -> Self
pub fn cookie(self, name: &str, value: &str) -> Self
pub fn cookies(self, cookies: Vec<CookieInput>) -> Self
pub fn timeout(self, seconds: i32) -> Self
pub fn get(&self, url: &str) -> Result<Response>
pub fn post(&self, url: &str, body: Option<String>) -> Result<Response>
}
Перечисление доступных профилей отпечатков браузеров:
pub enum BrowserProfile {
// Chrome versions
Chrome103, Chrome104, Chrome105, Chrome106,
Chrome107, Chrome108, Chrome109, Chrome120,
// Firefox versions
Firefox102, Firefox104, Firefox105, Firefox106,
Firefox108, Firefox120,
// Safari versions
Safari15_6_1, Safari16_0,
SafariIpad15_6, SafariIos15_5, SafariIos15_6, SafariIos16_0,
// Opera versions
Opera89, Opera90, Opera91,
}
Структура HTTP-ответа, возвращаемая методами клиента:
pub struct Response {
pub status: i32, // HTTP status code
pub used_protocol: String, // Protocol used ("h2" or "http/1.1")
pub body: String, // Response body content
pub headers: HashMap<String, Vec<String>>, // Response headers
pub cookies: HashMap<String, String>, // Set-Cookie values
}
Ошибка: Failed to load library: cannot find tls-client-*.dll
Решения:
/usr/local/lib/ на Linux/macOS)Даже с аутентичными TLS-отпечатками могут потребоваться дополнительные факторы:
Необходимые компоненты:
Полный пример:
let client = TlsClient::new(BrowserProfile::Firefox120)
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0")
.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
.header("Accept-Language", "en-US,en;q=0.5")
.header("Accept-Encoding", "gzip, deflate, br")
.header("Connection", "keep-alive")
.header("Upgrade-Insecure-Requests", "1");
git clone https://github.com/yourusername/rust-tlsx
cd rust-tlsx
# Download required TLS library
wget https://github.com/bogdanfinn/tls-client/releases/download/v1.3.3/tls-client-windows-64-1.3.3.dll
# Build the project
cargo build --release
# Run tests
cargo test
cargo run --example simple_request
Вклад приветствуется! Пожалуйста, ознакомьтесь с CONTRIBUTING.md для получения рекомендаций.
Области для улучшения:
Лицензировано на условиях одного из:
Базовая библиотека TLS-клиента использует лицензию BSD-4-Clause.
| Библиотека | TLS-отпечаток | Производительность | Уровень конфиденциальности | Использование памяти |
|---|
reqwest + rustls | Обнаруживаемая сигнатура Rust | Базовый уровень | Низкий | Высокое |
reqwest + native-tls | Системный TLS (обнаруживаемый) | Базовый уровень | Низкий | Высокое |
hyper + hyper-tls | Обобщенный HTTP/2 | Быстрая | Низкий | Среднее |
ureq | Базовый TLS 1.2/1.3 | Медленная | Низкий | Низкое |
rust-tlsx | Идеальная имитация браузера | в 6 раз быстрее | Максимальный | Оптимизированное |