W dzisiejszym artykule pokażę Wam, jak w prosty i łatwy sposób wygenerować swój własny darmowy certyfikat SSL dla strony internetowej. Jak wiemy w dzisiejszych czasach niemal wszystkie przeglądarki oznaczają dość jednoznacznie strony internetowe, które nie posiadają certyfikatu SSL.

Dzisiaj jest to trend, który wchodzi na stałe. Wszystkie strony powinny być zabezpieczone bezpiecznym certyfikatem SSL. Niezależnie od tego czy wydaje nam się, że przetwarzamy dane czy nie (cookies to także dane) strona internetowa powinna mieć certyfikat.

Wstęp

Jeszcze jakiś czas temu mieliśmy na rynku zagranicznego gracza StartSSL, który wystawiał każdemu zainteresowanemu bezpłatnie pełnoprawny certyfikat SSL, który można było umieścić na stronie www i korzystać tak jak z drogiego, płatnego certyfikatu.

Niestety czasy StartSSL po kilku wpadkach minęły bezpowrotnie, ale rynek IT nie lubi dziury, więc szybko pojawiła się nowa organizacja, która przejęła schedę. StartSSL miał jeszcze jedną ciekawą funkcję. Można było za jego pomocą wystawić sobie certyfikat do szyfrowania poczty. Tego Let’s Encrypt nie potrafi, ale kto wie. Może w przyszłości i taka opcja się pojawi.

Póki co Let’s Encrypt oferuje nam całkowicie zautomatyzowany proces generowania certyfikatów SSL, w tym od jakiegoś czasu także certyfikatów wildcard. To ogromny skok, bowiem StartSSL nie był do końca automatyczny i na taki certyfikat czekało się zwykle kilka godzin. Let’s Encrypt robi to w pełni automatycznie.

Wymaga to co prawda zainstalowania agenta na serwerze, ale jest to lekka pythonowa aplikacja. Co ciekawe posiada także funkcję automatycznego odnawiania certyfikatu, więc nie musimy pamiętać o tym, że certyfikat nam wygaśnie. Wystarczy tylko odpowiednia konfiguracja aplikacji na serwerze, dodanie zadania do crona i z głowy. Let’s Encrypt dodatkowo także wymaga podania e-maila, ale nie wysyła on  (jeszcze) żadnych niechcianych reklam. E-mail może być przydatny jeśli nie odnowimy certyfikatu z wyprzedzeniem lub nie ustawiliśmy autoodnawiania. Firma nam o tym przypomni stosownymi komunikatami:

Zalety Let’s Encrypt:

  • zupełnie bezpłatny,
  • nie wymaga dokumentów, wszystko robimy online,
  • możliwość wygenerowania certyfikatu typu wildcard,
  • bezpieczeństwo na poziomie komercyjnych certyfikatów,
  • w pełni automatyczny proces,
  • certyfikat jest uznawany przez centra autoryzacji,
  • podnosimy bezpieczeństwo

Wiemy już czym jest Let’s Encrypt, wiemy już jakie ma zalety, ale na pewno niektórzy zastanawiają się (zwykle Ci co nie mieli z tym styczności) czy taki bezpłatny certyfikat jest bezpieczny? Otóż, technologicznie jest to certyfikat pełnoprawny, odpowiadający komercyjnym rozwiązaniom. Różnica polega na tym, że nie otrzymujemy gwarancji finansowej na złamanie certyfikatu. Dawniej StartSSL w darmowej wersji oferował symboliczną sumę 10$ w sytuacji złamania go przez hakerów, jednak nigdy nie słyszałem, aby taki certyfikat został złamany. Z Let’s Encryptem jest podobnie. Nie słychać by do tej pory został złamany lub skompromitowany.

Spokojnie można nim zabezpieczać komunikację nawet na produkcyjnych środowiskach – jest w pełni bezpieczny. Ja używam go w ponad setce projektów komercyjnych i jako osoba z dużym doświadczeniem w bezpieczeństwie uważam go za bezpieczny.

