使用Certbot開啟https並保護所有二級域名-Nginx-centos7


序言

當不再滿足使用域名+端口號訪問一台服務器上不同項目時,我決定研究下如何實現二級域名方式訪問。網上當然教程很多,但是我還是踩了不少坑,在此記錄一下。

准備工作

按照官網的做法,安裝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頁面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM