[※]记一次网站全站http升级为https的过程,websocket : ws升级为wss遇到的问题等

简介: [※]记一次网站全站http升级为https的过程,websocket : ws升级为wss遇到的问题等

前言

项目开发差不多之后,部署到线上。总是提示网站连接不上私密连接,如图所示:3128ad7b9383bb6845d50b2c4155b21.png这是有的浏览器对http协议的连接认为不安全的原因,https协议更加安全,我们项目上线后也应该部署为https协议。下面整理一下我这次升级过程中遇到的问题以及是如何解决的!

 HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

1、申请ssl证书

我的项目是Springboot单体项目,后台管理系统thymeleaf+layui实现的,前台vue。相当于是前台分离,后台管理是单体服务,

这次是Java项目,而且用了SpringBoot,他内部集成了tomcat,看了SpringBoot配置起来好像也不是很方便。

HTTPS需要SSL证书,SSL证书的申请可以在阿里云、腾讯云申请免费的证书。

不过免费的大多 都是一年的,我在这里推荐一个公共并且免费的ssl证书:Let’s Encrypt

也看过这样一篇文章:

http不安全?改成https试试

https://mp.weixin.qq.com/s/PesIzC-Y-7IZn20psBKO6Q

还有这个:

SpringBoot 改造成https访问

https://blog.csdn.net/kk_star/article/details/83273045

无一例外,这种jdk生成的证书是不安全 的,虽然实现了https访问,但是实验https访问就是为了更安全,证书都不安全我们还用他来干啥,忽悠人那

因此就折中选择了Nginx做服务器,转发到Java项目,经过以前的几个项目,对Nginx 的基本用法和配置还是了然于胸的。

服务器上我部署了

宝塔

https://www.bt.cn/

面板来可视化管理系统服务器,主要是方便,宝塔上创建站点可以申请免费的Let’s Encrypt ssl证书。

102a77d017ecc4e9c39f46e9096da1a.png

使用方式也很简单,选择域名,申请下来之后在“其他证书”页面点击保存就可以了,而且,到期还可以自动续期申请,多好!。

申请下来这个第一步算是完成了。

2、修改配置文件

用这种方式申请ssl之后,就会在站点的配置文件下自动配置上ssl的证书路径地址等。这里我也贴出来了,并且加上了一些注释,就算用其他证书手动配置也是一样的道理:

<span style="color:#000000"><span style="background-color:#fafafa"><code>  #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    # 证书文件地址
    ssl_certificate    /www/server/panel/vhost/cert/admin.xxx.com/fullchain.pem;
    ssl_certificate_key    /www/server/panel/vhost/cert/admin.xxx.com/privkey.pem;
    # 协议配置
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497  https://$host$request_uri;
    #SSL-END
</code></span></span>

3、配置端口转发

<span style="color:#000000"><span style="background-color:#fafafa"><code>  location / {
      # 配置代理转发主机名
       proxy_set_header Host $host;
       # 在服务器上获得用户的真实ip
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        # 配置转发的ip地址和端口号
        proxy_pass http://127.0.0.1:8082/;
        proxy_set_header X-Forwarded-Port $server_port;
     }
</code></span></span>

这是很重要的一步,这里不配置好前台就访问不到项目。到这里没有错误的话,重启一下Nginx 现在应该是可以进行访问了。

另外需要注意的是,部署了ssl之后,页面上的所有请求将会自动提升为https访问,所以前台项目vue中接口地址也要都改成https访问的,还有图片地址等等。

其中图片的话我这里用的是阿里云的OSS,OSS默认是支持https协议的,如果配置了自定义域名和cdn加速的话,需要对加速的域名也开启https协议访问,我这里的证书也是用宝塔的Let’s Encrypt申请的。

89f9c5d0d540a8e340b3d33110502bb.png

并且,前台页面中用到的oss的图片路径,也要全部更改为https的访问请求路径,要不然会报一大堆的警告:

Mixed Content: The page at ‘<URL>‘ was loaded over HTTPS, but requested an insecure frame ‘<URL>‘…

ddd7e92357af477d497477e94e43a53.png

4、Nginx 配置域名支持 WSS

由于我的项目中使用了websocket协议,后台使用https协议的话会使ws协议报错,
ad9416f5874592bbef13ed8495729a5.png

Websocket使用 ws 或 wss 的统一资源标志符,类似于 HTTP 或 HTTPS ,其中 wss 表示在 TLS 之上的 Websocket ,相当于 HTTPS 了。如:

ws://example.com/chat

wss://example.com/chat

默认情况下,Websocket 的 ws 协议使用 80 端口;运行在TLS之上时,wss 协议默认使用 443 端口。其实说白了,wss 就是 ws 基于 SSL 的安全传输,与 HTTPS 一样样的道理。

如果你的网站是 HTTPS 协议的,那你就不能使用 ws:// 了,浏览器会 block 掉连接。

所以这个时候,需要Nginx 配置域名支持 WSS,

不用废话,直接在配置 HTTPS 域名位置加入如下配置:

