_____ _   _ _    _    ___      _
 / ____| \ | | |  | |  / / |    (_)
| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
 \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\

Generowanie certyfikatu SSL Let's Encrypt typu Wildcard

Pośród materiałów odnośnie GNU/Linux znajduje się też taki nt. generowania certyfikatu SSL podpisanego przez samego siebie. W tym materiale wykorzystamy ogólnodostępny urząd certyfikacji - usługę Let's Encrypt. Nie wiem jaka jest geneza tej usługi, ale śmiem przypuszczać że ideą, która za tym stoi jest umożliwienie każdemu posiadaczowi domeny wygenerowanie certyfikatu SSL, w celu zabezpiecznia transmisji pomiędzy jego serwerami a klientami korzystającymi z usług świadczonych przez ten serwer. Cel sczytny, ale każdy kij ma dwa końce. Do momentu upowszechnienia się Let's Encrypt, "zielona kłódka" oznaczała serwer godny zaufania, ponieważ tylko komercyjne certyfikaty były akceptowane przez przeglądarkę bez zastrzeżeń. Teraz tylko tyle że "kłódka" jest zielona, nie może oznaczać że serwer jest wiarygodny, teraz liczy się głównie wystawca, jednak aby zobaczyć kto jest wystawcą danego certyfikatu należy kliknąć w tą "kłódkę" i będziemy mieli taki napis jak "Connection secure" lub "Połączenie zabezpieczone" kilkamy w tą strzałeczkę po prawej stronie i powinno się wyświetlić "Verified by: " lub "Zweryfikowano przez: " i nazwa wystawcy. Oczywiście nie możemy demonizować Let's Encrypt bo naprawdę jest to coś dobrego, chciałbym tutaj tylko uczulić na to że jeśli logujemy się do banku to jeśli już weryfikujemy czy połączenie jest bezpieczne, to sprawdźmy wystawcę, na 99,9% na pewno nie powinno być nim Let's Encrypt. Chyba że to jakiś bank dla Januszy, to warto zmienić bank wtedy. Tak samo jest kontami na socjalacha czy skrzynkach mailowych. Duże korporacje mają swoje wewnętrzne urzędy, które dbają o ich certyfikaty. Obecnie intruzi, którzy stosują phishing, często wykorzystują Let's Encrypt aby jeszcze bardzie uwiarygodnić strony do wyłudzania danych. Nie mniej jednak każdy może mieć taki certyfikat wystarczy posiadanie domeny. Certyfikat, który będzie akceptowany w 100% przez przeglądarkę. I tutaj dowiemy się jak go uzyskać.

Pierwszą czynnością jest zdobycie oprogramowania, które umożliwi nam uruchomienie procesu generowania certyfikatu przez Let's Encrypt. W zależności od systemu, czy jest Raspbian/RasPiOS pownieważ chcemy uzyskać nasz certyfikat na Raspberry Pi, co może być ciekawym pomysłem o ile powstrzymamy się z wykorzystaniem karty z Raspberry do czegoś innego, kiedy będzie nam ona potrzebna. Nie jest to niezbędne, ale lepiej jest zachować system na którym uzyskało się certyfikat poźniej będzie go łatwiej odnowić, certyfikaty Let's Encrypt ważne są tylko przez 3 miesiące, oczywiście odnawiać będziemy tylko certyfikaty wystawione manualnie. Zatem dla Raspbiana powiniśmy wydać poniższe polecenia.

$ sudo apt update
$ sudo apt install certbot

Jeśli korzystamy z Ubuntu to należy na początku sprawdzić powyższe polecenia, a jeśli ono niezadziała, to należy spróbować tych poleceń poniżej.

$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt update
$ sudo apt install certbot

Jeśli wykorzystujemy inną dystrybucje niż powyższe to spóbujmy zainstalować pakiet certbot za pomocą menedżera pakietów używanej przez nasz dystrybucji. Gdy na nawet to się nie powiedzie, to wtenczas możemy odpytać naszą wyszukiwarkę "How to install certbot on", po słowie "on" podajemy nazwę naszej dystrybucji.

Po zainstalowaniu certbot-a w naszym systemie, zalogujmy się do konfiguracji domeny u swojego operatora, żeby uwierzytelnić się (pokazać że domena należy do nas) będziemy musieli dodać dwa rekordy DNS. Kiedy już się zalogujemy to wydajemy poniższe polecenie, uruchomi ono cały proces uzyskiwania certyfikatu.

$ sudo certbot certonly --manual -d *.<nazwa_domeny> -d <nazwa_domeny> --agree-tos --no-bootstrap --manual-public-ip-logging-ok \
--preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

