拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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 cert3.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:/cert3.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-age3600; 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 改造Nginxserver { 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-age3600; 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: true4.4 改造微服务配置微服务模块的bootstrap.yml,添加如下匹配值server: forward‑headers‑strategy: native # 接受gateway传过来的https,而不是http4.5 改造axiosaxios的url不能写死为http://aboluo.xyz:8080/aaa/xxx.do,应该修改为:在本地启动: http://localhost:8080/aaa/xxx.do在云服务器启动: /aaa/xxx.do4.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
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门