Przygotowanie do instalacji

Let’s Encrypta możemy zainstalować w systemie np. Debian z repozytorium i mieć gotowca. Zalecałbym jednak zainstalowanie tej aplikacji z repozytorium Let’s Encrypta, gdyż ta aplikacja potrafi nieco więcej niż stabilny dinozaur w repozytorium Debiana. Podobnie jest w CentOSie, więc nie będziemy rozdrabniać się na poszczególne systemy.

Aktualizacja systemu:

apt-get update

apt-get upgrade

Instalacja agenta

Let’s Encrypt do poprawnego działania wymaga zainstalowania agenta o nazwie Certbot. To właśnie dzięki niemu generujemy certyfikaty lub je odnawiamy.

wget https://dl.eff.org/certbot-auto

sudo mv certbot-auto /usr/local/bin/certbot-auto

sudo chown root /usr/local/bin/certbot-auto

sudo chmod 0755 /usr/local/bin/certbot-auto

Uruchomienie aplikacji:

certbot-auto

Aplikacja zapyta nas o instalację niezbędnych pakietów dla systemu. Głównie będą to pythonowe libki, bo jak wspomniałem aplikacja jest napisana w Pythonie.

Akceptujemy wszystko.

Sprawdzamy wersję:

root@debian-4gb-hel1-1:~# certbot-auto –version

certbot 1.6.0

W chwili pisania artykułu wyszła najnowsza wersja oznaczona numerkiem 1.6.0.

Generowanie certyfikatu

Aby wygenerować certyfikat, korzystamy z linii poleceń w systemie Linux.

certbot certonly –webroot -w /var/www/html -d test5.hosterion.pl

W odpowiedzi otrzymamy informację o poprawnym wystawieniu certyfikatu oraz o ścieżce, gdzie został on wrzucony. Tą ścieżkę podpinamy w serwerze www.

Saving debug log to /var/log/letsencrypt/letsencrypt.log

Plugins selected: Authenticator webroot, Installer None

Obtaining a new certificate

Performing the following challenges:

http-01 challenge for test5.hosterion.pl

Using the webroot path /var/www/html for all unmatched domains.

Waiting for verification…

Cleaning up challenges

Subscribe to the EFF mailing list (email: qtop@wir.pl).

IMPORTANT NOTES:

 – Congratulations! Your certificate and chain have been saved at:

   /etc/letsencrypt/live/test5.hosterion.pl/fullchain.pem

   Your key file has been saved at:

   /etc/letsencrypt/live/test5.hosterion.pl/privkey.pem

   Your cert will expire on 2020-10-07. To obtain a new or tweaked

   version of this certificate in the future, simply run certbot-auto

   again. To non-interactively renew *all* of your certificates, run

   „certbot-auto renew”

 – If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let’s Encrypt:   https://letsencrypt.org/donate

   Donating to EFF:                            https://eff.org/donate-le

Po załadowaniu certyfikatu do serwera www i przeładowaniu powinniśmy móc już korzystać z naszej strony po bezpiecznym protokole SSL.

Automatyzacja

Certyfikat mamy wystawiony, ale certyfikaty te są ważne maksymalnie 3 miesiące od dnia wystawienia. Czy będziemy o tym pamiętać? A co jeśli e-mail z informacją wpadnie do spamu lub zostanie odrzucony?

Aby zapobiec sytuacji, w której certyfikat nam wygaśnie możemy zastosować jednolinijkowca, który przegeneruje nam certyfikat ponownie przed końcem (na miesiąc przed końcem) i przeładuje za nas serwer www.

Poniższą linijkę warto wrzucić do crona:

45 01 * * * perl -e 'sleep int(rand(3600))’ && /usr/local/bin/certbot-auto renew –renew-hook „systemctl reload nginx” -q >> /var/log/certbot-renew.log 2>&1

Dzięki temu, nie zapomnimy na pewno o wygasającym certyfikacie, a system dodatkowo zaloguje nam wszystko co się dzieje.