Jeśli kopiujemy to polecenie pamiętajmy o tym że należy podać w polach <nazwa_domeny> nazwę swojej domeny. Po wydaniu tego polecenie zostaniemy zapytani o adres email. Polecam podać prawdziwą skrzynkę ponieważ na nią przyjdzie wiadomość o wygasającym certyfikacie.

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): <adres_email>

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Po podaniu adresu email zostaniemy zapytani o to czy chcemy się zapisać tak jak by do newsletter-a EFF.

Would you be willing to share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to
send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital
freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:

Po udzieleniu odpowiedzi na powyższe pytanie, rozpocznie się uzyskiwanie certyfikatów. Aby uzyskać certyfikaty musimy wprowadzić jedno lub dwukrotnie nowy rekord typu TXT w konfiguracji naszej domeny. Rekord powinień mieć nazwę _acme-challenge.<nazwa_domeny>, gdzie za nazwa_domeny podstawiamy nazwę naszej domeny wartością tego rekordu będzie ciąg znaków wyświetlony tak jak na poniższym komunikacie.

Please deploy a DNS TXT record under the name
_acme-challenge.<nazwa_domeny> with the following value:

[Tutaj pojawi się tekst challengu]

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

W powyższym polu [Tutaj pojawi się tekst challengu] pojawi się ciąg znaków jaki należy umieścić w polu wartości rekordu. Zwróćmy uwagę na przedostatnią linijkę komunikatu Before continuing, verify the record is deployed. (ang. Przed kontynuowaniem, należy upewnić się że rekord jest wdrożony). Aby to zrobić wydajmy w wierszu polecenia (terminalu) następujące polecenie.

$ dig -t TXT _acme-challenge.<nazwa_domeny>

Poniżej znajduje się odpowiedź, dla przykładu wylisowałem rekordy tego typu dla mojej domeny.

; <<>> DiG 9.16.12 <<>> -t TXT _acme-challenge.morketsmerke.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37679
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_acme-challenge.morketsmerke.net. IN   TXT

;; ANSWER SECTION:
_acme-challenge.morketsmerke.net. 3600 IN TXT   "G6XrpiukUNExZy_5iOJgaqqA4oxQiDJlhW0MIkXs82s"
_acme-challenge.morketsmerke.net. 3600 IN TXT   "Z2ibO22FCPjxOQBTYuMz4H_S3UyRU8c2SJO4zsQ9ifY"

;; Query time: 600 msec
;; SERVER: 192.168.8.1#53(192.168.8.1)
;; WHEN: wto mar 02 19:08:33 CET 2021
;; MSG SIZE  rcvd: 173

Na podstawie danych zwróconych przez polecenie, możemy ustalić czy nasz rekord jest już osiągalny w Internecie, może się zdarzyć że długo nie będziemy mogli uzyskać odpowiedzi, niestety będziemy musieli się uzbroić w cierpliwość. Kiedy uzyskamy oczekiwany rezultat, wtedy dopiero będziemy mogli nacisnąć enter.

Jest wielce prawdopobne że po zatwierdzeniu jednego challenge-u, niezbędny będzie drugi. Procedura wygląda identycznie. Tutaj jednak z sprawdzeniem wdrożenia rekordu może być problem ponieważ serwery DNS, utrzymują ostatnie wyniki zapytań w pamięci podręczej. Najlepiej jest użyć do tego drugie komputera wraz z drugim łączem internetowym np. z komórki.

Po udanym procesie zostaniem wyświetlone dłuższe podsumowanie zawierające napis "Congratulations!" świadczący o pomyślnym wykonaniu zadania w nim również będą zawarte ścieżki na których znajdują się certyfikaty, warto przeszukać katalog /etc/letsencrypt, ponieważ te ścieżki wskazują na dowiazania symboliczne, to prawdziwe pliki certyfikatu (plik certyfikatu oraz klucz prywatny) mogą nam się przydać o ile bedziemy przenościć certyfikat na inne serwery.

Istnieje możliwość wygenerowania certyfikatu dla jednego hosta. Cały proces wygląda analogicznie, różni się tylko polecenie, które z resztą znajduje się poniżej.

$ sudo certbot certonly --manual -d <nazwa_hosta>.<nazwa_domeny> -d <nazwa_domeny> --agree-tos --no-bootstrap --manual-public-ip-logging-ok \
--preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

Jedyną róznicą jest podanie nazwy hosta jak wartości przełącznika -d, zamiast nazwy wieloznacznej (*.<nazwa_domeny>).