Websocket实现wss协议连接支持语音聊天功能

2023-10-29

部署单页应用 SPA 时,我们通常使用 Nginx 做中间层进行转发代理。为了保护 Web 安全,要求我们使用 HTTPS(HTTP + SSL) 以及 WSS(Websocket + SSL) 进行通信。HTTPS 及 WSS 协议旨在保护用户数据在网络上不被窃听(机密性) 和不被篡改(完整性)。

HTTP 与 HTTPS 区别

  • HTTPS 协议需要到 CA 申请证书,一般免费证书较少,因而需要一定费用;
  • HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输
  • HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者默认是80,后者默认是443;
  • HTTP 的连接很简单,是无状态的;HTTPS 协议是由 SSL + HTTP 协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

第一步、Nginx 配置https及wss

SSL证书

进入腾讯云服务器 - 搜索SSL证书 - 证书管理- 申请免费的SSL证书

审核通过将证书下载到本地解压,解压结果获得5个文件,如下图:

通过Nginx配置证书,我们只需Nginx文件下的证书文件和私钥文件传到服务器, 并放到Nginx的配置文件路径

  • 1_www.sitven.cn_bundle.crt  证书文件
  • 2_www.sitven.cn.key  私钥文件(注意:如果在申请或者购买ssl证书设置了秘钥,则该文件不存在,配置使用之前设置的密码即可)

配置文件路径:/usr/local/nginx/conf (此处为默认安装目录,请根据实际情况操作)

配置NGINX

编辑 Nginx 根目录下的配置文件nginx.conf 文件。修改内容如下:

注:此操作可通过执行 vim /usr/local/nginx/conf/nginx.conf 命令行编辑该文件。由于版本问题,配置文件可能存在不同的写法

       例如:Nginx 版本为 nginx/1.15.0 以上请使用 listen 443 ssl 代替 listen 443ssl on

server {
     #SSL 访问端口号为 443
     listen 443 ssl; 
     #填写绑定证书的域名
     server_name www.sitven.cn; 
     #证书文件名称
     ssl_certificate 1_www.sitven.cn_bundle.crt; 
     #私钥文件名称
     ssl_certificate_key 2_www.sitven.cn.key; 
     ssl_session_timeout 5m;
     #请按照以下协议配置
     ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
     #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
     ssl_prefer_server_ciphers on;
     location / {
        # 网站主页路径, 此为我博客项目。此路径仅供参考,具体按照实际需求操作
        uwsgi_pass 127.0.0.1:8001;
        include /etc/nginx/uwsgi_params;
     }
 }

 配置完成,可通过执行以下命令验证配置文件问题

sudo nginx -t

若存在问题,请您重新配置或者根据提示修改存在问题

比如证书和私钥文件没放到正确的路径, Nginx就会提示没有这样的文件,如下图:

我们根据错误提示将证书与私钥放到正确的路径后重新进行验证

若配置不存在问题,如下图:

我们重启 Nginx,即可使用 李文君的个人博客进行访问

HTTP重定向HTTPS

http协议通过80端口通讯的而https协议通过443端口通讯, 所以我们需要做一个重定向, 把80端口的请求重定向到443端口,我们在Nginx配置文件的上一个代码块基础上增加一个server节点提供重定向服务

1. server {
2.     listen 80;
3.     server_name www.你的域名.cn;
4.     rewrite ^(.*)$ https://${server_name}$1 permanent;
5. }
如此,我们通过http协议访问网站时会自动重定向到https

第一次接触wss本以为只要在nginx里面做配置即可,但是我们想想nginx只帮我们做一个代理转发的功能,实际上要想websocket支持wss协议,我们就必须让我们的web服务支持https协议,所以继续在我们的后端服务器做配置

第二步:Springboot内置tomcat配置ssl

接下来就要使用tomcat文件下的jks文件了

将证书复制到项目中并进行配置

打开我们的项目目录,在src->main->resources中,把我们刚刚的证书文件放进去

打开application配置文件,添加如下代码

