ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

http升级为https

http升级为https

http升级为https是在服务器端(不是在域名端),但要求被升级的域名已经被解析到此服务器

HTTP 升级为 HTTPS 的原理 : 在 HTTP 下面加了一层 SSL/TLS 加密层,把明文传输变成密文传输

1 申请并下载SSL证书(百度云服务器)

登录百度智能云控制台>> 搜索"SSL证书" >> 普通SSL证书

点击购买证书 >> 选择"域名型DV+单域名版+TrustAsia(免费)" >> 3个月(测试版) >> 购买

点击"证书申请" >> 填写需要升级的域名 >> 获得域名验证的TXT解析记录

● 主机记录(如 _dnsauth 或 _acme-challenge)

● 记录类型: TXT

● 记录值: 一串随机字符

域名验证: 登录域名DNS服务商(阿里云/腾讯云等) >> 找到该域名的DNS解析设置>> 添加对应的TXT解析记录

域名解析:将域名通过DNS解析指向服务器IP,一个域名可以同时解析到多个服务器IP(轮询,权重...)

ICP备案:域名第一次接入某厂商的云服务器需要做ICP备案,如果换了另一厂商的云服务器只需要做接入备案,一个厂商只需要做一次备案,以后再在此厂商买的云服务器(厂商相同,服务器公网IP不同)无需再做ICP备案或接入备案,只需要把域名解析改一下即可

复杂组合:域名是在阿里云买的,但是域名的DNS解析交给了腾讯云,服务器是百度云的,此时TXT解析记录就应该填写在腾讯云(而不是阿里云),(一般等10分钟生效)然后在百度云查看SSL证书是否申请成功

SSL证书申请成功后,在云服务器所在厂商(比如百度云)点击下载SSL证书(Nginx选PEM_Nginx),会得到一个压缩包:

包含了各种服务器软件(比如Nginx,Apache,Tomcat等)对应的证书(比如xxx.key和xxx_ca.crt)

包含了各种服务器软件上安装SSL证书的安装指南

2 放行云服务器安全组与防火墙

在安全组中放行443接口

3 上传证书并配置 Web 服务器(比如Nginx)

3.1 Nginx安装目录新建cert目录

如果是在docker中安装的Nginx,通过以下命令进入

docker exec -it nginx容器名 bash

创建cert目录

mkdir cert

3.2 将本地文件上传到cert目录

将本地文件上传到云服务器比较简单,一般shell工具自带此功能

如果要将本地文件上传到云服务器的docker容器中,可以先将本地文件上传到云服务器,在通过以下命令将云服务器的文件拷贝(见docker这篇文章)到docker容器中

docker cp /root/docker_nginx/cert/aboluo.xyz_ca.crt nginx_container_80:/cert docker cp /root/docker_nginx/cert/aboluo.xyz.key nginx_container_80:/cert

3.3 修改nginx.conf文件

docker容器中的目录/etc/nginx/nginx.conf,此时查看文件可能如下

并没有server{......},但最后一行已经说明了nginx.conf文件引入了/etc/nginx/conf.d目录下的所有以.conf结尾的文件,那我们继续去对应目录找,发现conf.d目录下只有一个default.conf文件,打开它

果然出现了server{......},继续改造default.conf文件:

