如何连接到通过 Rust 托管的 Web 套接字服务器?

How to connect to a Web Socket Server hosted via Rust?

我有一个使用 native_tls 用 Rust 编写的 Web Socket 服务器,因为我需要最终让它能够远程接收连接

use {
    native_tls::{Error as TlsError, HandshakeError, Identity, TlsAcceptor},
    std::{
        fs::File,
        io::{Error as IoError, Read},
        net::{TcpListener, TcpStream},
        sync::Arc,
        thread::spawn,
    },
};

#[derive(Debug)]
enum Error {
    IoError(IoError),
    TlsError(TlsError),
    HandshakeError(HandshakeError<TcpStream>),
}
impl From<IoError> for Error {
    fn from(error: IoError) -> Self {
        Self::IoError(error)
    }
}
impl From<TlsError> for Error {
    fn from(error: TlsError) -> Self {
        Self::TlsError(error)
    }
}
impl From<HandshakeError<TcpStream>> for Error {
    fn from(error: HandshakeError<TcpStream>) -> Self {
        Self::HandshakeError(error)
    }
}

fn main() -> Result<(), Error> {
    let identity = Identity::from_pkcs12(
        &{
            let mut identity = vec![];
            File::open("cert.p12")?.read_to_end(&mut identity)?;
            identity
        },
        "asdf",
    )?;

    let acceptor = Arc::new(TlsAcceptor::new(identity)?);

    for stream in TcpListener::bind("127.0.0.1:80")?.incoming() {
        let acceptor = acceptor.clone();

        spawn(move || -> Result<(), Error> {
            let client = acceptor.accept(stream?)?;
            println!("{:?}", client);
            Ok(())
        });
    }
    Ok(())
}

我在尝试连接时使用的javascript:

let socket = new WebSocket(`wss://127.0.0.1:80`);

一切正常,但当我通过 Javascript 连接到它时,主机接收并接受连接,但它立即断开:

Firefox can’t establish a connection to the server at wss://127.0.0.1:80/.

我仍然不熟悉 Javascript 和 cert.p12 文件的证书处理。为了获取此文件,我遵循了 here 中的基本教程,但我不确定这样做是否正确。

我遇到的问题是 native_tls 本身无法作为 websocket 工作。它需要一些其他的 websocket 实现才能使用,例如 tungstenite。当使用 tungstenite 时,为了让 native_tls 和它自己一起工作,我会托管一个普通的 Tcp 服务器,而不是通过 tungstenite 接受它,我会用来自 native_tls 然后通过 tungstenite 接受连接,这将允许 tls 连接访问 tungstenite 的框架。