letsencrypt na Slackware

Posted on Mon 01 April 2019 in Linux, Wirtualizacja

Generowanie certyfikatów LetsEncrypt na dystrybucji Slackware nie jest możliwe za pomocą domyślnego skryptu urzędu czyli Certbota.

Z pomocą przychodzi napisany, zdaje się w Bashu, skrypt dehydrated. Poniżej opisuję jego jak najszybsze i bezproblemowe (ha!) użycie.

W niniejszym artykule pokazuję jak generować certyfikaty dla dwóch serwerów, jeden z nich to serwer www, drugi to serwer pocztowy.

Serwer www to domeny: test.zz i www.test.zz,
serwer poczty to domena: mail.test.zz.

Problem w tym, że oba serwery to dwie, oddzielne (wirtualne) maszyny, posiadające karty sieciowe skonfigurowane w sieci lokalnej:

test.zz i www.test.zz ma adres 192.168.7.80
mail.test.zz ma adres 192.168.7.25

Ruch na obie maszyny przekierowany jest na firewallu z adresem publicznym w taki sposób, że port 80 na łączu WAN wskazuje na 192.168.7.80:80, a porty protokołów pocztowych (IMAP, POP, SMTP, itp.) wskazują na odpowiednie porty maszyny 192.168.7.25.

Maszyną na której generuję certyfikaty jest: mail.test.zz czyli 192.168.7.25.

Instalacja polega na pobraniu archiwum, rozpakowaniu i skopiowaniu skryptu dehydrated np. do /usr/local/bin.

Tworzę katalog z konfiguracją skryptu: /etc/dehydrated i kopiuję do niego 3 pliki konfiguracyjne:

mkdir /etc/dehydrated/
cp ./docs/examples/* /etc/dehydrated/.
ls -1 /etc/dehydrated/
config
domains.txt
hook.sh*

W pliku /etc/dehydrated/config mam następujące linie:

IP_VERSION=4
CA="https://acme-staging.api.letsencrypt.org/directory"
BASEDIR=/etc/dehydrated
WELLKNOWN="/var/www/dehydrated"
HOOK=${BASEDIR}/hook.sh
CONTACT_EMAIL=admin@test.zz
Uwaga na linię zaczynającą się od "CA" w przykładzie powyżej, ustawiony tam URL służy do testowania konfiguracji i musi być zmieniony w przypadku końcowej konfiguracji.
Ścieżka "WELLKNOWN" jest bardzo ważna, w tym folderze dehydrated tworzy plik, do którego potem sięga za pomocą protokołu HTTP - umożliwia to potwierdzenie, że skrypt jest uruchamiany przez osobę mającą dostęp do serwera www.

Plik /etc/dehydrated/domains.txt zawiera następujące wpisy:

test.zz www.test.zz
mail.test.zz

W pliku /etc/dehydrated/hook.sh dodałem tylko kilka linii. Muszą się one znaleźć w sekcji: deploy_ocsp() { } (pomiędzy nawiasami klamrowymi):

# przeladuj Dovecot i Postfix
if [ "$DOMAIN" = "mail.test.zz" ]
then
    /etc/rc.d/rc.postfix restart
    /etc/rc.d/rc.dovecot restart
fi
Jest przeładowanie serwera poczty po zaktualizowaniu certyfikatu.
Oczywiście, na serwerze www ta sekcja powinna mieć następujący wygląd:
# reload Apache
if [ "$DOMAIN" = "test.zz" ]
then
    /etc/rc.d/rc.httpd restart
fi
W tym miejscu jeśli serwer www działa na tej samej maszynie co poczta wystarczy stworzyć odpowiedni folder i dodać odpowiednią konfigurację.
Jak pisałem na początku, serwer www działa u mnie na innej (wirtualnej) maszynie o adresie IP: 192.168.7.80.

Po zalogowaniu się na tym serwerze, który działa pod Debianem, jako root tworzę folder /var/www/dehydrated. Do konfiguracji serwera Apache dodaję nowy plik: /etc/apache2/conf-available/dehydrated.conf z taką zawartością:

Alias /.well-known/acme-challenge /var/www/dehydrated
<Directory /var/www/dehydrated>
        Options None
        AllowOverride None
        # Apache 2.x
        <IfModule !mod_authz_core.c>
                Order allow,deny
                Allow from all
        </IfModule>
        # Apache 2.4
        <IfModule mod_authz_core.c>
                Require all granted
        </IfModule>
</Directory>

Aktywuję i przeładowuję konfigurację:

a2enconf dehydrated
systemctl reload apache2

Testuję czy konfiguracja działa:

echo "Jak widać konfiguracja działa. Ponie" > /var/www/dehydrated/test.txt
curl http://mail.test.zz/.well-known/acme-challenge/test.txt

waż folder znajduje się na serwerze www, a ja instaluję certyfikat na serwerze pocztowym, muszę mieć dostęp do tego folderu z serwera poczty. I to dostęp z możliwością zapisu.

Na serwerze www eksportuję folder /var/www/dehydrated po NFS-ie. To jest Debian i wygląda to tak:

apt install nfs-kernel-server portmap
perl -pi -e 's/^OPTIONS/#OPTIONS/' /etc/default/portmap
echo "portmap: 192.168.7." >> /etc/hosts.allow
echo "/var/www/dehydrated 192.168.7.0/255.255.255.0(rw,no_root_squash,subtree_check)" >> /etc/exports
exportfs -a
systemctl reload nfs-server.service

Wracam na serwer pocztowy. To jest Slakcware więc muszę uruchomić, nie używaną dotąd usługę RPC:

chmod +x /etc/rc.d/rc.rpc
/etc/rc.d/rc.rpc start

Tworzę folder /var/www/dehydrated i montuję jego odpowiednik z serwera www:

mkdir /var/www/dehydrated
mount 192.168.7.80:/var/www/dehydrated /var/www/dehydrated/
cat /var/www/dehydrated

waż na serwerze poczty wszystko już właściwie zrobione to wydaję polecenie utworzenia certyfikatów:

dehydrated -c

Wszystko jest OK, muszę jeszcze zakomentować linię zaczynającą się od "CA" w pliku /etc/dehydrated/config i powtórzyć ostatnią komendę.

Certyfikaty pojawiają się w folderach /etc/dehydrated/certs/mail.test.zz oraz /etc/dehydrated/certs/test.zz.

Ich przypisanie do konfiguracji Postfixa i Dovecote'a to w przypadku pierwszego dopisanie linii do pliku /etc/postfix/main.cf:

smtpd_tls_cert_file = /etc/dehydrated/certs/mail.test.zz/fullchain.pem

a dla Dovecote'a, do pliku /etc/dovecot/conf.d/10-ssl.conf:

ssl_cert = </etc/dehydrated/certs/mail.test.zz/fullchain.pem

I zrestartowanie obu usług (to jest Slackware):

/etc/rc.d/rc.postfix restart
/etc/rc.d/rc.dovecot restart

W folderze /etc/dehydrated/certs/test.zz pojawił się również certyfikat dla serwera www. Wystarczy go przekopiować na ten serwer i dopisać do odpowiedniej konfiguracji Apache2. Nie będę tu tego opisywał bo nie leży to w temacie niniejszego wpisu.

Dziękuję za uwagę i pozdrawiam,

paczor