部署单页应用 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 访问端口号为 443listen 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: 443ssl:key-store: classpath:15XXXXXXXXXX.cn.pfxkey-store-type: PKCS12key-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
{@Beanpublic ServletWebServerFactory servletContainer() {TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {@Overrideprotected 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;}@Beanpublic 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;}
}

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

  1. 详细nginx配置websocket的wss协议

    需求: 小程序连接websocket,必须使用wss协议 nginx配置websocket以及wss协议 其实wss协议就是使用了ssl协议的域名所自带的协议,所以wss协议需要域名来进行socket ...

  2. Java基于TCP(Socket)协议的网络语音聊天

    Java基于TCP协议的网络语音聊天 本聊天是基于tcp协议进行的,其本质为:本地录音->将录音通过网络编程转发给他人->他人进行录音的播放. 所需知识:多线程,基于tcp协议的网络编程 ...

  3. java实现仿微信app聊天功能_Android仿微信语音聊天功能

    本文实例讲述了Android仿微信语音聊天功能代码.分享给大家供大家参考.具体如下: 项目效果如下: 具体代码如下: AudioManager.java package com.xuliugen.we ...

  4. 淘宝上线语音聊天功能

    上面这个公号「涩郎」,是我的一个备用号,为了防止万一哪天大号失联,平时一周我也会发三篇左右的我的思考,读书笔记,认知感悟等文章,带领大家一起探索精神与财务自由之路. 大家好,我是校长. 昨天中午午休的 ...

  5. nginx实现对websocket加密协议wss协议的反向代理以及websocket整合springboot入门(踩坑)

    出发点 最近公司需要有一个推送前端消息的需求 首选websocket进行推送,也做过客服系统接触过,最近看了一点websocket的相关内容记录总结一下. 什么是websocket websocket ...

  6. android 原生分享界面_索尼PlayStation App获得语音聊天功能和新的UI界面

    索尼的PlayStation 5将于11月12日发布,而在此基础上,该公司已经在Android和iOS上对PlayStation App进行了相当大的更新. 该更新带来了新的,经过改进的用户界面(UI ...

  7. 安卓平台基于SIP协议实现注册,聊天功能

    ============问题描述============ 不涉及音频,视频发送,只要实现注册,和聊天功能就行, 网上下了sipdroid的源码,但是XML中配置的<uses-sdk androi ...

  8. UE5 Oculus Quest2 使用跨平台交互语音聊天Cross-Platform Voice Chat Pro制作语音聊天功能 2

    1.配置项目 ①打开Config/DefaultEngine.ini添加 [Voice] bEnabled=true [/Script/Engine.Player] ConfiguredInterne ...

  9. 宝塔中nginx配置websocket的wss协议

    配置ws也就是不安全的协议,比较简单,可以参考我之前的文章 在配置wss之前要准备好ssl证书, 配置证书也很简单,只要上传两个证书,就好了,我这里就不再赘述了,我这里证书已经配置好了,配置wss的代 ...

最新文章

  1. 字典怎么增加元素_python3基础之字典
  2. SlowHTTPTest 慢***测试
  3. ubuntu 杀死进程命令
  4. android 修改编译内核源码 对抗反调试
  5. 移动APP开发中8大安全问题
  6. java简述会话对象的生命周期_简述Java Web三大作用域对象
  7. 针对Algorand所使用的密码相关技术细节进行介绍
  8. 一名英格兰球迷眼里的本届英格兰队
  9. WPF(Windows Presentation Foundation)用户界面框架
  10. Access control allow origin 简单请求和复杂请求
  11. MySQL8数据恢复
  12. 网页中有大量图片加载很慢,用什么方法进行优化
  13. MySQL备份工具之xtrabackup
  14. js时间转换的一些方法,时间转换天数,获取商品活动时间
  15. 搜狗云输入法,比较cool的输入法
  16. HTML+CSS+JS—时尚服装购物商城(1页) 大学生服装购物商城网页作品 服装网页设计作业模板 学生网页制作源代码下载
  17. 国产FlexRay系列产品即将上市,值得期待!
  18. 「生产技改工程」智能变电站辅助监控系统
  19. c++程序从1加到10(详细讲解版)
  20. 获取了职业资格证书二级/技师

热门文章

  1. Windows版本纵横谈—— MSDN版、OEM版、RTM版有什么不同?
  2. 用wingrub从硬盘安装linux
  3. UE4 高频 Fatal Error: exiting due to D3D device being lost解决方法:
  4. Ueditor 百度编辑器 自定义工具栏与功能(ueditor+layui+ci)
  5. 优质且免费的10个在线图片设计网站!
  6. 一些非主流搜索引擎的优化
  7. 13.56MHz线圈天线设计
  8. byte转word类型。
  9. android 卷轴动画,原来这种画卷展开的效果这么简单!三步即可做出来!太惊艳了...
  10. newifi3 web认证_newifi新路由3设置教程