<span style="color:#000000"><span style="background-color:#fafafa"><code>location /websocket {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
</code></span></span>

这样就完成了,在 HTTPPS 下以域名方式连接 WebSocket ,可以开心的玩耍了。

稍微解释一下 Nginx 配置

Nginx 自从 1.3 版本就开始支持 WebSocket 了,并且可以为 WebSocket 应用程序做反向代理和负载均衡。

WebSocket 和 HTTP 协议不同,但是 WebSocket 中的握手和 HTTP 中的握手兼容,它使用 HTTP 中的 Upgrade 协议头将连接从 HTTP 升级到 WebSocket,当客户端发过来一个 Connection: Upgrade 请求头时,Nginx 是不知道的,所以,当 Nginx 代理服务器拦截到一个客户端发来的 Upgrade 请求时,需要显式来设置 Connection 、 Upgrade 头信息,并使用 101(交换协议)返回响应,在客户端和代理服务器、后端服务器之间建立隧道来支持 WebSocket。

当然,还需要注意一下,WebSockets 仍然受到 Nginx 缺省为60秒的 proxy_read_timeout 的影响。这意味着,如果你有一个程序使用了 WebSockets,但又可能超过60秒不发送任何数据的话,那你要么需要增加超时时间,要么实现一个 ping 的消息以保持联系。使用 ping 的解决方法有额外的好处,可以发现连接是否被意外关闭。

5、发现的问题

nginx反向代理部署springboot项目报404无法加载静态资源:

由于我的后台管理系统是springboot单体项目,上面有给前台提供的接口服务,这个时候接口可以访问了,但是我的后台管理缺打不开了!!!。报错情况如下图所示:

c48fda4ae81a5da6080e1828496ef8c.png

很明显是静态资源无法访问了,

这就奇了怪了,为这个问题可花费了我不少时间检查各种配置,

检查上面端口转发,域名配置,springboot静态资源加载问题等等,

依然是不能访问。

没办法,出去呼吸下新鲜空气,

再回来看配置就发现Nginx下面还有这样一段配置,

<span style="color:#000000"><span style="background-color:#fafafa"><code>    location ~ .*\.(js|css)?$
    {
         expires      12h;
         error_log /dev/null;
        access_log off; 
    }
</code></span></span>

然后再想想,这不是我项目里的静态资源没有被转发代理到我的项目端口下面么。于是:

改成如下配置,问题解决!

<span style="color:#000000"><span style="background-color:#fafafa"><code>    location ~ .*\.(js|css)?$
    {
        # expires      12h;
        # error_log /dev/null;
        # access_log off; 
           #解决反向代理无法访问js,css
            proxy_pass http://127.0.0.1:8082;
            proxy_set_header   Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            expires      12h; 
    }
</code></span></span>

有时候人那,不能一直坐在那,多出去走走,说不定第二天醒来昨天困扰一晚上的bug梦里就给解决了呢!中间还发现一些小问题,就不记录了。

相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
1月前
|
缓存 安全 网络协议
一起深入了解http和https的区别
HTTP适合于非敏感信息的传输,而HTTPS则是在要求安全性、隐私保护及信任机制的现代互联网环境中不可或缺的标准配置。随着网络安全意识的提高和技术的发展,越来越多的网站和服务都转向使用HTTPS,力求在提供便捷服务的同时保障用户数据的安全。HTTPS将成为未来的基本选择。
41 0
一起深入了解http和https的区别
|
1月前
|
安全 网络协议 算法
http和https的区别有哪些
http和https的区别有哪些
|
1月前
|
网络协议 Shell 网络安全
实验目的1.编译安装httpd2.优化路径3.并将鲜花网站上传到web服务器为网页目录4.在客户机访问网站http://www.bdqn.com
实验目的1.编译安装httpd2.优化路径3.并将鲜花网站上传到web服务器为网页目录4.在客户机访问网站http://www.bdqn.com
164 0
|
1天前
|
安全 Go
解决https页面加载http资源报错
请注意,混合内容可能导致安全性问题,因此在使用上述方法时要小心。最好的方式是尽量减少或完全消除混合内容,以确保页面的安全性。
5 0
|
6天前
|
网络协议 网络安全 数据安全/隐私保护
http和https的区别!
http和https的区别!
|
9天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
9 0
|
12天前
|
缓存 安全 网络协议
【面试必备】HTTP和HTTPS是什么?有什么差异?
HTTP(超文本传输协议)和HTTPS(超文本传输安全协议)是用于在互联网上传输数据的协议。它们都是应用层协议,建立在TCP/IP协议栈之上,用于客户端(如浏览器)和服务器之间的通信。
20 2
|
28天前
|
前端开发 应用服务中间件 网络安全
http转为https,ssl证书安装及nginx配置
http转为https,ssl证书安装及nginx配置
45 1
|
28天前
|
安全 数据安全/隐私保护
深入解析:HTTP和HTTPS的三次握手与四次挥手
在这些握手和挥手过程中,双方交换信息,协商参数,建立或关闭连接,以保证数据的可靠传输。HTTPS在此基础上加入了数字证书验证和加密通信,增加了安全性。这些步骤确保了HTTP和HTTPS协议的通信过程的稳定和安全。
115 0
|
1月前
|
数据采集 缓存 前端开发
http和https请求服务器的时候在请求头部分都带什么到服务器呢?
HTTP和HTTPS请求头基本结构相似,HTTPS多了一层SSL/TLS加密。常见请求头如Accept(指定内容类型)、Authorization(身份验证)、Cookie(会话跟踪)、User-Agent(标识用户代理)等。HTTPS特有的头包括Upgrade-Insecure-Requests(升级到HTTPS)、Strict-Transport-Security(强制使用HTTPS)、Sec-Fetch-*(安全策略)和X-Content-Type-Options、X-Frame-Options等(增强安全性)。实际应用中,请求头会根据需求和安全策略变化。
20 0