[※]记一次网站全站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梦里就给解决了呢!中间还发现一些小问题,就不记录了。

目录
相关文章
|
3月前
|
前端开发 JavaScript 安全
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第27天】本文介绍了HTTP/2和HTTPS在前端性能调优中的应用。通过多路复用、服务器推送和头部压缩等特性,HTTP/2显著提升了Web性能。同时,HTTPS确保了数据传输的安全性。文章提供了示例代码,展示了如何使用Node.js创建一个HTTP/2服务器。
97 3
|
4天前
|
缓存 安全 网络安全
代理协议解析:如何根据需求选择HTTP、HTTPS或SOCKS5?
本文详细介绍了HTTP、HTTPS和SOCKS5三种代理协议的特点、优缺点以及适用场景。通过对比和分析,可以根据具体需求选择最合适的代理协议。希望本文能帮助您更好地理解和应用代理协议,提高网络应用的安全性和性能。
31 17
|
14天前
|
网络协议 安全 网络安全
Introduction to the HTTP and HTTPS Protocol
HTTP protocol is the foundation of the Internet, and HTTPS is the secure version of HTTP. HTTP is an application layer protocol based on TCP/IP protocol. It does not involve packet (packet) transmission, mainly specifying the communication format between the client and the server, and the default po
62 25
|
1月前
|
安全 搜索推荐 网络安全
HTTPS与HTTP:区别及安全性对比
HTTP和HTTPS是现代网络通信中的两种重要协议。HTTP为明文传输,简单但不安全;HTTPS基于HTTP并通过SSL/TLS加密,确保数据安全性和完整性,防止劫持和篡改。HTTPS还提供身份验证,保护用户隐私并防止中间人攻击。尽管HTTPS有额外的性能开销和配置成本,但在涉及敏感信息的场景中,如在线支付和用户登录,其安全性优势至关重要。搜索引擎也更青睐HTTPS网站,有助于提升SEO排名。综上,HTTPS已成为大多数网站的必然选择,以保障用户数据安全和合规性。
62 1
|
2月前
|
应用服务中间件 Linux 网络安全
nginx安装部署ssl证书,同时支持http与https方式访问
为了使HTTP服务支持HTTPS访问,需生成并安装SSL证书,并确保Nginx支持SSL模块。首先,在`/usr/local/nginx`目录下生成RSA密钥、证书申请文件及自签名证书。接着,确认Nginx已安装SSL模块,若未安装则重新编译Nginx加入该模块。最后,编辑`nginx.conf`配置文件,启用并配置HTTPS服务器部分,指定证书路径和监听端口(如20000),保存后重启Nginx完成部署。
683 7
|
2月前
|
安全 算法 网络安全
HTTP和HTTPS的区别
本文介绍HTTP与HTTPS的区别、HTTPS链接建立过程及常见加密算法。HTTP为明文传输,易被窃听;HTTPS通过SSL/TLS协议加密,确保数据安全。HTTPS使用端口443,提供认证机制。文中还详细讲解了对称加密(如AES、DES)和非对称加密(如RSA、ECC)算法的特点及应用场景。
|
3月前
|
缓存 安全 网络安全
HTTP/2与HTTPS在Web加速中的应用
HTTP/2与HTTPS在Web加速中的应用
116 11
|
3月前
|
前端开发 JavaScript 数据库
https页面加载http资源的解决方法
https页面加载http资源的解决方法
93 5
|
2月前
|
安全 网络安全 数据安全/隐私保护
第六问:http和https区别与联系
HTTP 和 HTTPS 是现代网络通信中的两种重要协议。HTTP 是明文传输协议,无加密功能;HTTPS 在 HTTP 基础上加入 SSL/TLS 加密层,提供数据加密、身份验证和数据完整性保障。HTTP 适用于非敏感信息传输,如新闻网站;HTTPS 适用于在线支付、账户登录等需要保护用户数据的场景。
67 0
|
3月前
|
前端开发 安全 应用服务中间件
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第26天】随着互联网的快速发展,前端性能调优成为开发者的重要任务。本文探讨了HTTP/2与HTTPS在前端性能优化中的应用,介绍了二进制分帧、多路复用和服务器推送等特性,并通过Nginx配置示例展示了如何启用HTTP/2和HTTPS,以提升Web应用的性能和安全性。
59 3

热门文章

最新文章