ZBLOG

#[actix_web::main] async fn main() -> std::io::Result { env_logger::init(); // We will reuse the same worker manager across all connections, this is more than enough for // this use case let worker_manager = Data::new(WorkerMa...

要将您提供的 Actix Web 服务器代码更改为使用 WSS(WebSocket Secure),您需要进行以下步骤:

  1. 引入 Rustls 作为 TLS 库:确保在 Cargo.toml 文件中添加了相关依赖项,包括 actix-web, actix-rt, 和 rustls

  2. 创建和配置 TLS 证书:您需要 SSL/TLS 证书和私钥文件,这些可以是自签名证书或者从可信的证书颁发机构获取的证书。

  3. 将 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 初始化逻辑 
}

注意事项

  1. TLS/SSL 证书路径:在调用 load_certificates 时,请确保提供正确的路径到您的 .pem 格式的证书和私钥文件。您可以使用 OpenSSL 或其他工具生成这些文件。

  2. 端口与地址:在调用 .bind_rustls() 时,您仍然可以使用任何可用端口,默认情况下 443 是用于 HTTPS 的常见选择,但这里我们保持使用端口 3000

  3. 调试与测试:建议在本地开发时使用自签名证书,并在生产环境中换用受信任的 CA 签发的证书。对于自签名证书,浏览器可能会显示安全警告,但这不会影响功能。

通过这些修改后,您的 WebSocket 服务将能够支持加密连接。如果有其他问题或需要更多帮助,请告诉我!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21025

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?