server { listen 443 ssl http2; # 监听 443 端口并开启 SSL(推荐写法,替代ssl on),http2是http的升级 listen [::]:443 ssl http2; # 加上 IPv6 支持 (可选但推荐),http2是http的升级 server_name aboluo.xyz www.aboluo.xyz; # --- 证书路径必须是容器内的绝对路径 --- ssl_certificate /cert/aboluo.xyz_ca.crt; # 对应图中的 domain.crt ssl_certificate_key /cert/aboluo.xyz.key; # 对应图中的 domain.key # --- 安全设置 (图中示例比较旧,建议升级) --- ssl_protocols TLSv1.2 TLSv1.3; # 禁用旧的 TLSv1.1 ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # --- 安全响应头 --- # 开启 HSTS,强制 HTTPS 一年(max-age单位"秒"),包含子域名 # 在max-age时间内,浏览器会强制记住“这个域名只能用 HTTPS,如果SSL过期访问http就会被拒绝,所以这个时间不要设置的过长 add_header Strict-Transport-Security "max-age=3600; includeSubDomains" always; # --- 站点配置 --- root /usr/share/nginx/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } } # 专门处理 80 端口,强制跳转到 443(即http -> https) server { listen 80; server_name aboluo.xyz www.aboluo.xyz; return 301 https://$host$request_uri; }

但是进入nginx容器后,可以查看(cat命令)文件,但不能修改(vim命令)文件,所以可以使用docker cp命令将容器里面的default.conf拷贝到宿主机(拷贝成功后将容器里的default.conf删除掉),再从宿主机下载到本地,在本地修改好后上传到宿主机,再用docker cp命令将修改好的default.conf拷贝到nginx容器

或者直接在本地创建default.conf,然后相同的操作.......

3.4 重启nginx

重启nginx后,访问nginx里面的网址,如果网页时https开头的,表示升级HTTP 升级为 HTTPS成功

4 微服务接口支持https

完成对Nginx容器的改造后,访问Nginx容器中的网页确实是以https开头了,但网页访问微服务提供的接口依然是http,并且这种"网页https,但接口http"会被浏览器报错,因此需要对微服务接口做改造

4.1 改造原理

请求接口通过Nginx容器间接去请求微服务接口(或Gateway接口),而不是直接请求微服务接口(或Gateway接口),即:网页 >> Nginx >> Gateway >> 微服务.do接口,这样有个好处,就是网页和接口都走Nginx,SSL证书只需要在Nginx里面维护1份即可

4.2 改造Nginx

server { listen 443 ssl http2; # 监听 443 端口并开启 SSL(推荐写法,替代ssl on),http2是http的升级 listen [::]:443 ssl http2; # 加上 IPv6 支持 (可选但推荐),http2是http的升级 server_name aboluo.xyz www.aboluo.xyz; # --- 证书路径必须是容器内的绝对路径 --- ssl_certificate /cert/aboluo.xyz_ca.crt; # 对应图中的 domain.crt ssl_certificate_key /cert/aboluo.xyz.key; # 对应图中的 domain.key # --- 安全设置 (图中示例比较旧,建议升级) --- ssl_protocols TLSv1.2 TLSv1.3; # 禁用旧的 TLSv1.1 ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # --- 安全响应头 --- # 开启 HSTS,强制 HTTPS 一年(max-age单位"秒"),包含子域名 # 在max-age时间内,浏览器会强制记住“这个域名只能用 HTTPS,如果SSL过期访问http就会被拒绝,所以这个时间不要设置的过长 add_header Strict-Transport-Security "max-age=3600; includeSubDomains" always; #静态资源优先匹配,正则location优先级高于location / location ~* \.(html|js|css|png|jpg|jpeg)$ { root /usr/share/nginx/html; } #专门处理访问根目录,读取本地index.html location = / { root /usr/share/nginx/html; index index.html index.htm; } # 所有接口转发到gateway容器:8080 location / { proxy_pass http://gateway_container_8080:8080; # gateway_container_8080为docker容器名 #proxy_pass http://123.123.123.123:8080; # Nginx和Gateway不在同一个云服务器 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 告诉网关,原始客户端请求协议是https proxy_set_header X-Forwarded-Proto $scheme; } } # 专门处理 80 端口,强制跳转到 443(即http -> https) server { listen 80; server_name aboluo.xyz www.aboluo.xyz; return 301 https://$host$request_uri; }

4.3 改造Gateway

配置gateway模块的bootstrap.yml,添加如下配置

spring: cloud: gateway: # 接受Nginx传过来的https,而不是http x-forwarded: enabled: true proto-enabled: true for-enabled: true host-enabled: true

4.4 改造微服务

配置微服务模块的bootstrap.yml,添加如下匹配值

server: forward‑headers‑strategy: native # 接受gateway传过来的https,而不是http

4.5 改造axios

axios的url不能写死为"http://aboluo.xyz:8080/aaa/xxx.do",应该修改为:

在本地启动: "http://localhost:8080/aaa/xxx.do"

在云服务器启动: "/aaa/xxx.do"

4.6 改造结果

改造好后,访问.do接口可以通过3种方式:

直接访问接口:http://aboluo.xyz:81/aaa/xxx.do

直接走Gateway:http://aboluo.xyz:8080/aaa/xxx.do

走Nginx,再间接走Gateway:https://aboluo.xyz/aaa/xxx.do

但是对于通过https访问网页的情况,浏览器不允许此网页"网页https,但接口http",因此只能"走Nginx,再间接走Gateway"

返回列表