其中key-store: 填写你的pfx证书文件,比如key-store: classpath:1234567_baidu.cn.pfx

key-store-password: 填写pfx-password.txt文件中的密码

(注意!!!每个属性的分号后面必须加个空格,比如port: 443,而不是port:443)

server:
  port: 443
  ssl:
    key-store: classpath:15XXXXXXXXXX.cn.pfx
    key-store-type: PKCS12
    key-store-password: 这里填pfx-password.txt的文件内容(如果没有则填证书申请时的秘钥)

 

或者使用application.properties添加的内容如下(与上二选一即可):

我们启动试试:发现启动协议为https即配置成功

到这里我们就可以测试一波了,当然我相信你启动的时候会有各种环境依赖问题 哈哈哈哈哈~~~~

websocket在线测试工具: Websocket在线测试-Websocket接口测试-Websocket模拟请求工具

成功截图:

当然有朋友就会问了,这样我们该模块下的其它接口就只能通过https来访问了,其实我们还可通过后端配置让其也支持http请求,当然可根据业务需求还确认。

如果也要使用HTTP,可以加入以下代码,将HTTP重定向到HTTPS(如果业务不需要可不需要以下步骤了)

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
/**
 * http重定向到https
 * @return
 */
@Configuration
public class SecurityConfig
{
    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(httpConnector());
        return tomcat;
    }
 
    @Bean
    public Connector httpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        //Connector监听的http的端口号
        connector.setPort(8080);
        connector.setSecure(false);
        //监听到http的端口号后转向到的https的端口号
        connector.setRedirectPort(443);
        return connector;
    }
 
}

附上我遇到的一个依赖问题,无法加载jks文件,修改pom文件新增插件配置

     

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springblade</groupId>
        <artifactId>blade-service</artifactId>
        <version>2.8.0.RELEASE</version>
    </parent>

    <properties>
        <maven.test.skip>true</maven.test.skip>
    </properties>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>blade-websocket</artifactId>
    <name>${project.artifactId}</name>
    <version>${bladex.project.version}</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springblade</groupId>
            <artifactId>blade-core-boot</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springblade</groupId>
            <artifactId>blade-starter-swagger</artifactId>
        </dependency>

        <!--hutool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.5.4</version>
        </dependency>

        <!--pagehelper分页插件-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.5</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <!--websocket-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-websocket</artifactId>
            <version>5.0.8.RELEASE</version>
            <scope>compile</scope>
        </dependency>


        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <version>1.1</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>

    <build>
        <finalName>chat</finalName>

        <!--依赖-->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <excludes>
                    <exclude>*.keystore</exclude>
                    <exclude>*.jks</exclude>
                    <exclude>*.*.jks</exclude>
                    <exclude>*.p12</exclude>
                </excludes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
                <includes>
                    <include>*.keystore</include>
                    <include>*.*.jks</include>
                    <include>*.jks</include>
                    <include>*.p12</include>
                </includes>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.1.0</version>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <!-- 间接依赖也拷贝 -->
                            <excludeTransitive>false</excludeTransitive>
                            <!-- 带上版本号 -->
                            <stripVersion>false</stripVersion>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteIfNewer>true</overWriteIfNewer>
                            <includeScope>runtime</includeScope>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
    </build>
</project>

其实你会发现配置不难,是各种环境报错而走的很多弯路,本文分享希望可以帮助到您,点赞哦!

完整配置参考:

server {
    listen       1888;
    server_name pingan.net  www.pingan.net;  # 填写自己的域名
		rewrite ^(.*) https://www.$server_name$1:1888 permanent; # 地址重写http----https
}

