ZBLOG

rust 实现 wss 服务

要实现一个使用 Rust 的 WSS(WebSocket Secure)服务,您可以使用 actix-webtokio-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
}

注意事项:

  1. SSL/TLS 证书:您需要提供有效的 SSL/TLS 证书和相应的私钥。可以通过 Let’s Encrypt 或自签名证书生成这些文件。确保将 cert.pemkey.pem 替换为您的实际文件路径。

  2. 依赖项:确保添加了正确版本的依赖项,以便项目能成功编译。

  3. 运行服务器:在终端中运行以下命令来启动服务器:

    cargo run
    
  4. WebSocket 客户端测试:可以使用浏览器或 Postman 等工具连接到 wss://localhost:3000/ws/ 来进行测试。如果是在浏览器中进行测试,请确保处理自签名证书的问题(可能需要在安全设置中允许)。

这样就完成了一个简单的 WSS 服务。如果有其他需求或问题,请告诉我!


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?