Nginx多域名多端口SSL转发及证书配置

1.申请证书

​ 证书的申请可在购买域名、服务器的服务商处申请免费证书,或者去阿里云和其他网站申请.我的服务器为百度智能云,能提 供三个免费证书的下载.每个域名包括二级域名都要单独申请一个证书,也可付费购买通用解析证书.申请成功后下载Nginx版的证书.

2.nginx配置文件的配置

以我的配置文件为例

基本实现原理是 所有域名正常解析到服务器的80端口,强制转发使用443端口走https协议,随后根据访问的域名转发到后台的应用端口;

如 start.gebilaoyu.club 解析到 xxx.xxx.xxx.xxx –>Nginx 80 –> 443 –>8080

这里我主要用到了三个域名

start.gebilaoyu.club 搭建好的SpringBoot安装服务 8080端口

blog.gebilaoyu.club hexo博客 4000端口

www.gebilaoyu.club 和 gebilaoyu.club 解析到博客 4000端口

#配置指定域名转至443端口
server {
        listen 80; # redirect to 443
        server_name blog.gebilaoyu.club ;
        rewrite ^(.*)$  https://$host$1 permanent; 
    }

server {
        listen 80; # redirect to 443
       server_name gebilaoyu.club www.gebilaoyu.club;
       rewrite ^(.*)$  https://$host$1 permanent;
   }
server {
        listen 80; # redirect to 443
       server_name start.gebilaoyu.club;
       rewrite ^(.*)$  https://$host$1 permanent;
   }

#配置指定域名相关的443端口ssl证书,并转发到项目端口
    server {
                listen 443 ssl;
                server_name blog.gebilaoyu.club;   
                ssl_certificate "/cert/blog.gebilaoyu.club.crt"; 
                ssl_certificate_key "/cert/blog.gebilaoyu.club.key";
                ssl_protocols TLSv1.1 TLSv1.2;
                ssl_prefer_server_ciphers on;
                ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
                add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
                location / {
                            proxy_pass http://127.0.0.1:4000;
                            proxy_set_header X-Real-IP $remote_addr;
                            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                            proxy_set_header Host $http_host;
                            proxy_set_header X-NginX-Proxy true;
                            proxy_redirect default;
        }
    }
    server {
                listen 443 ssl;
                server_name www.gebilaoyu.club gebilaoyu.club;   
                ssl_certificate "/cert/gebilaoyu.club.crt";   
                ssl_certificate_key "/cert/gebilaoyu.club.key";
                ssl_protocols TLSv1.1 TLSv1.2;
                ssl_prefer_server_ciphers on;
                ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
                add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
                location / {
                            proxy_pass http://127.0.0.1:4000;
                            proxy_set_header X-Real-IP $remote_addr;
                            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                            proxy_set_header Host $http_host;
                            proxy_set_header X-NginX-Proxy true;
                            proxy_redirect default;
        }
    } 
    server {
                listen 443 ssl;
                server_name start.gebilaoyu.club;   
                ssl_certificate "/cert/3520986_start.gebilaoyu.club.pem";   
                ssl_certificate_key "/cert/3520986_start.gebilaoyu.club.key";
                ssl_protocols TLSv1.1 TLSv1.2;
                ssl_prefer_server_ciphers on;
                ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
                add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
                location / {
                            proxy_pass http://127.0.0.1:8080;
                            proxy_set_header X-Real-IP $remote_addr;
                            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                            proxy_set_header Host $http_host;
                            proxy_set_header X-NginX-Proxy true;
                            proxy_redirect default;
        }
    } 
3.配置文件详解
server {
        listen 80; # redirect to 443
        server_name blog.gebilaoyu.club ;
        rewrite ^(.*)$  https://$host$1 permanent; 
    }

listen 80;表示要监听的端口为80

server_name 表示要监听的访问地址,对应的是要使用的域名或二级域名

rewrite ^(.*)$ https://$host$1 permanent; 转至443

这样配置的意思就是监听服务器的80端口,如果是使用blog.gebilaoyu.club访问服务器则转至433端口

随后配置对应此地址433端口的转发规则和证书信息,加解密方式等参数

    server {
                listen 443 ssl;
                server_name blog.gebilaoyu.club;    
                ssl_certificate "/cert/blog.gebilaoyu.club.crt"; 
                ssl_certificate_key "/cert/blog.gebilaoyu.club.key";
                ssl_protocols TLSv1.1 TLSv1.2;
                ssl_prefer_server_ciphers on;
                ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
                add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
                location / {
                            proxy_pass http://127.0.0.1:4000;
                            proxy_set_header X-Real-IP $remote_addr;
                            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                            proxy_set_header Host $http_host;
                            proxy_set_header X-NginX-Proxy true;
                            proxy_redirect default;
        }
    }

listen 443 ssl; 表示监听443端口并且是SSL

server_name: 要转发的访问的地址同上

ssl_certificate “/cert/blog.gebilaoyu.club.crt”; 证书文件地址
ssl_certificate_key “/cert/blog.gebilaoyu.club.key”; 证书文件地址

ssl_protocols TLSv1.1 TLSv1.2; TLS协议 开启此项可提高证书的安全等级

ssl_ciphers 加密方式 一些教程并没有让配置这些选项 但是实测开启这些选项可以将证书的安全登记提高至A+

add_header Strict-Transport-Security 强制游览器使用https

proxy_pass 要转发的最终项目地址端口

注意事项:

一定要正确选择与域名完全匹配的证书,不然没有效果

开启加密方式和TSL可以有效提高SSL安全等级

附上检测地址:https://myssl.com/ 可以检测配置完成后网址安全等级,我的三个网址配置完后都是A+.

配置完成后的最终效果:
检测结果:
mark
博客:
mark
SpringBoot安装服务:
mark

4.配置完SSL证书游览器依然提示不安全的解决办法

首先要确保整个网站内全部的链接(图片地址,文章地址,调用的API接口等)均为https://xxxxx.com的格式

游览器打开F12 查看Console控制台 和 NetWork 中是否有对应的报错信息,如果配置了add_header Strict-Transport-Security 打开页面后存在非https的请求会被游览器阻止,如果是谷歌游览器还可以在网址输入栏右侧看到一个红叉盾牌提示.
教程结束如有问题和建议可以留言我会一一回复.