Вопрос или проблема
Я недавно купил домен, хостинг и VPS на Ubuntu 22.04, все на Godaddy.
Домен и хостинг работают, я могу получить доступ к сайту, введя URL.
Но когда я пытаюсь получить SSL-сертификат с помощью certbot, я получаю следующее:
root@35:~# sudo certbot --apache
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Which names would you like to activate HTTPS for?
We recommend selecting either all domains, or all domains in a VirtualHost/server block.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: cihanbatasul.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Requesting a certificate for cihanbatasul.com
Certbot failed to authenticate some domains (authenticator: apache). The Certificate Authority reported these problems:
Domain: cihanbatasul.com
Type: unauthorized
Detail: 92.205.171.180: Invalid response from http://cihanbatasul.com/.well-known/acme-challenge/gGguqH44EsxtOmUeswWsjDx9xtSR70HrJzwEBjXuaZQ: 404
Hint: The Certificate Authority failed to verify the temporary Apache configuration changes made by Certbot. Ensure that the listed domains point to this Apache server and that it is accessible from the internet.
Some challenges have failed.
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.
Мой файл 000-default.conf:
<VirtualHost *:80>
# Директива ServerName устанавливает схему запроса, имя хоста и порт,
# которые сервер использует для идентификации себя. Это используется при создании
# URL-адресов переадресации. В контексте виртуальных хостов ServerName
# указывает какое имя хоста должно быть в заголовке Host: запроса,
# для совпадения с этим виртуальным хостом. Для виртуального хоста по умолчанию
# это значение не решающее, так как используется в качестве хоста последней инстанции.
# Однако, вы должны задать это значение для любого другого виртуального хоста явно.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Доступные уровни ведения журналов: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# Также возможно настроить уровень ведения журналов для определенных
# модулей, например
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# Для большинства файлов конфигурации из conf-available/,
# которые включены или отключены на глобальном уровне, возможно
# включить строку только для одного конкретного виртуального хоста. Например,
# следующая строка включает конфигурацию CGI только для этого хоста
# после того, как она была глобально отключена с помощью "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Файл конфигурации для моего домена под названием cihanbatasul.com.conf:
<VirtualHost *:80>
# Директива ServerName устанавливает схему запроса, имя хоста и порт,
# которые сервер использует для идентификации себя. Это используется при создании
# URL-адресов переадресации. В контексте виртуальных хостов ServerName
# указывает какое имя хоста должно быть в заголовке Host: запроса,
# для совпадения с этим виртуальным хостом. Для виртуального хоста по умолчанию
# это значение не решающее, так как используется в качестве хоста последней инстанции.
# Однако, вы должны задать это значение для любого другого виртуального хоста явно.
ServerName cihanbatasul.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/html>
Options FollowSymLinks
AllowOverride All
</Directory>
# Доступные уровни ведения журналов: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# Также возможно настроить уровень ведения журналов для определенных
# модулей, например
#LogLevel info ssl:warn
Alias /.well-known/acme-challenge/ /var/www/html/.well-known/acme-challenge/
<Location "/.well-known/acme-challenge/">
Options None
AllowOverride None
ForceType text/plain
RedirectMatch 404 "^(?!/\.well-known/acme-challenge/[\w-]{43}$)"
</Location>
# Для большинства файлов конфигурации из conf-available/,
# которые включены или отключены на глобальном уровне, возможно
# включить строку только для одного конкретного виртуального хоста. Например,
# следующая строка включает конфигурацию CGI только для этого хоста
# после того, как она была глобально отключена с помощью "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Я не уверен, правильно ли указал DocumentRoot. Я использовал структуру папок из моего дерева документов godaddy:
Ссылка на изображение структуры папок
У меня также нет файлов acme, и я не знаю, где их найти или как сделать их доступными.
Я был бы признателен за помощь.
Спасибо!
Ваш блок сервера неверен, для letsencrypt он должен выглядеть так:
<VirtualHost *:80>
ServerName mydom.tld
Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/
<Directory "/var/www/letsencrypt/.well-known/acme-challenge/">
Options None
AllowOverride None
ForceType text/plain
RedirectMatch 404 "^(?!/\.well-known/acme-challenge/[\w-]{43}$)"
</Directory>
# ... оставшаяся конфигурация
</VirtualHost>
Также убедитесь, что модуль ssl для apache включен
sudo a2enmod ssl
Что касается корня документа, рекомендуется, чтобы он выглядел так:
<VirtualHost *:80>
ServerName yourdomain.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/html>
Options FollowSymLinks
AllowOverride All
</Directory>
# Расположение вызова Let's Encrypt
Alias /.well-known/acme-challenge/ /var/www/html/.well-known/acme-challenge/
<Location "/.well-known/acme-challenge/">
Options None
AllowOverride None
ForceType text/plain
RedirectMatch 404 "^(?!/\.well-known/acme-challenge/[\w-]{43}$)"
</Location>
</VirtualHost>
Это должно быть сохранено в /etc/apache2/sites-available/yourdomain.conf
Убедитесь, что этот vhost включен и удалите остальные, которые были созданы ранее
.
Ответ или решение
Когда вы пытаетесь получить SSL-сертификат с помощью Certbot на сервере Ubuntu 22.04, базирующемся на GoDaddy, столкновение с ошибкой "unauthorized" может вызывать множество факторов. Давайте рассмотрим эту проблему подробно и шаг за шагом решим её.
Теория (Theory)
Ошибка "unauthorized" обычно возникает, когда служба автоматической проверки авторитета сертификатов, как Let’s Encrypt, не может подтвердить, что вы владеете доменом, на который вы пытаетесь получить сертификат. Самая распространённая причина – это неправильная конфигурация сервера или ошибки в DNS-записях.
Certbot использует HTTP-01 вызов, чтобы проверить владение доменом. Для этого, когда вы запускаете Certbot с флагом --apache
, он временно изменяет конфигурацию Apache, чтобы создать специальный путь на вашем сервере (например, /.well-known/acme-challenge/
). Затем он пытается получить доступ к этому пути, чтобы удостовериться, что сервер принадлежит вам.
Пример (Example)
В вашем случае было выявлено несколько потенциальных ошибок:
-
Конфигурация VirtualHost: Ваши конфигурации
000-default.conf
иcihanbatasul.com.conf
должны быть тщательно настроены. Убедитесь, что для каждого VirtualHost явно указанServerName
. -
DNS настройки: Убедитесь, что ваш домен указывает на ваш сервер VPS. Выполните
nslookup cihanbatasul.com
илиdig cihanbatasul.com
для проверки. -
Доступность сервера: Проверьте, что ваш сервер доступен снаружи по IP-адресу. Используйте инструменты вроде
curl http://cihanbatasul.com/.well-known/acme-challenge/test-file
(временно создайте тестовый файл), чтобы убедиться, что файлы в этой директории доступны. -
Права доступа: Каталог, в который Certbot записывает файлы проверки (
/.well-known/acme-challenge/
), должен быть доступен для чтения веб-сервером Apache. Убедитесь, что соответствующие права установлены. -
Конфигурация Alias: В вашей конфигурации Apache проверьте, что путь Alias настроен корректно, и директория существует:
/var/www/html/.well-known/acme-challenge/
.
Применение (Application)
Теперь давайте применим знания и шаги для исправления ошибки.
-
Настройка VirtualHost: Убедитесь, что конфигурация
cihanbatasul.com.conf
выглядит следующим образом:<VirtualHost *:80> ServerName cihanbatasul.com DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory /var/www/html> Options FollowSymLinks AllowOverride All </Directory> # Let's Encrypt challenge location Alias /.well-known/acme-challenge/ /var/www/html/.well-known/acme-challenge/ <Location "/.well-known/acme-challenge/"> Options None AllowOverride None ForceType text/plain RedirectMatch 404 "^(?!/\.well-known/acme-challenge/[\w-]{43}$)" </Location> </VirtualHost>
Убедитесь, что эта конфигурация сохранена в
/etc/apache2/sites-available/cihanbatasul.com.conf
. -
Включите конфигурацию сайта: Выполните команду
sudo a2ensite cihanbatasul.com.conf
, чтобы включить сайт. -
Перезагрузите Apache: Примените изменения с помощью
sudo systemctl restart apache2
. -
DNS Проверка: Запустите команды
nslookup
иdig
, чтобы убедиться, что домен указывает на правильный IP-адрес. -
Проверка доступа к серверу: Используйте команды
curl
или посетите URL напрямую в браузере (например,http://cihanbatasul.com/.well-known/acme-challenge/test-file
), чтобы удостовериться, что файлы доступны. -
Проверьте SSL модуль: Выполните
sudo a2enmod ssl
, чтобы убедиться, что SSL модуль Apache включён. -
Проверка и попытка снова: После выполнения всех этих шагов попробуйте снова запустить
certbot
команду. Используйте флаг-v
для более подробного логирования:sudo certbot --apache -v
.
Эти шаги должны помочь вам устранить ошибку "unauthorized" и корректно настроить SSL-сертификат на вашем сервере. Если ошибка всё ещё сохраняется, рекомендуется просмотреть /var/log/letsencrypt/letsencrypt.log
для поиска возможных подсказывающих сведений и, возможно, обратиться к сообществу Let’s Encrypt для дальнейшей помощи.