最近项目中的网站要设置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购买免费的证书
详细操作请点击免费申请阿里云 - 赛门企业级铁克 SSL 证书!
2.4、在Nginx上面配置Https
我们现在这里只讲解在阿里云下购买的证书进行配置,现在都有了证书,现在我们来配置https。我们假设你的证书是放在/usr/local/nginx/cert这个文件夹下,如下图所示就是我的证书文件,注意,我里面还嵌套了一层文件夹:qitenai.com,你们根据需要添加:
然后我们进入文件夹: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,我们浏览试试:
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,查看是否成功:
4、如何配置Qiniu的Https?
我们知道,注册了七牛服务后,会有个默认的域名给你访问资源文件,所以要配置https我们先换成我们的域名,这里我们设置域名为cdn.qitenai.com,之后,我们在七牛管理页面下进行配置,在配置之前我们先要上传证书,这里我们上传在阿里云里面购买的免费证书,注意:阿里云购买的证书是一个域名对应一个证书文件,所以像我这里要购买三次,这个一定要注意!!!
上传之后,我们现在来配置域名:
配置一下即可,记住,要选择我们刚刚上传的证书,最后就是配置cname了,进入你的域名服务器进入解析即可,详情请点击如何配置域名的 CNAME
这样就完成了七牛https的配置,查看效果如图:
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很正常。
如果你有问题可以加我的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配置
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。