使用 Tungstenite : SSL alert number 42 实现 SSL

标签 ssl websocket rust

我用 async_tungstenite 创建了一个工作的 WebSocket 服务器和 async_std .
我现在想使用 async_native_tls 添加 SSL .
如果我理解正确的话,这个 crates 提供了一个函数 accept这需要 TcpStream ,处理 TLS 握手并提供 TlsStream<TcpStream>它的行为应该像 TcpStream但在幕后处理加密和解密。
为了测试服务器,我创建了一个自签名证书。
基于此,以下是处理新 TCP 连接的代码的演变过程:

async fn accept_connection(stream: TcpStream, addr: SocketAddr) {
    //Websocket stream
    let accept_resut = async_tungstenite::accept_async(stream).await;

    if let Err(err) = accept_resut {
        println!(
            "Error while trying to accept websocket: {}",
            err.to_string()
        );
        panic!(err);
    }

    println!("New web socket: {}", addr);
}
async fn accept_connection(stream: TcpStream, addr: SocketAddr) {
    //Open tls certificate !should be done one time and not for each connection!
    let file = File::open("identity.pfx").await.unwrap();
    let acceptor_result = TlsAcceptor::new(file, "glacon").await;

    if let Err(err) = acceptor_result {
        println!("Error while opening certificate: {}", err.to_string());
        panic!(err);
    }

    let acceptor = acceptor_result.unwrap();

    //Get a stream where tls is handled
    let tls_stream_result = acceptor.accept(stream).await;

    if let Err(err) = tls_stream_result {
        println!("Error during tls handshake: {}", err.to_string());
        panic!(err);
    }

    let tls_stream = tls_stream_result.unwrap();

    //Websocket stream
    let accept_resut = async_tungstenite::accept_async(tls_stream).await;

    if let Err(err) = accept_resut {
        println!(
            "Error while trying to accept websocket: {}",
            err.to_string()
        );
        panic!(err);
    }

    println!("New web socket: {}", addr);
}
有了这个实现,我现在从网页调用
const sock = new WebSocket('wss://localhost:8020');
这会导致错误:
Error while trying to accept websocket: 
IO error: error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate:../ssl/record/rec_layer_s3.c:1543:SSL alert number 42
thread 'async-std/runtime' panicked at 'Box<Any>', src/main.rs:57:9
握手似乎是成功的,因为在 acceptor.accept 期间没有发生错误。 .该错误表明证书无效,因此这是我创建自签名证书的方式。
openssl 版本是 1.1.1f
# Create a key
openssl req -nodes -new -key server.key -out server.csr
# Create the self-signed certificate
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
# Convert the certificate to pfx format
openssl pkcs12 -export -out identity.pfx -inkey server.key -in server.crt 
我认为这个问题与浏览器的安全功能有关,因为“SSL 警报编号 42”似乎来自客户端。我试图在 Firefox 设置中禁用此选项

Query OCSP responder servers to confirm the current validity of certificates


我还尝试添加我的server.crt到证书管理器的当局。
这些都不起作用。

最佳答案

问题来自 Firefox 的安全功能。
Firefox 检测到证书未由授权机构签名并返回错误。
似乎将证书添加到已知机构不起作用。
为了避免这个问题,我找到了 this thread这表示应该为您的开发 Websocket 服务器的地址和端口添加异常。
转到设置 > 证书 > 查看证书 > 服务器 > 添加异常(exception)...
输入您的本地服务器(对我来说是 localhost:8020)。
添加异常(exception)。

关于使用 Tungstenite : SSL alert number 42 实现 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64990632/

相关文章:

rust - 基于特征标志有条件地推导

Apache、SSL 客户端证书、LDAP 授权

ssl - subjectAltName 未添加到 CSR 中

javascript - 在 socket.emit() 中传递参数的问题

ios - 我如何使用 websocket 将音频发送到 Microsoft Translator

rust - 为什么可以将带连字符的 crate 名称更改为带下划线的名称,在这种模棱两可的情况下命名规则是什么?

rust - 解析 40MB 文件明显比等效的 Pascal 代码慢

forms - 目录搜索 Magento - 不工作 https/ssl

windows-7 - Windows 7 - 未安装 IIS 时如何生成 CSR

java - 如何在我的 Java Web 应用程序中运行 websocket 客户端