配置Nginx+Springboot+Qiniu+Https的一点心得

最近项目中的网站要设置https,虽然进入软件行业6年了,配置这个还是显得信心不足,还好网上有好多网友分享的文章可以从中学习,但是有优也有劣,凭我自己的一点经验从中甄选出好一点的文章跟大家分享一下。

1、什么是Https?

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司(Netscape)进行,并内置于其浏览器Netscape Navigator中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

2、如何在Nginx下设置网站的Https?

首先,你得先安装nginx,网上好多资料可以找到安装的方法,我们预设服务器环境是CentOS,安装方法请点击,这里就不敖述了。

安装好之后,我们需要数字证书,可以手动通过openssl生成,也可以购买,我这里讲解的是从阿里云服务器免费购买的证书,下面详细介绍下openssl。

2.1、openssl 简介
openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。
官网:https://www.openssl.org/source/

2.1.1、openssl 构成部分

密码算法库
密钥和证书封装管理功能
SSL通信API接口

2.1.2、openssl 用途

建立 RSA、DH、DSA key 参数
建立 X.509 证书、证书签名请求(CSR)和CRLs(证书回收列表)
计算消息摘要
使用各种 Cipher加密/解密
SSL/TLS 客户端以及服务器的测试
处理S/MIME 或者加密邮件

2.2、openssl生成自签名证书

生成 RSA 私钥和自签名证书

openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 365 -out cert.crt

req是证书请求的子命令,-newkey rsa:2048 -keyout private_key.pem 表示生成私钥(PKCS8格式),-nodes 表示私钥不加密,若不带参数将提示输入密码;
-x509表示输出证书,-days365 为有效期,此后根据提示输入证书拥有者信息;
若执行自动输入,可使用-subj选项:

openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 365 -out cert.crt -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/emailAddress=yy@vivo.com"

使用 已有RSA 私钥生成自签名证书

openssl req -new -x509 -days 365 -key rsa_private.key -out cert.crt

-new 指生成证书请求,加上-x509 表示直接输出证书,-key 指定私钥文件,其余选项与上述命令相同。

2.3、通过aliyun购买免费的证书

购买地址

clipboard.png

详细操作请点击免费申请阿里云 - 赛门企业级铁克 SSL 证书!

2.4、在Nginx上面配置Https

我们现在这里只讲解在阿里云下购买的证书进行配置,现在都有了证书,现在我们来配置https。我们假设你的证书是放在/usr/local/nginx/cert这个文件夹下,如下图所示就是我的证书文件,注意,我里面还嵌套了一层文件夹:qitenai.com,你们根据需要添加:

clipboard.png

然后我们进入文件夹:cd /usr/local/nginx/conf/下运行命令:

vim nginx.conf

查看server配置:

server {

        listen       80;
        server_name  qitenai.com;
        return       301 https://www.qitenai.com$request_uri;
        location / {
            root   /data/wwwroot/dist;//注意:这个项目我是基于vuejs的SPA项目
            #index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }
      }
      ...
      include /usr/local/nginx/conf/custom/*.conf;//注意这里
      

我们现在80端口配置没问题,现在运行命令:

cd /usr/local/nginx/conf/custom/
vim qitenai.conf

得到如下结果:

server {
    listen 443;
    server_name qitenai.com;
    ssl_certificate   /usr/local/nginx/cert/qitenai.com/214474132640003.pem;//证书位置
    ssl_certificate_key  /usr/local/nginx/cert/qitenai.com/myserver.key;//证书私钥位置
    location / {
        root   /data/wwwroot/dist;//注意:这个项目我是基于vuejs的SPA项目
        #index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
}

这样我们就配置好了nginx的https,我们浏览试试:

clipboard.png

3、如何结合Nginx配置Springboot的Https?

首先,我们在springboot下的application.properties文件里配置:

server.tomcat.remote_ip_header=x-forwarded-for
server.tomcat.protocol_header=x-forwarded-proto
server.tomcat.port-header=X-Forwarded-Port
server.use-forward-headers=true
#设置服务器端口
server.port=9090

然后,我们再来配置nginx,在配置nginx我想说的是我的springboot项目是通过nohup运行的,而且这里我写了一个自动化脚本启动springboot项目,如下 :

#!/bin/bash
port=9090
#根据端口号查询对应的pid
pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');

echo "pid=$pid"
#杀掉对应的进程,如果pid不存在,则不执行
if [  -n  "$pid"  ];  then
    echo "正在执行kill命令..."
    if kill  -9  $pid; then
       echo "正在执行nohup命令..."
       nohup java -jar good-learning-success.jar &
       echo "执行成功"
    fi
else
   echo "找不到pid,直接运行nohup命令"
   nohup java -jar good-learning-success.jar &
   echo "执行成功"
fi
#echo "查看端口执行情况:"
#netstat -auptl | grep 9090

再有一个,这个springboot项目我准备运行在api.qitenai.com这个二级域名下,所以我们必须要到域名服务器商处解析我们这个二级域名,具体实现网上也有好多文章,所以这里也不详细讲述,好了,我们来配置nginx吧,运行如下命令:

cd /usr/lcoal/nginx/conf/custom
vim api.qitenai.conf

如下所示 :

   server {
        listen       80;
        server_name  api.qitenai.com;
        return       301 https://api.qitenai.com$request_uri;
        location / {
                proxy_pass http://127.0.0.1:9090; #这里的端口记得改成项目对应的哦
                proxy_set_header Host $host;
                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;
                proxy_set_header X-Forwarded-Port $server_port;
        }
    }

   server {
        listen       443 ssl;
        server_name  api.qitenai.com;

        ssl_certificate      /usr/local/nginx/cert/api.qitenai.com/214474131840003.pem;//证书位置 
        ssl_certificate_key  /usr/local/nginx/cert/api.qitenai.com/214474131840003.key;//证书私钥公交车

        location / {
                proxy_pass http://127.0.0.1:9090; #这里的端口记得改成项目对应的哦
                proxy_set_header Host $host;
                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;
                proxy_set_header X-Forwarded-Port $server_port;
        }
    }

配置好了之后,我们重启一下nginx,其实就是停止所有80端口,443端口会随着80端口的停止而停止,运行如下命令:

netstat -auntpl | grep 80
[root@iZm5e8pmxwulw6lsbfzw55Z custom]# netstat -auptln | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      15479/nginx: master
tcp        0      0 0.0.0.0:8880            0.0.0.0:*               LISTEN      13947/java
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      13694/java
tcp        0      0 127.0.0.1:8006          0.0.0.0:*               LISTEN      13694/java
tcp        0      0 127.0.0.1:8007          0.0.0.0:*               LISTEN      13947/java
tcp        0      0 0.0.0.0:8010            0.0.0.0:*               LISTEN      13947/java
tcp      391      0 47.104.57.2:43874       106.11.68.13:80         CLOSE_WAIT  22944/AliYunDunUpda
tcp      391      0 47.104.57.2:51732       106.11.68.13:80         CLOSE_WAIT  22944/AliYunDunUpda
tcp        0      0 47.104.57.2:36142       106.11.68.13:80         ESTABLISHED 22995/AliYunDun
udp        0      0 10.80.186.137:123       0.0.0.0:*                           1165/ntpd
[root@iZm5e8pmxwulw6lsbfzw55Z custom]#kill -9 15479

再运行命令:kill -9 15479之后,再次运行命令:netstat -auptln | grep 80查看还有没有80端口有没有Kill掉,如果有继续kill,如果没有,我们就运行如下命令重启nginx:

cd /usr/local/nginx/sbin
./nginx

然后打开域名https://api.qitenai.com,查看是否成功:

clipboard.png

4、如何配置Qiniu的Https?

我们知道,注册了七牛服务后,会有个默认的域名给你访问资源文件,所以要配置https我们先换成我们的域名,这里我们设置域名为cdn.qitenai.com,之后,我们在七牛管理页面下进行配置,在配置之前我们先要上传证书,这里我们上传在阿里云里面购买的免费证书,注意:阿里云购买的证书是一个域名对应一个证书文件,所以像我这里要购买三次,这个一定要注意!!!

clipboard.png

上传之后,我们现在来配置域名:

clipboard.png

配置一下即可,记住,要选择我们刚刚上传的证书,最后就是配置cname了,进入你的域名服务器进入解析即可,详情请点击如何配置域名的 CNAME

这样就完成了七牛https的配置,查看效果如图:

clipboard.png

5、问题

5.1、如何让http跳转到https?如何让http://example.com跳转到https://www.example.com
解决方法:

server {

        listen       80;
        server_name  www.qitenai.com qitenai.com;
        return       301 https://www.qitenai.com$request_uri;
        location / {
            root   /data/wwwroot/dist;
            #index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }
}
server {
    listen 443 default_server ssl;
    server_name www.qitenai.com;
    ssl_certificate   /usr/local/nginx/cert/qitenai.com/214474132640003.pem;
    ssl_certificate_key  /usr/local/nginx/cert/qitenai.com/myserver.key;
    location / {
        root   /data/wwwroot/dist;
        #index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
}
server {
    listen 443;
    server_name qitenai.com;
    return       301 https://www.qitenai.com$request_uri;
    ssl_certificate   /usr/local/nginx/cert/qitenai.com/214474132640003.pem;
    ssl_certificate_key  /usr/local/nginx/cert/qitenai.com/myserver.key;
    location / {
        root   /data/wwwroot/dist;
        #index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
}

5.2、同一个域名不同的端口没有设置https如何访问?

没有办法因为你没有设置https,所以只能通过http访问,实际上这种情况还是很多的,比如有些项目使用的nginx,有些只使用tomcat,而tomcat项目是测试的,所以没有配置https很正常。

clipboard.png

如果你有问题可以加我的qq群向我提问:464696550
参考文章:
1、Spring Boot学习笔记-Nginx+Jar包部署项目
2、SpringBoot+Nginx+Https下redirect问题
3、Nginx + Tomcat + HTTPS 配置不需要在 Tomcat 上启用 SSL 支持
4、Nginx配置多个HTTPS域名的方法
5、使用 openssl 生成证书
6、阿里云ecs 服务器配置 nginx https
7、为nginx配置https并自签名证书
8、Nginx搭建HTTPS服务器--自签证书
9、Nginx+Https配置
10、主流数字证书都有哪些格式?
11、使用Spring Boot开发Web项目(二)之添加HTTPS支持
12、nginx https下不带www跳转www设置
13、Nginx 不带www的https域名 301跳转到带www的方法
14、Nginx服务器中HTTP 301跳转到带www的域名的方法
15、A redirect to a main site
16、Spring Boot中启动HTTPS
17、Nginx+Https配置

阅读 4.7k

推荐阅读
全栈工程师进阶
用户专栏

日常学习总结与分享,包括:前端、后台与运维,讲解的知识点包括:javascript、vuejs、reactjs、springb...

79 人关注
44 篇文章
专栏主页