要实现一个使用 Rust 的 WSS(WebSocket Secure)服务,您可以使用 actix-web
和 tokio-tls
库。以下是一个完整的示例代码,其中包含加载 SSL 证书和私钥,并设置 WebSocket 服务。
Cargo.toml
首先,确保您的 Cargo.toml
文件包含必要的依赖项:
[package]
name = "wss_server"
version = "0.1.0"
edition = "2021"
[dependencies]
actix-web = "4.0" # Web 框架
actix-rt = "2.5" # Actix 运行时
rustls = "0.20" # TLS 实现
tokio = { version = "1", features = ["full"] } # 异步 I/O
futures-util = "0.3" # Future utilities
env_logger = "0.10" # 日志库
main.rs
然后,在 src/main.rs
中实现 WSS 服务:
use actix_web::{web, App, HttpServer};
use actix_ws::{ws, Message};
use rustls::{Certificate, PrivateKey, ServerConfig};
use std::fs::File;
use std::io::{BufReader, Result};
use tokio_tungstenite::tungstenite::protocol::Message as WsMessage;
async fn ws_handler(req: HttpRequest, stream: web::Payload) -> Result<HttpResponse> {
// Upgrade the request to a WebSocket connection
let resp = ws::start(MyWebSocket {}, &req, stream)?;
Ok(resp)
}
struct MyWebSocket;
impl ws::StreamHandler<Result<WsMessage>> for MyWebSocket {
fn on_message(&mut self, msg: WsMessage) {
// Echo the received message back to the client
println!("Received: {:?}", msg);
self.send(msg).unwrap(); // Sending message back to client; handle errors properly in production code.
}
}
fn load_certificates(cert_path: &str, key_path: &str) -> Result<ServerConfig> {
let cert_file = File::open(cert_path)?;
let mut buf_reader_cert = BufReader::new(cert_file);
let certs: Vec<Certificate> =
rustls_pemfile::certs(&mut buf_reader_cert)?
.into_iter()
.map(Certificate)
.collect();
let key_file = File::open(key_path)?;
let mut buf_reader_key = BufReader::new(key_file);
let keys: Vec<PrivateKey> =
rustls_pemfile::rsa_private_keys(&mut buf_reader_key)?
.into_iter()
.map(PrivateKey)
.collect();
let mut server_config = ServerConfig::new(rustls::NoClientAuth); // 无需客户端身份验证
server_config.set_single_cert(certs, keys.into_iter().next().unwrap())?;
Ok(server_config)
}
#[tokio::main]
async fn main() -> std::io::Result<()> {
env_logger::init();
// 加载 SSL 证书和私钥
let cert_path = "cert.pem"; // 修改为你的证书路径
let key_path = "key.pem"; // 修改为你的私钥路径
// 加载证书与私钥配置
let tls_config = load_certificates(cert_path, key_path)?;
HttpServer::new(move || {
App::new()
.route("/ws/", web::get().to(ws_handler))
})
.bind_rustls("127.0.0.1:3000", tls_config)? // 使用 HTTPS
.run()
.await
}
注意事项:
SSL/TLS 证书:您需要提供有效的 SSL/TLS 证书和相应的私钥。可以通过 Let’s Encrypt 或自签名证书生成这些文件。确保将
cert.pem
和key.pem
替换为您的实际文件路径。依赖项:确保添加了正确版本的依赖项,以便项目能成功编译。
运行服务器:在终端中运行以下命令来启动服务器:
cargo run
WebSocket 客户端测试:可以使用浏览器或 Postman 等工具连接到
wss://localhost:3000/ws/
来进行测试。如果是在浏览器中进行测试,请确保处理自签名证书的问题(可能需要在安全设置中允许)。
这样就完成了一个简单的 WSS 服务。如果有其他需求或问题,请告诉我!
内容由零声教学AI助手提供,问题来源于学员提问