Ошибка 403 при обновлении Let's Encrypt Certbot с помощью Django и Apache. У меня есть 6 дней для продления
При выполнении команды certbot renew
я сначала изменяю разрешения брандмауэра, чтобы разрешить соединения на порту 80, перевожу Cloudflare в режим разработки, а затем выполняю команду обновления. Однако на этот раз я получил ошибку 403 Forbidden, пытаясь получить доступ к url example.com/.well-known/acme-challenge/funnylettersandstuff. Я не помню, чтобы certbot нуждался в этом url, но я делаю это только раз в год для одного из моих сайтов, потому что по какой-то причине я так и не смог заставить эту конфигурацию автоматически обновляться. И вот теперь я пытаюсь выяснить, что вызывает эту ошибку. Я просмотрел файл конфигурации виртуального хоста и не вижу никаких причин, по которым это может произойти. У меня также включен modsecurity, но я сомневаюсь, что дело в этом, поскольку я не могу найти никаких связанных ошибок в журналах modsecurity. Нужно ли мне что-то сделать в Django, чтобы это заработало?
Certbot failed to authenticate some domains (authenticator: apache). The Certificate Authority reported these problems:
Domain: example.com
Type: unauthorized
Detail: During secondary validation: 2a06:98c1:3120::1: Invalid response from http:// example.com/.well-known/acme-challenge/funkylettersandnumbers: 403
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -F
sudo iptables -X
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 969 -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -j DROP
sudo iptables -A FORWARD -j DROP
sudo ip6tables -P INPUT ACCEPT
sudo ip6tables -P FORWARD ACCEPT
sudo ip6tables -P OUTPUT ACCEPT
sudo ip6tables -t nat -F
sudo ip6tables -t mangle -F
sudo ip6tables -F
sudo ip6tables -X
sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A OUTPUT -o lo -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 969 -j ACCEPT
sudo ip6tables -A INPUT -j DROP
sudo ip6tables -A FORWARD -j DROP
<VirtualHost *:8080>
<Directory /home/username/example>
Deny from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
Alias /static /home/username/example/example/static
Alias /media /home/username/example/example/example/static/example/img
#RewriteEngine on
#RewriteCond %{SERVER_NAME} =example.com [OR]
#RewriteCond %{SERVER_NAME} =www.example.com
#RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
Alias /static /home/username/example/example/static
Alias /media /home/username/example/example/example/static/example/img
<Directory /home/username/example/example/static>
Require all granted
AllowOverride All
Options -Indexes -MultiViews +SymLinksIfOwnerMatch
</Directory>
<Directory /home/username/example/example/example/static/example/img>
Require all granted
AllowOverride All
Options -Indexes -MultiViews +SymLinksIfOwnerMatch
</Directory>
<Directory /home/username/example/example>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess example.com python-home=/home/username/example/example-env python-path=/home/username/example/example
WSGIProcessGroup example.com
WSGIScriptAlias / /home/username/example/example/example/wsgi.py
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
Я работал с ChatGPT над этим, но он просто водит меня по кругу. Я пробовал предоставлять разрешение на этот url всеми возможными способами, но я действительно запутался в этом. ChatGPT сказал, что мне не нужно, чтобы Django управлял этим url, так как Certbot будет решать эту проблему с помощью Apache. Но мне это кажется неправильным. Кажется, я должен как-то создать этот .well-known/acme-challenge/ в Django, но я не знаю, как Certbot будет взаимодействовать с ним, чтобы предоставить вызов.