要将您提供的 Actix Web 服务器代码更改为使用 WSS(WebSocket Secure),您需要进行以下步骤:
引入 Rustls 作为 TLS 库:确保在
Cargo.toml
文件中添加了相关依赖项,包括actix-web
,actix-rt
, 和rustls
。创建和配置 TLS 证书:您需要 SSL/TLS 证书和私钥文件,这些可以是自签名证书或者从可信的证书颁发机构获取的证书。
将 HttpServer 更改为绑定到 Rustls 上,并将 TLS 配置传递给服务器。
以下是更新后的示例代码,将您的 HTTP 服务器转换为 WSS 服务器:
示例代码
use actix_web::{web, App, HttpRequest, HttpResponse, HttpServer};
use actix_web::middleware::Logger;
use rustls::{Certificate, PrivateKey, ServerConfig};
use std::fs::File;
use std::io::{BufReader, Result};
use tokio_tungstenite::tungstenite::protocol::Message as WsMessage;
use actix_web_actors::ws;
#[actix_web::main]
async fn main() -> std::io::Result<()> {
env_logger::init();
// WorkerManager 和 RoomsRegistry 的初始化代码
let worker_manager = Data::new(WorkerManager::new());
let rooms_registry = Data::new(RoomsRegistry::default());
// 加载证书和密钥
let tls_config = load_certificates("cert.pem", "key.pem")?;
// 启动 HTTPS(WSS)服务器
HttpServer::new(move || {
App::new()
.app_data(worker_manager.clone())
.app_data(rooms_registry.clone())
.route("/ws", web::get().to(ws_index))
.wrap(Logger::default()) // 添加日志中间件
})
.bind_rustls("127.0.0.1:3000", tls_config)? // 使用 bind_rustls 方法绑定
.run()
.await
}
// 加载证书和密钥的函数
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();
// 创建 ServerConfig 并返回
let server_config = ServerConfig::builder()
.with_safe_defaults()
.with_no_client_auth()
.with_single_cert(certs.clone(), keys.into_iter().next().unwrap())?;
Ok(server_config)
}
async fn ws_index(req: HttpRequest) -> Result<HttpResponse> {
// WebSocket 初始化逻辑
}
注意事项
TLS/SSL 证书路径:在调用
load_certificates
时,请确保提供正确的路径到您的.pem
格式的证书和私钥文件。您可以使用 OpenSSL 或其他工具生成这些文件。端口与地址:在调用
.bind_rustls()
时,您仍然可以使用任何可用端口,默认情况下443
是用于 HTTPS 的常见选择,但这里我们保持使用端口3000
。调试与测试:建议在本地开发时使用自签名证书,并在生产环境中换用受信任的 CA 签发的证书。对于自签名证书,浏览器可能会显示安全警告,但这不会影响功能。
通过这些修改后,您的 WebSocket 服务将能够支持加密连接。如果有其他问题或需要更多帮助,请告诉我!
内容由零声教学AI助手提供,问题来源于学员提问