项目中采用 wss 来建立的前后端连接, 但是并没有用到认证的证书, 所以自己用 openssl 生成了私钥, 自签名证书来使用:

这里就不再赘述 Wss 连接过程, 直接上手操作:

1. 生成私钥, 证书:

请查看合集 "开发工具" => 使用 openssl 生成证书

(如果不会安装请查看合集 "开发工具" => OpenSSl 安装)

2. rust 服务端:

将生成的 server.crt 和 server.key 放到  d:\\User\\Desktop\\wss\\openssl 目录下

依赖:

[dependencies]
rustls = "0.19.0"
tokio-rustls = "0.22.0"
tokio = { version = "1", features = ["full"] }
tokio-tungstenite = "0.20"
futures-util = "0.3"

RUST 代码:

use futures_util::sink::SinkExt;
use futures_util::stream::{Stream, StreamExt};
use rustls::ServerConfig;
use std::fs::File;
use std::io::BufReader;
use std::sync::Arc;
use tokio::net::{TcpListener, TcpStream};
use tokio_rustls::TlsAcceptor;
use tokio_tungstenite::accept_async;
use tokio_tungstenite::tungstenite::protocol::Message;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 加载SSL keys
    let certs = rustls::internal::pemfile::certs(&mut BufReader::new(File::open(
        "d:\\User\\Desktop\\wss\\openssl\\server.crt",
    )?))
    .unwrap();
    let key = rustls::internal::pemfile::pkcs8_private_keys(&mut BufReader::new(File::open(
        "d:\\User\\Desktop\\wss\\openssl\\server.key",
    )?))
    .unwrap()[0]
        .clone();
    let tls_cfg = {
        let mut cfg = ServerConfig::new(rustls::NoClientAuth::new());
        cfg.set_single_cert(certs, key).expect("error setting cert");
        Arc::new(cfg)
    };
    let tls_acceptor = TlsAcceptor::from(tls_cfg);
    // 设置TCP监听器
    let addr = "127.0.0.1:10096";
    let listener = TcpListener::bind(&addr).await?;
    println!("Listening on: {}", addr);
    while let Ok((stream, _)) = listener.accept().await {
        let acceptor = tls_acceptor.clone();
        tokio::spawn(async move {
            if let Ok(tls_stream) = acceptor.accept(stream).await {
                let websocket_result = accept_async(tls_stream).await;
                match websocket_result {
                    Ok(mut ws_stream) => {
                        println!("WebSocket connection established");
                        while let Some(message_result) = ws_stream.next().await {
                            match message_result {
                                Ok(message) => {
                                    if message.is_text() || message.is_binary() {
                                        // 对接收到的消息进行处理
                                        println!("接收到消息: {}", message);
                                        // 回传消息
                                        println!("回传消息: {}", message);
                                        if let Err(_) = ws_stream.send(message).await {
                                            // 处理错误
                                            break;
                                        }
                                    }
                                }
                                Err(e) => {
                                    // 处理错误
                                    println!("Error: {}", e);
                                    break;
                                }
                            }
                        }
                    }
                    Err(e) => {
                        println!("Error during the websocket handshake occurred: {}", e);
                    }
                }
            }
        });
    }
    Ok(())
}

3. Angular 客户端:

Angular 配置:

将生成的

client.crt 和 client.key 放到和 package.json 同级文件夹下.

package.json

"scripts": {
"start": "ng serve --host 0.0.0.0 --port 443 --ssl true --ssl-cert ./client.crt --ssl-key ./client.key",
}

// 补充

./client.crt 和 ./client.key 是相对路径,表示这些证书文件位于当前工作目录。当前工作目录指的是你在运行 ng serve 命令时所在的目录,也就是命令行提示符下的目录。如果你在项目的根目录下运行这个命令(通常是包含 package.json 文件的目录),./ 就表示这个项目的根目录

angular 代码:

import {webSocket} from "rxjs/webSocket";

ngOnInit() {
this.websocketTest();
} websocketTest() {
const url: string = 'wss://127.0.0.1:10096';
const myWebSocket = webSocket({
url: url,
openObserver: {
next: () => {
console.info('WebSocket 连接已建立: ' + url);
},
error: (err) => {
console.error('WebSocket 连接出错: ' + url);
console.error(err);
},
},
});
const data = JSON.stringify({name: '张三', age: 18, sex: '男'});
myWebSocket.next(data); console.log('客户端发送请求: ', data);
myWebSocket.subscribe(
next => {
console.log('客户端收到响应: ', next);
},
error => {
console.error('WebSocket 出错: ' + url);
console.error(error);
}
);
}

4. 谷歌浏览器设置

谷歌浏览器图标右击 属性 -> 快捷方式 -> 目标(修改其中字符串, )

  原来类似 "C:\Program Files\Google\Chrome\Application\chrome.exe"

  修改为 "C:\Program Files\Google\Chrome\Application\chrome.exe" --ignore-certificate-errors

这个命令会忽略证书错误。正常情况下,当你访问一个使用自签名或无效证书的网站时,Chrome 会显示一个警告页面,指示你有潜在的安全风险。然而,使用 --ignore-certificate-errors 参数可以忽略这些证书错误,并允许你继续访问网站,而不会受到浏览器的证书警告页面的干扰。

5. 结果展示:

前端项目使用 npm start 启动:

前端控制台:

后端控制台:

版权声明:本文为博客园博主「书源」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:rust angular 自签名证书 wss - 书源 - 博客园 (cnblogs.com)

