使用Certbot开启https并保护所有二级域名-Nginx
Posted 两件快乐的事情 futatsu.fun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Certbot开启https并保护所有二级域名-Nginx相关的知识,希望对你有一定的参考价值。
序言
当不再满足使用域名+端口号访问一台服务器上不同项目时,我决定研究下如何实现二级域名方式访问。网上当然教程很多,但是我还是踩了不少坑,在此记录一下。
准备工作
按照官网的做法,安装EPEL等,有很多东西都是自带的,所以有可以跳过
yum -y install yum-utils
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
yum install certbot python2-certbot-nginx
或者更简单,直接执行docker命令
docker run -it --rm --name certbot -v "/etc/letsencrypt:/etc/letsencrypt" -v "/var/lib/letsencrypt:/var/lib/letsencrypt" certbot/certbot certonly -d *.futatsu.fun -d futatsu.fun --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory
生成证书挂载进nginx
certbot certonly --standalone --email nsyk46@gmail.com -d *.futatsu.fun -d futatsu.fun
中间会要求你添加一条TXT记录在域名解析中,去添加。
主机记录 | 记录类型 | 线路类型 | 记录值 |
---|---|---|---|
_acme-challenge | TXT | 默认 | (certbot生成) |
此时默认证书会生成在 ‘/etc/letsencrypt/live/你的域名/‘ 下,你可以选择重新挂载nginx把这个目录挂载进去,也可以手动cp,推荐重新挂载,这样将来更新证书时很方便。
设置二级域名
现在我希望把管理docker容器的portainer使用二级域名方式访问,即直接访问https://portainer.futatsu.fun,不需要访问9000端口,以下是设置
server {
listen 80;
listen 443 ssl;
server_name portainer.futatsu.fun;
# old certs
# ssl_certificate /cert/1_www.futatsu.fun_bundle.crt;
# ssl_certificate_key /cert/2_www.futatsu.fun.key;
ssl_certificate /cert/fullchain.pem;
ssl_certificate_key /cert/privkey.pem;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-Xss-Protection 1;
location / {
proxy_pass https://futatsu.fun:9000;
}
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}
同时又希望通过https://csv.futatsu.fun 访问csv转json工具
只需再配一个server即可,很简单。
#csv
server {
listen 80;
listen 443 ssl;
server_name csv.futatsu.fun;
ssl_certificate /cert/fullchain.pem;
ssl_certificate_key /cert/privkey.pem;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-Xss-Protection 1;
location / {
root /usr/share/nginx/html/uploadcsv;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}
踩坑点
在设置http跳转https时,我遇到了坑点,我访问http://crv.futatsu.fun/abc,跳转成为https://crv.futatsu.fun/abcabc,原因如下。
#设置跳转时,不应该判断是否访问80端口,而应该判断是否scheme为https,否则会造成一次循环导致request_uri被添加两次。
#原来写法
if ($server_port = 80) {
rewrite 301 https://$host$request_uri;
}
#现在写法
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
目前面临问题
因为我是在域名解析-主机记录中,直接添加泛解析*,导致目前未被拦截的请求都会解析到主页上去,比如a.futatsu.fun相当于直接访问futatsu.fun。
解决方案1. 不适用泛解析,应该解析二级域名,这样其他直接没有解析即可,但是我不喜欢这样
接下来想做 访问不存在的二级域名,跳转到404页面。
以上是关于使用Certbot开启https并保护所有二级域名-Nginx的主要内容,如果未能解决你的问题,请参考以下文章
Nginx使用Certbot配置Let's Encrypt域名https解决方案
申请Let’s Encrypt通配符HTTPS证书(certbot ACME v2版)
Certbot给网站域名申请免费SSL证书 及Nginx配置
certbot在Centos7上配置合法签名证书,实现nginx的https访问