CentOS Let's Encrypt Nginx

nginxリバースプロキシでLet’s Encrypt SSL証明書更新失敗

CentOS

Let’s Encrypt SSL証明書の更新エラー対応

以前投稿した下記記事の証明書更新が突然失敗する様になってしまった

やっかいなのは リバースプロキシでLet’s Encrypt

通常のWebサイトでのLet’s Encrypt の設定情報は見つけやすいがリバースプロキシでの設定情報は少ない
証明書はリバースプロキシに設定する。リバースプロキシで証明書の更新は –webroot  オプションを使用するといいらしい
--webrootオプションを指定すると、DocumentRoot( /usr/share/nginx/html)配下に/.well-known/acme-challenge/というディレクトリが作成され、そのディレクトリ配下のファイルをLet’s Encryptが参照できる事で検証成功・証明書が発行されるらしい。
今回は /usr/share/nginx/html/ssl-proof をmydomain.xxxとして公開し、Let’s Encryptが80ポートで(http://mydomain.xxx/.well-known/acme-challenge/配下に)アクセス確認ができると証明書が発行されるらしい。

# /root/certbot/certbot-auto certonly --webroot -w /usr/share/nginx/html/ssl-proof -d mydomain.xxx

やったこと

参考サイト通り nginx側にプロキシ動作しないwebrootを作成

参考サイト通り 初めにWebRoot用のパスを作成します。

[root@nginxsv html]# pwd
/usr/share/nginx/html
[root@nginxsv html]# mkdir /usr/share/nginx/html/ssl-proof
[root@nginxsv html]# chmod 755 ssl-proof

今までの /etc/nginx/conf.d/nextcloud.conf

server {
server_name mydomain.xxx *.mydomain.xxx;
location / {
proxy_pass http://192.168.1.1/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection keep-alive;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/mydomain.xxx/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mydomain.xxx/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
if ($host = mydomain.xxx) {
return 301 https://$host$request_uri;
} # managed by Certbot

listen 80;
server_name mydomain.xxx *.mydomain.xxx;
return 404; # managed by Certbot
}

新しい /etc/nginx/conf.d/nextcloud.conf

upstream backend {
   server 192.168.1.1:80;
}

server {
   listen  80;
   server_name   mydomain.xxx;

   location ^~ /.well-known {
        root /usr/share/nginx/html/ssl-proof;
   }

   location / {
        return 301 https://$host$request_uri;
   }

}

server {
    listen 443 ssl; # managed by Certbot
    server_name mydomain.xxx;

    ssl_certificate /etc/letsencrypt/live/mydomain.xxx/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mydomain.xxx/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

   location / {
        proxy_pass         http://backend/;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
#        proxy_set_header   Connection keep-alive;
        proxy_set_header   Connection "Upgrade";
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
   }
}

今までの cron の内容

毎週土曜日早朝に下記のcronで証明書の強制更新をしていたがある日突然失敗しだした

30 4 * * 6 /root/certbot/certbot-auto renew --force-renew

新しい cron の内容

まだ、土曜日になってないので未検証ですが

30 4 * * 6 /root/certbot/certbot-auto certonly --webroot -w /usr/share/nginx/html/ssl-proof -d mydomain.xxx

お世話になったサイト

解りやすかった。感謝!

コメント