server {
    listen   443 ssl; #https监听端口
    server_name  www.pingan.net;
    charset utf-8;
#    ssl on;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_certificate /etc/nginx/1_pingan.net_bundle.crt;  
    ssl_certificate_key /etc/nginx/2_pingan.net.key;


     location / {

 	  		 root   /data/app/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

     location /api/ {
       proxy_pass	http://localhost/;
    }

  # 本地服务websokcet通讯接口
	location /websocket/ {   
	proxy_pass http://www.pingan.net:9001;   # 填写自己的域名 代理到http        
	proxy_http_version 1.1;    
     proxy_set_header Upgrade $http_upgrade;    
     proxy_set_header Connection "Upgrade";    
     # 默认60s断开连接
     proxy_read_timeout 60s;
     
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Websocket实现wss协议连接支持语音聊天功能 的相关文章

  • 流星图像、CSS、“普通”Web 服务

    我经常看到这个问题出现 如何在我的 Meteor 网站上放置图像 如何使用 Meteor 托管 标准 网页内容 我尝试添加一个 img src img myimage png 标签但没有图像显示 如何在 Meteor 站点上托管一些文件 将
  • 这个重写规则是什么意思?

    我正在安装 phpancake 有一个像这样的文件夹 application install library public sql schema install html install php 这条规则意味着什么 RewriteEngin
  • C# HTTP 请求解析器[重复]

    这个问题在这里已经有答案了 可能的重复 将原始 HTTP 请求转换为 HTTPWebRequest 对象 https stackoverflow com questions 318506 converting raw http reques
  • http和https在编程中有什么区别[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我只知道 s 代表 安全 用户永远不
  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • 以 REST 方式更新整个资源集合

    我有一个资源列表的 REST URI 例如 http foo com group users 这些用户中的每一个都有一个序列号 我想公开一种方法来为集合中的所有用户重新编号这些值 并使访问该列表的每个人都可以使用此更改 由于这是对整个集合的
  • 使用.pem文件在java中发送https请求

    我有包含证书 私钥和信任链的 pem 文件 以及我使用它生成的 p12 文件openssl pkcs12 导出 openssl pkcs12 export out file p12 in file pem inkey file pem pa
  • 无效数据的 REST 响应代码

    如果出现以下情况 应将什么响应代码传递给客户端 用户注册时传递了无效数据 例如电子邮件格式错误 用户名 电子邮件已存在 我选择了403 我还发现了以下我觉得可以用的 维基百科 412 前提条件失败 服务器不满足请求者要求的先决条件之一 提出
  • Apache HttpClient TCP Keep-Alive(套接字保持活动)

    我的 http 请求需要太多时间才能被服务器处理 大约 5 分钟 由于连接闲置 5 分钟 代理服务器将关闭连接 我正在尝试在 Apache DefaultHttpClient 中使用 TCP Keep Alive 来使连接长时间处于活动状态
  • 防止表单重新提交

    第一页包含一个 HTML 表单 第二页 处理提交的数据的代码 第一页中的表格已提交 浏览器被重定向到第二页 第二页处理提交的数据 此时 如果刷新第二页 则会弹出 确认表单重新提交 警报 这可以预防吗 人们过去常采取两种方法 方法一 使用 A
  • 什么是 boost::asio::ssl::context::load_verify_file 以及如何使用它?

    有一个谨慎的小量 boost asio ssl http en wikipedia org wiki Transport Layer Security小型 C 在线教育代码库 甚至更少boost asio ssl context load
  • Rest 和 Http 中“无状态”的含义

    当我阅读有关 REST 是什么的文档时 他们总是说 REST api 应该是无状态的 在这里 我感觉有点尴尬 因为普通的 HTTP 也是无状态的 既然REST可以说是一种使用HTTP协议的特殊架构 那么说REST应该是无状态的似乎是多余的
  • Nitrous.IO 上的 HTTPS (TLS/SSL) 服务器

    请问如何在 Nitrous IO Boxes 上创建 TLS 服务器 我认为我至少必须获得 cert pem 和 key pem 或类似的东西 根据您所在的区域 您可以自动获得 SSL 身份验证 这样就够了吗 http help nitro
  • 如何防止 Firefox 缓存

    我尝试了很多可能的解决方案 但无法解决问题 这些不起作用 有人可以帮忙吗 我正在使用jsp servlet application 是websphere Portal 6 1 的一个portlet 切勿
  • 有没有适用于 IE 的 websocket 插件?

    有没有适用于 IE 的插件 我可以在 IE 7 8 9 中使用 Websockets 我还没找到 socket io 使用的后备方案之一是 flash gimite web socket js https github com gimite
  • 如何使用 php 通过 https 下载文件

    我需要使用 PHP 下载 xml 文件 我可以在对文件进行curl 调用时通过设置以下选项来读取文件的内容 curl setopt http CURLOPT SSL VERIFYPEER false curl setopt http CUR
  • 如何在 G-WAN 中添加 HTTP/2

    我想知道是否可以通过使用解决方案 nghttp2 https nghttp2 org https nghttp2 org 很抱歉这么晚才回答 出于某种原因 Stackoverflow 没有通知我们这个问题 我之所以找到它只是因为收到了更新的
  • Response.Redirect 并不总是重定向

    我们在一个工作不一致的页面上有一个简单的 Response Redirect IIS 6 0 大多数情况下 它会正确重定向 但我们收到一些用户抱怨 他们没有重定向 而是看到 302 对象移至此处 页面 该页面显示标题信息以及正确的位置 如果
  • 如何解决 302 重定向上的 POST 更改为 GET 的问题?

    我网站的某些部分只能通过 HTTPS 访问 不是整个网站 安全与性能妥协 并且如果通过纯 HTTP 发送请求 则 HTTPS 是通过对安全部分的请求进行 302 重定向来强制执行的 问题是对于所有主流浏览器来说 如果您在 POST 上执行
  • Java Junit 测试 HTTP POST 请求

    我需要测试以下方法而不改变方法本身 该方法向服务器发出 POST 方法 但我需要制作一个独立于服务器的测试用例 在将其重定向到本地文件之前 我测试了类似的方法 但为此我将协议指定为文件 主机名指定为 localhost 端口指定为 1 我的

随机推荐

  • QT环境变量配置

    QT官网地址 https my qt io 一 windows系统 1 1 QT下载安装 1 2 进入Qt安装目录 1 3 拷贝gcc所在的路径 不同安装目录有所差异 C Qt Qt5 5 0 Tools mingw492 32 bin 1
  • 数学建模常用Matlab/Lingo/c代码总结系列——旅行商TSP问题

    Lingo代码 MODEL SETS CITY 1 6 U U I sequence no of city LINK CITY CITY DIST The distance matrix X X I J 1 if we use link I
  • vuex中拿不到state中值的问题(state是undefined)

    首先下载vuex然后看一下项目中main文件内有没有引入store文件并且挂载 import Vue from vue import App from App vue import Element from element ui impor
  • IDEA 打包MapReduce程序到集群运行的两种方式以及XShell和Xftp过期的解决

    参考博客 MapReduce打包成jar上传到集群运行 http t csdn cn 2gK1d Xshell7 Xftp7 解决强制更新问题 http t csdn cn rxiBG IDEA打包MapReduce程序 方式一 轻量级打包
  • forkJoin, zip, combineLatest区别

    前言 forkJoin zip combineLatest是rxjs中的合并操作符 用于对多个流进行合并 很多人第一次接触rxjs时往往分不清它们之间的区别 其实这很正常 因为当你准备用来合并的流是那种只会发射一次数据就关闭的流时 比如ht
  • [小技巧] git diff 里显示日文

    先在命令行执行下面的命令 export LANG ja JP UTF 8 然后执行 git diff
  • TensorRT对face_boxes的加速

    TensorRT对face boxes进行加速 难点 priorbox layer和mobileNet SSD中的priorbox layer实现不太一样了 所以要对这层自己进行实现 当前遇到的报错 问题1 nvinfer1 DimsCHW
  • mac word无法显示仿宋字体解决方案

    仿宋是论文写作重要的字体 今天发现好多朋友的macOS系统里的word显示不了仿宋 或者显示不了一些字体 而我的电脑则是时而显示正常 时而显示异常 于是搜了一些解决方案并且自己实测了一下 在应用程序中找到word 右键显示包内容 在Reso
  • CentOS上PHP源码安装和配置

    CentOS上PHP源码安装和配置 此文是在CentOS 7上已经部署了Nginx的基础上进行的 关于CentOS7上安装Nginx 可参考我之前的文章 CentOS上Nginx安装记录 我们现在在这个基础上安装PHP 7 PHP里面概念挺
  • Flink从入门到放弃(十二)-企业实战之事件循环驱动型场景(二)

    上文Flink从入门到放弃 十二 企业实战之事件驱动型场景踩坑 一 为大家介绍了Flink基于事件驱动场景下的渠道流量分析实时需求以及遇到的坑 本文继续讲解基于事件驱动场景来讲解下关于响应时效 服务质量类的需求方案设计以及遇到的坑 关于Fl
  • 为什么有初始化和未初始化段

    初始化段 data 增加elf文件大小 未初始化段 bss 不增加elf文件大小 转载于 https www cnblogs com ShannonSN p 7866481 html
  • ssti模板注入jinja2 之[CSCCTF 2019 Qual]FlaskLight

    知识点 输入 7 7 或者a comment b判断模板类型 返回7777777是一般是jinja2 关于jinja2 的payload 命令执行 for c in class base subclasses if c name catch
  • 20-10-032-安装-KyLin-2.6.1-单机版安装(MAC官网下载)

    文章目录 1 视界 1 官网 2 安装要求 2 1 软件要求 2 2 硬件要求 2 3 Hadoop 环境 3 本次环境 4 HBASE 1 2 0安装 5 kylin 安装 6 检查zk jar 7 启动Hbase 8 添加依赖 9 添加
  • 应届毕业生北京租房经验

    写在前面 个人情况 本人是2021届毕业生 现在在北京西二旗附近打工 一名准打工人 适用范围 如下经验是个人在找房过程中的一些经验供大家参考 找房渠道 优缺点 1 自如 优点 目标用户就是年轻化的一代人 装修风格好 家具什么的也比较美观 该
  • UNI如何使用 plus

    在uni项目钟 使用h5 的puls 可以直接使用uni的 条件编译 就可以直接使用了 ifdef APP PLUS plus nativeUI toast str endif ifndef APP PLUS uni showToast t
  • python numpy 生成矩阵_详解:python numpy矩阵的创建与数据类型!(含实例方法)

    前言 今天为大家带来的内容是 详解 python numpy矩阵的创建与数据类型 含案例方法 本文里面的案例和代码具有不错的参考意义 希望能够在此对各位有所帮助 喜欢的话不忘关注点赞加转发不迷路哦 一 构造矩阵 矩阵的构造可以有多种方法 1
  • QT设置按钮的折叠和展开"

    首先在Qt Creator中拖进一个按钮 将该按钮设置为 显示 按钮 再将其他按钮放置在一个GroupBox中 并将GroupBox中的最后一个按钮设置为 隐藏 按钮 当点击 显示 按钮时 GroupBox显示出来 且 显示按钮被隐藏起来
  • 解决R语言的错误不存在叫‘dplyr’这个名字的程辑包

    运行一个R代码报以上错误 解决方法 在代码最前面加上安装 dplyr 的语句就可以了 install packages dplyr
  • 玩转ChatGPT:AskYourPDF插件尝鲜

    一 写在前面 首先 吐槽一下 感觉被CloseAI耍了 上周发文说这一周对PLUS开放联网和插件功能 搞得网络一片狂欢 但是今天通过身边统计学发现 开通了PLUS后 拥有联网和插件功能的只是少数 而且还是二选一 不少人是没有的 我自己也只有
  • Websocket实现wss协议连接支持语音聊天功能

    部署单页应用 SPA 时 我们通常使用 Nginx 做中间层进行转发代理 为了保护 Web 安全 要求我们使用 HTTPS HTTP SSL 以及 WSS Websocket SSL 进行通信 HTTPS 及 WSS 协议旨在保护用户数据在