Я уже некоторое время использую утилиту Certbot Let's Encrypt с NGINX на Ubuntu Server 17.10, и, хотя она работает хорошо, я предпочитаю FreeBSD. До недавнего времени (февраль 2018 г.) плагин nginx не был доступен для certbot на FreeBSD, но теперь, когда он появился, пришло время перейти на FreeBSD.
Nginx был легким, копировал / вставлял конфигурации, и он был запущен (с небольшой настройкой путей).
Certbot и /etc/letsencrypt
иерархия тоже не представляла большого труда, пока я не попробовал запустить certbot renew --dry-run
чтобы проверить, все ли работает. Вся иерархия была скопирована с неповрежденными символическими ссылками (с использованием tar
), пути в файлах конфигурации обновления были изменены, чтобы отразить новое местоположение (/usr/local/etc/letsencrypt
скорее, чем /etc/letsencrypt
). Конфигурация Nginx находится в /usr/local/etc/nginx/nginx.conf
.
Сообщение об ошибке, которое я получаю при запуске certbot
как следует:
# certbot
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Error while running nginx -c /etc/nginx/nginx.conf -t.
nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
nginx: configuration file /etc/nginx/nginx.conf test failed
Certbot doesn't know how to automatically configure the web server on
this system. However, it can still get a certificate for you. Please run
"certbot certonly" to do so. You'll need to manually configure your web
server to use the resulting certificate.
Содержание /var/log/letsencrypt/letsencrypt.log
:
# cat /var/log/letsencrypt/letsencrypt.log
2018-04-04 18:52:42,032:DEBUG:certbot.main:certbot version: 0.22.2
2018-04-04 18:52:42,033:DEBUG:certbot.main:Arguments: []
2018-04-04 18:52:42,033:DEBUG:certbot.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#nginx,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot)
2018-04-04 18:52:42,051:DEBUG:certbot.log:Root logging level set at 20
2018-04-04 18:52:42,052:INFO:certbot.log:Saving debug log to /var/log/letsencrypt/letsencrypt.log
2018-04-04 18:52:42,052:DEBUG:certbot.plugins.selection:Requested authenticator None and installer None
2018-04-04 18:52:42,065:ERROR:certbot.util:Error while running nginx -c /etc/nginx/nginx.conf -t.
nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
nginx: configuration file /etc/nginx/nginx.conf test failed
2018-04-04 18:52:42,065:DEBUG:certbot.plugins.disco:Misconfigured PluginEntryPoint#nginx: Error while running nginx -c /etc/nginx/nginx.conf -t.
nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
nginx: configuration file /etc/nginx/nginx.conf test failed
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/certbot/plugins/disco.py", line 126, in prepare
self._initialized.prepare()
File "/usr/local/lib/python2.7/site-packages/certbot_nginx/configurator.py", line 134, in prepare
self.config_test()
File "/usr/local/lib/python2.7/site-packages/certbot_nginx/configurator.py", line 798, in config_test
raise errors.MisconfigurationError(str(err))
MisconfigurationError: Error while running nginx -c /etc/nginx/nginx.conf -t.
nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
nginx: configuration file /etc/nginx/nginx.conf test failed
2018-04-04 18:52:42,066:DEBUG:certbot.plugins.selection:Single candidate plugin: * nginx
Description: Nginx Web Server plugin - Alpha
Interfaces: IAuthenticator, IInstaller, IPlugin
Entry point: nginx = certbot_nginx.configurator:NginxConfigurator
Initialized: <certbot_nginx.configurator.NginxConfigurator object at 0x80217c0d0>
Prep: Error while running nginx -c /etc/nginx/nginx.conf -t.
nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
nginx: configuration file /etc/nginx/nginx.conf test failed
2018-04-04 18:52:42,067:DEBUG:certbot.plugins.selection:Selected authenticator None and installer None
Самое неприятное, что если я создам символическую ссылку из /usr/local/etc/nginx
к /etc/nginx
, все работает.
Также хочу отметить, что nginx работает отлично, как и сертификаты. Когда указанная выше символическая ссылка присутствует, обновление сертификата также работает.
Я знаю, что могу выдавать флаги certbot, чтобы указать ему искать файлы nginx в другом месте, кроме настроенного по умолчанию, или помещать эти флаги в файл конфигурации, но я бы предпочел, чтобы он работал без них, если это вообще возможно.
Я предполагаю, что все это связано с тем, что я скопировал дерево каталогов letsencrypt с сервера Linux, поэтому мой вопрос просто в том, есть ли способ «перенастроить» certbot для поиска конфигураций nginx под /usr/local/etc/nginx
скорее, чем /etc/nginx
.
Системная информация:
FreeBSD 11.1-RELEASE-p9 amd64, стоковое ядро
Nginx: www/nginx-devel
из портов, версия 1.13.10
Certbot: security/py-certbot
из портов, py27-certbot-0.22.2,1
Certbot-nginx: security/py-certbot-nginx
из портов, py27-certbot-nginx-0.22.2
Заранее спасибо.
Я решил это!
После долгих поисков в системе, запустив certbot -vvvvvv
для большого количества отладочных данных я наконец нашел /usr/local/lib/python2.7/site-packages/certbot_nginx/constants.py
который устанавливает путь к конфигурации nginx. Я изменил это с /etc/nginx
к /usr/local/etc/nginx
, перекомпилировал .pyc (python -m py_compile constants.py
) и .pyo (python -O -m py_compile constants.py
) файлы, удалил символическую ссылку из / etc / nginx и привет, все работает!
Не уверен, был ли путь установлен во время компиляции / установки или он был взят из файлов конфигурации, скопированных из системы Linux, но, по крайней мере, теперь он ищет файлы конфигурации в нужном месте.
Также не уверен, сохранятся ли эти изменения после обновлений; время покажет.
Изменить: я развернул виртуальную машину и установил nginx, py-certbot-nginx и зависимости, и он действительно установил /etc/nginx
как базовый каталог для конфигов nginx при установке. Я напишу PR специалисту по обслуживанию порта для py-certbot-nginx.