rust angular 自签名证书 wss的更多相关文章

  1. https本地自签名证书添加到信任证书访问

    1.背景 本文适用于基于https(http+ssl)的网站通信.本地调试等,上线是请寻找免费 ssl证书申请. 本地调试过程中,一些特殊的场景需要我使用http+ssl通信,比如在Chrome中使用 ...

  2. Windows Server 2008 R2 下配置TLS1.2,添加自签名证书

    前言 2017年1月1日起App Store上的所有App应用将强制开启ATS功能. 苹果的ATS(App Transport Security)对服务器硬性3点要求: ① ATS要求TLS1.2或者 ...

  3. 修改Android签名证书keystore的密码、别名alias以及别名密码

    Eclipse ADT的Custom debug keystore自定义调试证书的时候,Android应用开发接入各种SDK时会发现,有很多SDK是需要靠package name和keystore的指 ...

  4. cmd命令生成android签名证书

    cmd命令生成android签名证书,有空在写一篇eclipse导出带签名的apk,这里面包括生成新的签名.现在还是讲讲在cmd怎么操作生成签名证书. 1.dos下进入JDK的bin目录 运行如下命令 ...

  5. windows下使用makecert命令生成自签名证书

    1.makecert命令路径 C:\Program Files (x86)\Windows Kits\8.1\bin\x64 2.生成一个自签名证书 makecert -r -pe -n " ...

  6. 使用openssl创建自签名证书及部署到IIS教程

    概要 本文讲解三个部分:1. 创建自签名证书2. 创建自己的证书颁发机构3. 以及如何配置IIS 创建自签名证书 首先,创建一个私钥文件: openssl genrsa -out myselfsign ...

  7. iOS开发HTTPS实现之信任SSL证书和自签名证书

    iOS开发HTTPS实现之信任SSL证书和自签名证书 转自:http://www.jianshu.com/p/6b9c8bd5005a/comments/5539345 (收录一下供自己学习用的) 字 ...

  8. AFNetWorking3.0使用 自签名证书的https请求

    前几日,项目组出于安全角度的考虑,要求项目中的请求使用https请求,因为是企业内部使用的app,因此使用了自签名的证书,而自签名的证书是不受信任的,所以我们就需要自己来做证书的验证,包括服务器验证客 ...

  9. openssl生成自签名证书

    1.生成x509格式的CA自签名证书 openssl req -new -x509 -keyout ca.key -out ca.crt 2.生成服务端的私钥(key文件)及申请证书文件csr文件 o ...

  10. 用OpenSSL生成自签名证书在IIS上搭建Https站点(用于iOS的https访问)

    前提: 先安装openssl,安装有两种方式,第一种直接下载安装包,装上就可运行:第二种可以自己下载源码,自己编译.这里推荐第一种. 安装包:http://slproweb.com/products/ ...

随机推荐

  1. TiDB的简单介绍以及进行资源限制的方式与方法

    TiDB的简单介绍以及进行资源限制的方式与方法 TiDB的简介 TiDB是一个分布式数据库, 简介为: TiDB 是一个开源的分布式关系型数据库,它兼具了分布式数据库的水平扩展性和传统关系型数据库的 ...

  2. 前端三件套系例之CSS——CSS是什么、CSS3语法、css代码书写位置(引入方式)、css选择器

    文章目录 1.CSS是什么 2.CSS3语法 2.1 CSS实例 2.2 CSS注释 3.css代码书写位置(引入方式) 3-1 行间式 3-2 内联式 3-3 外联式 总结 3 css选择器 1.基 ...

  3. 调节LED的亮度

    虽然Devices Plus已经介绍过Arduino的多种应用和作品示例,但是了解相关基础知识对于任何项目的构建仍然是非常重要的!这次,我们将为您介绍Arduino电子制作的基础知识.此次的分享嘉宾是 ...

  4. CF1746F Kazaee

    prologue 数组范围一定要看好了开,不然容易我一样,调试调了一页多. 还有就是不要傻乎乎地只跑一次和哈希,因为和哈希(从下面地佬的题解中才知道)它其实算作是一种 trick(类比SA(Stimu ...

  5. C#学习笔记--复杂数据类型、函数和结构体

    C#基础 复杂数据类型 特点:多个数据变量地一个集合体,可以自己命名 种类:枚举.数组和结构体 枚举:整型常量的集合 数组:任意变量类型的顺序存储的数据集合 结构体:任意变量类型的数据组合成的数据块 ...

  6. 2020/4/26 2-sat 学习笔记

    2-sat 吧.... 其实我jio得它一点都不难 嗯 2-sat是个啥东西呢?其实就是有很多人,他们每个人有两个要求,一个要求可以说是要求一个数为0或1而对于第i个数,我们可以选择为0或为1最终询问 ...

  7. log4j漏洞CVE-2021-44228复现-排雷篇

    一.环境搭建(用相同的环境才能保证一定成功) 下载vulhub,其他环境可能存在GET请求无效问题: git clone https://github.com/vulhub/vulhub.git 切换 ...

  8. SpringBoot自动配置原理解析

    1: 什么是SpringBoot自动配置 首先介绍一下什么是SpringBoot,SpringBoost是基于Spring框架开发出来的功能更强大的Java程序开发框架,其最主要的特点是:能使程序开发 ...

  9. 【matplotlib 实战】--雷达图

    雷达图(Radar Chart),也被称为蛛网图或星型图,是一种用于可视化多个变量之间关系的图表形式.雷达图是一种显示多变量数据的图形方法.通常从同一中心点开始等角度间隔地射出三个以上的轴,每个轴代表 ...

  10. C#.NET 国密SM4 CBC 对称加解密 与JAVA互通 ver:20231103

    C#.NET 国密SM4 CBC 对称加解密 与JAVA互通 ver:20231103 .NET 环境:.NET6 控制台程序(.net core). JAVA 环境:JAVA8,带maven 的JA ...