Рейтинг:0

Как разрешить certbot доступ к http://myapi.com/.well-known/acme-challenge/2d8dvxv8x9dvxd9v через nginx?

флаг in

Мой файл nginx.conf выглядит следующим образом:

www-данные пользователя;
рабочие_процессы авто;
pid /run/nginx.pid;
включить /etc/nginx/modules-enabled/*.conf; 
#вышеупомянутое включение включает следующие файлы по умолчанию:
# 50-mod-http-image-filter.conf  
#50-mod-http-xslt-filter.conf  
#50-mod-mail.conf  
#50-mod-stream.conf

События {
        worker_connections 500;
}

http {
    включить /etc/nginx/proxy.conf;
    limit_req_zone $binary_remote_addr zone=one:10м rate=100р/м;
    server_tokens отключены;

    отправить файл включен;
    keepalive_timeout 30;
    client_body_timeout 10; client_header_timeout 10; send_timeout 10;

    вверх по течению мое приложение {
        сервер 127.0.0.1:5000;
    }

    сервер {
        слушать 443 ssl http2;
        слушать [::]:443 ssl http2;
        имя_сервера myapi.com;
        ssl_certificate /etc/letsencrypt/live/myapi.com/fullchain.pem; # под управлением Certbot
        ssl_certificate_key /etc/letsencrypt/live/myapi.com/privkey.pem; # под управлением Certbot
        включить /etc/letsencrypt/options-ssl-nginx.conf; # под управлением Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # под управлением Certbot

        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;


        #Перенаправляет весь трафик
        место расположения / {
            прокси_пасс http://myapi;
            limit_req zone=один пакет=10;
        }
    }
}

я установил certbot и certbot-nginx (убунту).

SSL работает нормально. Брандмауэр разрешает только порт 443.

Я пытаюсь обновить сертификат certbot с помощью команды: sudo certbot обновить --dry-run

Это пытается подтвердить, что я владею доменом, отправляя запрос на http://myapi.com/.well-known/acme-challenge/2d8dvxv8x9dvxd9v (примечание: я запутал значение ключа 2d8dvxv8x9dvxd9v, так как это что-то личное)

Но на этот раз вышло. Поэтому я включил порт 80 и добавил следующий дополнительный элемент сервера:

   сервер {
         слушать 80;
         имя_сервера myapi.com;
         вернуть 301 https://$host$request_uri;
      }

Теперь команда обновления certbot (sudo certbot обновить --dry-run) может обновить сертификат. Странно, даже если я удалю этот серверный блок, обновление certbot работает нормально.

  1. Где путь .well-known/acme-challenge? Он генерируется/удаляется на лету?

  2. Когда я удаляю блокировку сервера для порта 80, то как nginx может обновить сертификат (потому что ему нужен порт 80 для вызова certbot)?

Gerard H. Pille avatar
флаг in
Пусть сервер на порту 80 отвечает только на запросы /.well-known/acme-challenge. Ваш сайт будет безопаснее, если вы не перенаправите http на https.
флаг in
Но где находится `/.well-known/acme-challenge`?
Gerard H. Pille avatar
флаг in
Корень документа вашего сервера nginx. Кажется, я помню, как certbot спрашивал, куда его поместить.
флаг in
Есть ли какой-нибудь конфиг, где я могу это проверить?
Gerard H. Pille avatar
флаг in
Конечно: ваш конфиг nginx. Разве это не /var/www/html по умолчанию? Найдите директиву «root» в своей конфигурации или параметр командной строки «p» при запуске nginx.
флаг in
Не уверен - я вставил содержимое моего файла nginx.conf в вопрос - он ничего не говорит о /var/www/html
Gerard H. Pille avatar
флаг in
Вы вставили nginx.conf, но не включенные конфигурации. Проверьте «man nginx». Там написано, что /usr/share/nginx используется по умолчанию. У меня есть корневая директива в моих конфигах, указывающая на /var/www/html.
флаг in
Да, только что проверил, "man nginx" говорит, что /usr/share/nginx используется по умолчанию. Но где вы проверили следующее, пожалуйста? `У меня есть корневая директива в моей конфигурации, указывающая на /var/www/html`
Gerard H. Pille avatar
флаг in
Поискав файлы в /etc/nginx. Я нашел "./sites-available/default: root /var/www/html;"
флаг in
Как показано в содержимом моего файла nginx.config, сайты доступны/по умолчанию не включаются — я думаю, это указывает на то, что по умолчанию используется /usr/share/nginx.
Gerard H. Pille avatar
флаг in
certbot создаст файл, а когда закончит, удалит его. После этого вы можете проверить дату изменения каталога.
флаг in
Ок имеет смысл. Итак, могу ли я изменить эту строку «return 301 https://$host$request_uri;» на «location / { root /usr/share/nginx; }`.
флаг in
Немного удивлен моим открытием, что если я удалю 2-й сервер (который слушает 80), даже тогда обновление certbot будет работать. Так что мне вообще не нужен блок 2-го сервера. Но тогда мне интересно, как certbot может получить доступ к конечной точке. Это сбивает меня с толку.
Gerard H. Pille avatar
флаг in
Возможно, http://myapi обеспечивает апогею? Или вы забыли перезапустить nginx?
Gerard H. Pille avatar
флаг in
«location / { root /usr/share/nginx; }» разрешит доступ ко всему, что находится в /usr/share/nginx.
флаг in
Я сделал перезагрузку системы, и обновление certbot работает (похоже, все, что нужно, чтобы порт 80 был открыт в брандмауэре). Я также удалил все блоки кода сервера, и обновление certbot все еще работает.
Gerard H. Pille avatar
флаг in
Тогда чего-то не хватает в вашей конфигурации. Что содержит файл /etc/nginx/proxy.conf?
флаг in
Я тоже удивлен. `proxy_redirect выключен; proxy_set_header Хост $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $ схема; client_max_body_size 10м; client_body_buffer_size 128 КБ; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffers 32 4k;`
флаг in
Certbot, возможно, на мгновение запускает свой собственный сервер, но я не могу найти никаких ссылок на это.
Gerard H. Pille avatar
флаг in
Итак, как запустить certbot? Когда я запускаю его, он спрашивает, хочу ли я использовать существующий сервер или его нужно запустить? Я не знаю, что происходит с «пробным запуском».
Gerard H. Pille avatar
флаг in
Исправление: я не использую certbot, я использую «certbot-auto».
флаг in
Это команда обновления `sudo certbot renew --dry-run`
Gerard H. Pille avatar
флаг in
Не совсем, это тест, чтобы увидеть, будет ли работать обновление. Тем временем я прочитал документацию certbot. Запуск собственного веб-сервера должен быть по умолчанию. Проверьте «man certbot».
флаг in
Если вы хотите изменить ответ, я могу отметить ответ.
Gerard H. Pille avatar
флаг in
Я попробую. Но тем не менее, поскольку вы запускали только «пробный прогон», вы все еще используете старый сертификат?
флаг in
Пробный прогон имитирует реальный процесс
Gerard H. Pille avatar
флаг in
"--dry-run Выполнить тестовый запуск клиента, получив тестовые (недействительные) сертификаты, но не сохраняя их на диск."
флаг in
Да, это гарантия того, что когда команда обновления автоматически запускается через планировщик (либо из задания автоматического cron, либо через службу auto systemd), сюрпризов не будет.
Рейтинг:1
флаг in

Вам нужен брандмауэр, который разрешает доступ к порту 80 (http), certbot запустит веб-сервер для предоставления файла acme-challenge из вашего домена.

флаг in
Я сделал это, и это работает, я обновил вопрос с вызовом.
флаг in
Я хочу только обслуживать запросы https и блокировать все запросы http, кроме обновления certbot. Какие изменения мне нужно внести в nginx.config?
Gerard H. Pille avatar
флаг in
Вы также можете указать брандмауэру отбрасывать запросы порта 80 после запуска certbor. Гораздо лучше, чем иметь дело с nginx.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.