gpt4 book ai didi

使用 Tungstenite : SSL alert number 42 实现 SSL

转载 作者:行者123 更新时间:2023-12-03 11:47:22 30 4
gpt4 key购买 nike

我用 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com