Я пытаюсь настроить CertBot, и он работает, только когда я обслуживаю свой сайт через http. Обычно у меня есть перенаправление https, и я не хочу менять конфигурацию сайта каждый раз, когда мне нужно использовать certbot. Я пытался служить только /.well-known/
через http, но у него все еще нет идей, как это решить?
Я пытаюсь скопировать эту идею, но не работаю -> NGINX перенаправляет все, кроме letsencrypt, на https
Например: Это работает:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
location / {
proxy_pass http://localhost:8575/;
include /etc/nginx/conf.d/proxy.conf;
}
}
Это не так: (Обратите внимание, что текущие настроенные сертификаты SSL неверны, но необходимы для запуска NGinX)
server {
listen 80;
listen [::]:80;
server_name www.example.com example.com;
location /.well-known/acme-challenge/ {
proxy_pass http://localhost:8575/;
include /etc/nginx/conf.d/proxy.conf;
}
location / {
return 301 https://$server_name$request_uri;
}
}
server {
listen 443 ssl;
listen [::]:443;
server_name www.example.com example.com;
# ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_certificate /etc/ssl/crt/crt.crt;
ssl_certificate_key /etc/ssl/crt/key.key;
location / {
proxy_pass http://localhost:8575/;
include /etc/nginx/conf.d/proxy.conf;
}
}
Журнал ошибок:
certbot | Saving debug log to /var/log/letsencrypt/letsencrypt.log
certbot | Plugins selected: Authenticator webroot, Installer None
certbot | Registering without email!
certbot | Obtaining a new certificate
certbot | Performing the following challenges:
certbot | http-01 challenge for www.example.com
certbot | http-01 challenge for example.com
certbot | Using the webroot path /var/www/html for all unmatched domains.
certbot | Waiting for verification...
certbot | Challenge failed for domain www.example.com
certbot | Challenge failed for domain example.com
certbot | http-01 challenge for www.example.com
certbot | http-01 challenge for example.com
certbot | Cleaning up challenges
certbot | IMPORTANT NOTES:
certbot | - The following errors were reported by the server:
certbot |
certbot | Domain: www.example.com
certbot | Type: unauthorized
certbot | Detail: Invalid response from
certbot | http://www.example.com/.well-known/acme-challenge/WyVEA5g6BWVDPpYUhEJ0bG5iH6daF1rZpFd0vuTXOa0
certbot | [50.117.156.123]: " <!DOCTYPE html><html lang=\"en-US\">\r\n
certbot | \t<head>\n\n\t\t <meta charset=\"UTF-8\">\r\n <meta
certbot | name=\"viewport\" con"
certbot |
certbot | Domain: example.com
certbot | Type: unauthorized
certbot | Detail: Invalid response from
certbot | https://www.example.com/x61_h9wxFY2Ye8-16GllyMq_dfsXbsEB1lYOjeq4LjU
certbot | [50.117.156.123]: " <!DOCTYPE html><html lang=\"en-US\">\r\n
certbot | \t<head>\n\n\t\t <meta charset=\"UTF-8\">\r\n <meta
certbot | name=\"viewport\" con"
certbot |
certbot | To fix these errors, please make sure that your domain name was
certbot | entered correctly and the DNS A/AAAA record(s) for that domain
certbot | contain(s) the right IP address.
certbot | - Your account credentials have been saved in your Certbot
certbot | configuration directory at /etc/letsencrypt. You should make a
certbot | secure backup of this folder now. This configuration directory will
certbot | also contain certificates and private keys obtained by Certbot so
certbot | making regular backups of this folder is ideal.
certbot | Some challenges have failed.
certbot exited with code 1
Обновление: моя основная проблема заключалась в том, чтобы не использовать $request_uri
ж / proxy_pass
директива (которая также не позволяет ~
Кстати). Но нет ничего плохого в использовании этого в блоке HTTPS. Более того, посмотрев на оба https://serverfault.com/a/1018199/312793 и
https://serverfault.com/a/1017720/312793 Я понял, что мне не нужно передавать мой «настоящий» корневой каталог моего веб-приложения, просто где-то, что nginx может служить certbot для чтения / записи файлов. Кроме того, у вас может быть один каталог для обслуживания нескольких сайтов, поэтому я решил, что будет наиболее целесообразно добавить location
внутри default
Серверный блок nginx У меня есть настройка перенаправления неправильно отформатированных запросов для включения certbot, поэтому теперь я могу добавлять домены без настройки каких-либо конфигураций на 100%. На самом деле, веб-приложение даже не нужно запускать, только nginx.
Вот мой новый default
серверный блок. Примечание: я создал папку acme
внутри моего "настоящего" корневого каталога nginx и обслуживаю этот каталог для location /.well-known/acme-challenge/
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html/;
index index.html;
}
server {
listen 443 default_server;
listen [::]:443 default_server;
ssl_certificate /etc/ssl/fake/fake.crt;
ssl_certificate_key /etc/ssl/fake/fake.key;
location /.well-known/acme-challenge/ {
root /var/www/html/acme;
allow all;
}
root /var/www/html/;
index index.html;
}
Как и при настройке, вам нужно иметь что-то для сертификатов SSL, иначе nginx не запустится правильно. Очень доволен такой настройкой / разрешением!
Необходимо добавить следующее: $request_uri
location /.well-known/acme-challenge/ {
proxy_pass http://localhost:8575/$request_uri;
include /etc/nginx/conf.d/proxy.conf;
}
С участием HTTP-01 вызов Вполне нормально сначала перенаправить на HTTPS и решить проблему через TLS. Однако проблема всегда начинается с простого HTTP-соединения, использующего порт 80, и вы можете перенаправить на HTTPS только через порт 443.
Наша реализация запроса HTTP-01 следует за перенаправлениями, глубина до 10 перенаправлений. Он принимает перенаправления только на «http:» или «https:» и только на порты 80 или 443. Он не принимает перенаправления на IP-адреса. При перенаправлении на URL-адрес HTTPS он не проверяет сертификаты (поскольку эта задача предназначена для загрузки действительных сертификатов, по пути он может встретить самозаверяющие или просроченные сертификаты).
Запрос HTTP-01 может быть выполнен только на порту 80. Разрешение клиентам указывать произвольные порты сделает запрос менее безопасным, поэтому он не разрешен стандартом ACME.
Следовательно, такая конфигурация Nginx также должна работать:
server {
listen 80;
server_name www.example.com example.com;
location / {
return 301 https://$server_name$request_uri;
}
}
server {
listen 443 ssl;
server_name www.example.com example.com;
location /.well-known/acme-challenge/ {
# HTTP-01 challenge
}
location / {
# Your web application
}
}
В вашем случае это означает, что следующее может быть либо в HTTP, либо в HTTPS server
блок.
location /.well-known/acme-challenge/ {
proxy_pass http://localhost:8575/.well-known/acme-challenge/;
include /etc/nginx/conf.d/proxy.conf;
}
Вы смогли заменить /.well-known/acme-challenge/
с участием $request_uri
так как:
Когда переменные используются в proxy_pass:
location /name/ { proxy_pass http://127.0.0.1$request_uri; }
В этом случае, если в директиве указан URI, он передается на сервер как есть, заменяя исходный URI запроса.
Кроме того, если /
имеет тот же корень, вам не нужен отдельный location
вообще.
В вашей конфигурации proxy_pass
не требуется для certbot, если nginx имеет доступ к корневому каталогу. Вы можете просто разрешить доступ для .well-known
каталог и объявить server_name
и root
для сайта.
Я написал об этом для сообщения в блоге (https://dev.slickalpha.blog/2019/11/installing-lemp-stack-on-debian-buster.html).
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/site;
location ~ /.well-known/acme-challenge/ {
allow all;
}
location / {
return 301 https://$server_name$request_uri;
}
}