Let’s encrypt od dawna oferuje darmowe certyfikaty.

Jeszcze niedawno można było sobie wygenerować certyfikat na rok. Odnowienie tego certyfikatu wymagało tylko uruchomienia jednego polecenia. Niestety było to nadużywane więc teraz trzeba odnawiać certyfikat częściej - jest ważny tylko trzy miesiące.

Ręczne wygenerowanie certyfikatu LetEncrypt

Wygenerowanie nowego certyfikatu ręcznie, z użyciem autoryzacji jego generowania za pomoca wpisu TXT w DNS można zrealizować narzędziem takim jak Certbot.

DOMAIN=adres.domenowy
certbot certonly --manual --preferred-challenges dns -d $DOMAIN -d *.$DOMAIN --agree-tos --manual-public-ip-logging-ok  --server https://acme-v02.api.letsencrypt.org/directory --register-unsafely-without-email --rsa-key-size 4096

Powyższe działa krok po kroku. Jest czas, by dodać (wyedytować) dwa odpowiednie wpisy TXT w DNS, z subdomenowym adresem zaczynającym się od _acme-challenge, poczekać aż się rozpropaguje i wtedy przejść z generowaniem do kolejnego kroku. Taki certyfikat nie może być aktualizowany automatycznie.

Czy wpisy TXT zostały już dodane lub zaktualizwane można prosto sprawdzić online.

Z linii poleceń:

dig -t txt _acme-challenge.$DOMAIN | grep 'IN TXT'

Niestety Let’s encrypt nie chciało zweryfikować moich certyfikatów za pomocą odpowiedniego pliku dostępnego po http - do sprawdzenia w przyszłości.

W konfiguracji Apache trzeba mieć trzy linijki, które w przypadku certyfikatu wygenerowanego ręcznie, trzeba też samodzielnie wpisać w odpowiedniego VirtualHosta.

SSLCertificateFile /etc/letsencrypt/live/adres.domenowy/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/adres.domenowy/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

Na koniec trzeba zrestartować Apache aby serwował zaktualizowaną wersję certyfikatu.

Sprawdzenie certyfikatu z CLI

Na serwerze:

openssl x509 -dates -noout -in cert.pem

Wypuszczonego po sieci:

DOM="www.nixcraft.com"
PORT="443"
openssl s_client -servername $DOM -connect $DOM:$PORT \
| openssl x509 -noout -dates

Aktualizacja certyfikatu

Serwer na którym mam stronę stoi za proxy i firewallem nad którymi nie mam kontroli. Dlatego podczas aktualizacji muszę korzystać z metody na zmianę wpisu TXT w DNS.

certbot certonly --manual --preferred-challenges dns -d "*.makowski.edu.pl"

Po uruchomieniu skrypt wyświetla wartość - klucz, który trzeba wpisać w DNS. Gdy wartość jest dostępna z zewnątrz (sprawdzamy Googlem albo dig), można klepnąć enter.