Поправка на Virtualmin под Ubuntu 20.04 LTS за издаване на SSL сертификати с Let’s Encrypt

Едно от досадните неща, които понякога се случват при преминаване от предишна версия на Linux дистрибуция към по-нова, е счупването на конкретна връзка, скрипт или премахването на поддръжка за даден софтуерен компонент. Някои такива проблеми се забелязват веднага от community-то и се отстраняват бързо, а други се проявяват по-рядко и остават извън полезрението на екипа, който поддържа съответния софтуер.

При преминаването от Ubuntu Server 18.04 LTS към Ubuntu Server 20.04 LTS на моя dev сървър по такъв начин се счупи автоматизираното (пре)издаване на SSL сертификати във Virtualmin чрез инструмента certbot на Let’s Encrypt. По-конкретно, при опит за преиздаване на изтичащ или вече изтекъл сертификат, системата започна да изплюва следното съобщение:

Bootstrapping dependencies for Debian-based OSes… (you can skip this with --no-bootstrap)
Hit:1 http://ppa.launchpad.net/certbot/certbot/ubuntu focal InRelease
Hit:2 http://archive.ubuntu.com/ubuntu focal InRelease
Hit:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease
Hit:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease
Reading package lists… Done
Reading package lists… Done
Building dependency tree
Reading state information… Done
Package python-virtualenv is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package ‘python-virtualenv’ has no installation candidate

Ако човек иска просто да си върши работата и тестовите му сайтове да не спират да се отварят заради изтекли SSL сертификати, винаги може да извика certbot certonly от командния ред, и умният скрипт ще обходи всички vhost-ове, ще провери за кои от тях сертификатите изтичат в близките 30 дни, и ще ги поднови. Проблемът е, че cron задачата на Virtualmin не следи реално дали определен vhost има валиден сертификат, а разчита на собствен журнален запис да „помни“ кога за последен път е подновила сертификата на съответния vhost. И съответно започва да бълва огромни и постоянно нарастващи количества съобщения за грешка с натрупването на все повече сайтове, които са с изтекъл сертификат според вътрешните убеждения на Virtualmin.

Когато за първи път забелязах проблема, не намерих готово решение за Virtualmin; стана ми ясно само, че трябва да спра да използвам certbot-auto, понеже той не се поддържа вече от Let’s Encrypt, а вместо него да използам certbot. Но как да стане тази промяна не ми беше ясно, понеже начинът на конструиране на терминални команди е заровен надълбоко в директорията usr/share/webmin, където се съхраняват PERL скриптовете, изпълняващи определени задачи. Затова започнах да отлагам търсенето на решение за момента, в който неудобството от изтриването на много email съобщения надмине прага ми на търпение.

Този праг се оказа някъде около 160 съобщения за времето ми за сън вчера. Когато това стана, започнах да се ровя в купата със спагети, която представлява директорията със скриптове на webmin, докато установих къде се намира проблемната команда.

Файлът, който трябва да се редактира, е /usr/share/webmin/webmin/letsencrypt-lib.pl (няма грешка – webmin се повтаря два пъти). В самото му начало скриптът прави няколко допускания относно възможното име на командата:

if ($config{'letsencrypt_cmd'}) {
        $letsencrypt_cmd = &has_command($config{'letsencrypt_cmd'});
        }
else {
        $letsencrypt_cmd = &has_command("letsencrypt-auto") ||
                           &has_command("letsencrypt") ||
                           &has_command("certbot-auto") ||
                           &has_command("certbot");
        }
 

Къде и как се инициализира $letsencrypt_cmd извън този скрипт, не знам. Може и самите автори на скрипта да не знаят, а просто да са заложили възможност за инициализиране на командата за достъп до Let’s Encrypt чрез конфигурационен параметър, с намерението да я ползват по-нататък. Във всеки случай, проблемът се решава, като се премахне този цял if/else блок и вместо него да се запише най-отдолу:

$letsencrypt_cmd = &has_command("certbot-auto") ;

Дебело подчертавам, че това е просташко решение, понеже не се съобразява с намерението на авторите, а го заобикаля. Напълно е възможно в някакъв момент то да доведе до грешки и бъгове от различен характер. Но… след 160 мейла за 5 часа наистина няма значение. Просто ще помоля четящите тази публикация да имат едно на ум. Както се казва, YMMV.

АКО НАПИСАНОТО ВИ ДОПАДА…

Абонирайте се за моя блог!

Ще получавате съобщение, когато публикувам нова статия. Можете да се отпишете по всяко време.

Email адрес

Подобни статии