Certbot: ошибка "UnicodeDecodeError: ascii codec can't decode byte" при попытке создать или обновить сертификаты
В какой-то момент мне на почту пришло письмо, в котором cerbot любезно напомнил мне о том, что истекают некоторые из сертификатов. Как говорится, ничто не предвещало беды...
Обычно чтобы обновить истекающие сертификаты, достаточно выполнить очень простую команду:
$ sudo certbot renew
Но в процессе выполнения этой команды cerbot начал выдавать довольно странную ошибку:
An unexpected error occurred:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 419: ordinal not in range(128)
Please see the logfiles in /var/log/letsencrypt for more details.
Что это за ascii символы такие появились в конфигурационных файлах и почему cerbot вдруг начал на них ругаться? Вот примерно такой вопрос прозвучал в голове в первые минуты после появления ошибки на экране. При этом упоминались конфигурационные файлы именно тех хостов, для которых и требовалось обновить сертификаты. Многочасовые поиски решения проблемы сводились к подсказкам вида "проверь эти конфиги и убери из них все некорректные символы", например:
We will look into this, as it is certainly something that we should handle, but to work around this, replace the double quotes in comment of server_tokens directive: “Server”
Однако, в моих конфигах не было ничего, кроме UTF-8, что заставляло всё чаще и чаще восклицать «WTF?!».
Решением же пробемы стал комментарий, содержащий довольно простую идею: поискать некорректные символы не только в тех файлах, которые так любезно выделял цветом cerbot, а вообще во всех конфигах nginx. Для этого можно выполнить следующую команду:
grep -r -P '[^\x00-\x7f]' /etc/nginx /etc/letsencrypt
Если у вас конфиги лежат где-то ещё, то просто укажите дополнительно пути к ним.
В результате оказалось, что в двух конфигах действительно использовалась какая-то странная кодировка в закомментированных строчках. Выглядело это примерно так:
Следует удалить эти строки или переписать комментарий так, чтобы кодировка была как-минимум UTF-8. После чего cerbot начал работать так, как и должен был, все сертификаты были успешно обновлены.
Судя по комментариям разработчиков на github, они планируют добавить более понятные сообщения об ошибках в будущем. А пока что приходится «методом тыка» разбираться, что же там и, что самое главное, где именно пошло не так.