Nginx配置全站HTTPS
—— 以腾讯云CentOS7为例
本文章讲述了如何通过 acme.sh 申请泛域名 SSL 证书,并使用 Nginx 配置全站 HTTPS 的详细过程。
本文章始发于:Nginx全站开启HTTPS
本文章目录:
泛域名SSL证书申请
使用acme.sh申请letsencrypt泛域名SSL证书,并自动续期
下载安装acme.sh
1、下载安装acme.sh
curl https://get.acme.sh | sh -s email=my@example.com
2、查看是否下载成功并安装
cd ~/.acme.sh/
如果没有该目录,下载失败,说明GitHub地址可能被墙了,这时需要更新一下host,再尝试重新下载安装:
(1)打开IPAddress,查询以下域名IP地址,记录域名对应的IP
-
github.com
-
raw.Githubusercontent.com
(2)根据记录的IP域名修改HOST
比如上述记录的如下,一个域名对于多个IP分多行写:
140.82.112.4 github.com
185.199.108.133 githubusercontent.com
185.199.109.133 githubusercontent.com
185.199.110.133 githubusercontent.com
185.199.111.133 githubusercontent.com
修改本地HOST文件/etc/hosts
,添加如上所得记录:vim /etc/hosts
(3)刷新DNS,centos 7 为例,其他自行百度:nscd -i hosts
或systemctl restart nscd
3、设置bash别名
alias acme.sh=~/.acme.sh/acme.sh
4、开启 acme.sh 自动更新
acme.sh --upgrade --auto-upgrade
申请SSL证书
安装好 acme.sh 后就可以准备为域名申请SSL证书,
1、获取对应域名服务商的DNS API,具体请看:How to use DNS API,笔者使用的是腾讯云,所以用的是dns_dp
,登录DNSPod获取点击头像那边“API 秘钥”获取“DNSPod Token”,点击“创建秘钥”,创建成功后记录 ID 与 Token 。
2、把 ID 与 Token 添加到用户环境变量中:vim ~/.bash_profile
,不同的服务商配置项可能有出入,具体请查看How to use DNS API
export DP_Id="123456"
export DP_Key="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
保存,使其生效:source ~/.bash_profile
3、申请对应泛域名(主域名与*通配符域名)SSL证书。上面第2点需配置好,注意 --dns 后面的参数应该对应你申请域名的服务商DNS API,支持的API列表:acme.sh/dnsapi。
acme.sh --issue --dns dns_dp -d yourdomain.com -d *.yourdomain.com
4、如果配置正确,申请正常,生成的秘钥位于“acme.sh目录/你申请的域名/”下 ~/.acme.sh/yourdomain.com
cd ~/.acme.sh
ls
cd yourdomain.com
~/.acme.sh/yourdomain.com.cer
~/.acme.sh/yourdomain.com.key
至此,SSL证书申请完毕后,下一步 Nginx 配置全站开启 HTTPS
关于自动续期
申请的泛域名SSL证书有效期为 3 个月,但是 acme.sh 会为我们自动续期SSL,无需我在在进行操作,它生产一个crontab,输入crontab -l
即可查看到。
24 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
Nginx配置全站HTTPS
开放 443 端口
1、主机 443 端口开启
# 查询 443 是否开放
firewall-cmd --query-port=443/tcp
# 如果没有开放,开放443端口
firewall-cmd --permanent --add-port=443/tcp
# 重启防火墙
firewall-cmd --reload
2、云主机安全组/防火墙 443 端口开放
配置 Nginx 规则
1、添加HTTPS通用配置:0.ssl.conf.server
,证书路径修改成刚刚 acme.sh 申请到的证书绝对路径
listen 443 ssl http2;
ssl_certificate /root/.acme.sh/yourdomain.com/yourdomain.com.cer;
ssl_certificate_key /root/.acme.sh/yourdomain.com/yourdomain.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
2、添加HTTP跳转到HTTPS默认配置;访问错误域名返回403:0.default.conf
server {
listen 80 default_server;
server_name *.yourdomain.com; # 跳转至HTTPS
rewrite ^(/.*)$ https:$host$1 permanent; #302跳转到https地址
error_page 497 https://$host$request_uri; #497用于http到https的强制跳转
}
server {
server_name _;
include 0.ssl.conf.server; # 引入HTTPS通用配置,监听开启HTTPS
return 403;
}
3、新加网站Nginx配置示例:
3.1 示例1
# 网站首页
server {
server_name yourdomain.com www.yourdomain.com;
access_log /www/index/access.log;
include 0.ssl.conf.server; # 引入HTTPS通用配置,监听开启HTTPS
location / {
root /www/index;
index index.html;
}
location ~ .*\.(log)?$ {
return 403;
}
}
3.2 示例2
upstream blog {
server 127.0.0.1:8080;
}
server {
server_name blog.yourdomain.com;
include 0.ssl.conf.server; # 引入HTTPS通用配置,监听开启HTTPS
location / {
proxy_pass http://blog;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
配置生效测试
1、检测配置是否正确
nginx -t
2、重载配置
nginx -s reload
3、测试访问