rustls في Rust: دليل شامل مع أمثلة عملية
1. ما هي rustls ولماذا تحتاجها؟
rustls هي مكتبة حديثة وآمنة وعالية الأداء لبروتوكول TLS (طبقة أمان النقل) مكتوبة بلغة Rust. على عكس المكتبات الضخمة مثل OpenSSL أو native-tls، فإن rustls مكتوبة بالكامل بلغة Rust بدون ارتباطات بمكتبات C، مما يجعلها الخيار الأمثل للمشاريع التي تهم فيها سلامة الذاكرة، وغياب السلوك غير المحدد (undefined behavior)، وسهولة البناء.
لماذا تحتاج rustls؟ أولاً، تحل مشكلة "dependency hell": لن تحتاج إلى تثبيت OpenSSL على الخادم أو مواجهة مشاكل مع إصدارات libssl-dev. ثانياً، تستخدم rustls افتراضياً خوارزميات تشفير آمنة فقط (TLS 1.2 و 1.3، مع استبعاد التشفيرات القديمة). ثالثاً، تتكامل بشكل مثالي مع بيئة Rust من خلال async/await وأطر العمل مثل Tokio و async-std.
الاستخدامات الرئيسية: إنشاء خوادم وعملاء HTTPS، اتصالات WebSocket الآمنة، العمل مع gRPC، وأي حالة أخرى تتطلب تشفير حركة المرور عبر TCP. تُستخدم rustls بنشاط في مشاريع مثل curl و Firefox (عبر Neqo) والعديد من تطبيقات Rust الصناعية.
2. التثبيت
أضف rustls إلى مشروعك باستخدام مدير الحزم Cargo. للاستخدام الأساسي، يكفي تبعيتان:
# Cargo.toml
[dependencies]
rustls = "0.23" # المكتبة الأساسية
webpki-roots = "0.26" # الشهادات الجذرية الموثوقة (للعميل)
tokio = { version = "1", features = ["full"] } # للمثال غير المتزامن
tokio-rustls = "0.26" # غلاف غير متزامن لـ Tokio
إذا كنت تحتاج فقط إلى الوضع المتزامن (الحظر)، يمكنك الاستغناء عن tokio-rustls. للعمل مع الشهادات، قد تحتاج أيضاً إلى rcgen (لتوليد شهادات ذاتية التوقيع) و rustls-pemfile (لقراءة ملفات PEM).
# التثبيت عبر cargo add (إذا كنت تستخدم cargo-edit)
cargo add rustls webpki-roots tokio tokio-rustls
3. البداية السريعة — مثال عملي بسيط
لننشئ عميل HTTPS بسيط يقوم بتحميل صفحة من example.com. يوضح هذا المثال الإعداد الأساسي لـ rustls باستخدام الشهادات الجذرية للنظام.
// src/main.rs
use std::sync::Arc;
use tokio::net::TcpStream;
use tokio_rustls::TlsConnector;
use rustls::pki_types::ServerName;
use webpki_roots::TLS_SERVER_ROOTS;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. إنشاء إعدادات العميل مع الجذور الموثوقة
let config = rustls::ClientConfig::builder()
.with_root_certificates(TLS_SERVER_ROOTS.clone())
.with_no_client_auth();
// 2. إنشاء موصل TLS
let connector = TlsConnector::from(Arc::new(config));
// 3. إنشاء اتصال TCP
let stream = TcpStream::connect("example.com:443").await?;
// 4. تغليف الاتصال بـ TLS
let server_name = ServerName::try_from("example.com")?;
let mut tls_stream = connector.connect(server_name, stream).await?;
// 5. إرسال طلب HTTP
use tokio::io::AsyncWriteExt;
tls_stream.write_all(b"GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n").await?;
// 6. قراءة الرد
use tokio::io::AsyncReadExt;
let mut response = String::new();
tls_stream.read_to_string(&mut response).await?;
println!("رد الخادم:\n{}", response);
Ok(())
}
يقوم هذا الكود بإنشاء اتصال آمن مع example.com، وإرسال طلب HTTP، وعرض الرد. لاحظ أننا نستخدم webpki-roots للتحقق من شهادة الخادم — وهذا آمن ولا يتطلب تثبيت OpenSSL.
4. أهم الدوال/الكلاسات
4.1. rustls::ClientConfig::builder()
التوقيع: pu