Tungstenite的SSL实现:SSL警报号42

Tungstenite的SSL实现:SSL警报号42,ssl,websocket,rust,Ssl,Websocket,Rust,我用和创建了一个工作的WebSocket服务器 现在我想使用添加SSL 如果我理解正确,这个板条箱提供了一个函数accept,它接受TcpStream,处理TLS握手,并提供TlsStream,其行为应该类似于TcpStream,但在幕后处理加密和解密 为了测试服务器,我创建了一个自签名证书 基于此,下面是处理新TCP连接的代码的演变过程: async fn accept\u连接(流:TcpStream,地址:SocketAddr){ //网梭流 让accept\u resut=async\u

我用和创建了一个工作的WebSocket服务器

现在我想使用添加SSL

如果我理解正确,这个板条箱提供了一个函数
accept
,它接受
TcpStream
,处理TLS握手,并提供
TlsStream
,其行为应该类似于
TcpStream
,但在幕后处理加密和解密

为了测试服务器,我创建了一个自签名证书

基于此,下面是处理新TCP连接的代码的演变过程:

async fn accept\u连接(流:TcpStream,地址:SocketAddr){
//网梭流
让accept\u resut=async\u tungstenite::accept\u async(流);
如果让错误(Err)=接受结果{
普林顿(
“尝试接受websocket时出错:{}”,
错误。到_字符串()
);
恐慌!(呃);
}
println!(“新web套接字:{}”,addr);
}
async fn accept\u连接(流:TcpStream,地址:SocketAddr){
//打开tls证书!应执行一次,而不是每次连接!
让file=file::open(“identity.pfx”).wait.unwrap();
让acceptor_result=TlsAcceptor::new(文件“glacon”)。等待;
如果let Err(Err)=接受方_结果{
println!(“打开证书时出错:{}”,err.to_string());
恐慌!(呃);
}
让acceptor=acceptor_result.unwrap();
//获取处理tls的流
让tls_stream_result=acceptor.accept(stream.wait);
如果let Err(Err)=tls\u流\u结果{
println!(“tls握手时出错:{}”,err.to_string());
恐慌!(呃);
}
让tls_stream=tls_stream_result.unwrap();
//网梭流
让accept\u resut=async\u tungstenite::accept\u async(tls\U流);
如果让错误(Err)=接受结果{
普林顿(
“尝试接受websocket时出错:{}”,
错误。到_字符串()
);
恐慌!(呃);
}
println!(“新web套接字:{}”,addr);
}
通过这个实现,我现在从一个网页调用

const sock=new WebSocket('wss://localhost:8020');
这将导致以下错误:

尝试接受websocket时出错: IO错误:错误:14094412:SSL例程:ssl3\u读取字节:sslv3警报错误证书:../SSL/record/rec\u layer\u s3.c:1543:SSL警报编号42 线程'async std/runtime'在'Box',src/main.rs:57:9处崩溃 似乎握手成功,因为在
acceptor.accept期间没有发生错误。错误表明该证书无效,因此以下是我创建自签名证书的方式。
openssl版本是1.1.1f

#创建密钥
openssl req-nodes-new-key server.key-out server.csr
#创建自签名证书
openssl x509-req-days 365-in server.csr-signkey server.key-out server.crt
#将证书转换为pfx格式
openssl pkcs12-export-out-identity.pfx-inkey-server.key-in-server.crt
我认为这个问题与浏览器的安全功能有关,因为“SSL警报号码42”似乎来自客户端。我尝试在Firefox设置中禁用此选项

查询OCSP响应程序服务器以确认证书的当前有效性

我还尝试将我的
server.crt
添加到证书管理器的权限中


这两个都不起作用。

问题来自Firefox的安全功能。
Firefox检测到证书未经授权机构签名,并发回一个错误。
将证书添加到已知权限似乎不起作用

为了避免这个问题,我发现这表明应该为开发Websocket服务器的地址和端口添加一个异常

转到设置>证书>查看证书>服务器>添加异常…
键入您的本地服务器(对于我来说,localhost:8020)。
添加异常