Jak zdobyć darmowy certyfikat SSL?

Jest kilka sposobów na to by uzyskać darmowy certyfikat SSL (X509) który można podpiąć do naszego serwera i zacząć szyfrować transmisję pomiędzy klientem a serwerem, ale nie chodzi mi o certyfikaty self-signed czyli takie podpisane przez nas samych, dla których przeglądarka będzie wyświetlać przekreśloną kłódkę Nieprawidłowy certyfikat SSL, na myśli mam takie które są zaufane przeglądarkom i w pasku adresu będzie wyświetlać się zielona kłódka Prawidłowy certyfikat SSL ;-)

STARTSSL

Sposób pierwszy to skorzystanie z usług STARTSSL, po zalogowaniu się, zostaniemy poproszeni o zweryfikowanie domeny, wygenerowanie klucza prywatnego i możemy otrzymać certyfikat X509 dla naszej domeny + jednej dodatkowej (SNI), czyli np. dla varlog.pl + www.varlog.pl, warto wspomnieć, że firma nie pozwala na komercyjne wykorzystywanie darmowych certyfikatów. O ile otrzymanie certyfikatu jest darmowe to jego anulowanie już nie... Firma pobiera opłatę ~25$ za każdą operację "revoke". Ciekawostką jest, że gdy w 2014 Heartbleed ujrzał światło dzienne, to każdy decydował się na wymianę certyfikatu na nowy i przy okazji anulował poprzedni...  nawet w tej sytuacji firma zażądała opłaty za każde wycofanie certyfikatu ;-)

CloudFlare

Kolejna możliwość to skorzystanie z usługi CDN firmy CloudFlare, wiąże się to z przepięciem rekordów NS (rekordy NS domeny wskazują na serwery które zarządzają naszą domeną) oraz przepuszczeniem ruchu przez dodatkową infrastrukturę (Content Delivery Network). CloudFlare bardzo ciekawie podszedł do tematu i wykorzystał rozszerzenie SNI X509 v3 które pozwala na umieszczenie wielu różnych domen w polu SubjectAltName (SAN) w jednym certyfikacie i tym sposobem wiele osób współdzieli jeden certyfikat, co zapewne zoptymalizowało i zmniejszyło koszty generowania nowych certyfikatów.

SNI X509v3

Transmisja do naszego serwera wygląda wtedy tak, że połączenie jest szyfrowane od klienta do serwerów CloudFlare, a pomiędzy CloudFlare a nami może być szyfrowane lub nie, w zależności od wybranej opcji.

cloudflare ssl

Let's Encrypt!

Jest jeszcze inna opcja - Let's Encrypt, gdzie proces generowania/przedłużania/anulowania certyfikatu nie wymaga praktycznie żadnej wiedzy o samych certyfikatach x509, wystarczy uruchomić klienta i w zamian dostaniemy gotowy zestaw plików ;-)

Let's encrypt jest nowym darmowym i zautomatyzowanym Centrum Autoryzacyjnym (CA), czyli taką jednostką która może podpisywać certyfikaty, lub w skrócie czynić je zaufanymi dla naszych przeglądarek, klientów pocztowych, itd... Za Let's Encrypt stoi Internet Security Research Group w skład którego wchodzą przedstawiciele firm takich jak Akamai, Cisco, Mozilla, CoreOS, OVH...

Cały proces generowania certyfikatu został maksymalnie uproszczony i zautomatyzowany, nie ma potrzeby generowania CSR (Certificate Signing Request), wystarczy uruchomić jedne polecenie w systemie i gotowe. W praktyce odbywa się to tak, że przy uruchomienia agenta, generuje on zestaw kluczy prywatny i publiczny, następnie komunikuje się z Let's Encrypt i następuje weryfikacja domeny, agent lub nasz aktualnie uruchomiony webserver słucha na porcie 443, co pozwala serwerom Let's encrypt wykonać połączenie zwrotne do naszego hosta i rozpocząć proces weryfikacji polegający na wymianie pytań/odpowiedzi pomiędzy agentem/webserverem a serwerami Let's Encrypt.

Kiedy domena jest już zweryfikowana klient letsencrypt automatycznie generuje CSR i wysyła do serwerów Let's encrypt z prośbą o podpisanie, po chwili otrzymujemy świeży certyfikat podpisany przez Let's Encrypt Authority X1.

Poniżej pokażę jak można wygenerować certyfikat dla domeny, w moim przypadku jest to domena ssl.varlog.pl, która wskazuje na mój serwer dostępny ze świata, jest to część procesu weryfikacji domeny, ponieważ serwery Let's Encrypt bedą się do nas łączyć używając domeny a nie IP. Na moim serwerze nie działa żaden serwer WWW, tak więc rolę serwera będzie pełnił klient letsencrypt (--standalone)

Instalacja letsencrypt,

# git clone https://github.com/letsencrypt/letsencrypt
# cd letsencrypt
# ./letsencrypt-auto --help

Weryfikacja i wygenerowanie certyfikatu dla domeny ssl.varlog.pl

# ./letsencrypt-auto certonly --standalone -d ssl.varlog.pl

Zostaję zapytany o email oraz potwierdzam zapoznanie się z regulaminem, chwilę później pojawia się komunikat.

IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
e-mails sent to [email protected].
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/ssl.varlog.pl/fullchain.pem. Your cert will
expire on 2016-04-27. To obtain a new version of the certificate in
the future, simply run Let's Encrypt again.
- Your account credentials have been saved in your Let's Encrypt
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Let's
Encrypt so making regular backups of this folder is ideal.
- If you like Let's Encrypt, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

To wszystko... w katalogu /etc/letsencrypt/live/ssl.varlog.pl/ pojawiły się pliki:

# ls -la /etc/letsencrypt/live/ssl.varlog.pl/
total 8
drwxr-xr-x 2 root root 4096 Jan 28 21:34 .
drwx------ 3 root root 4096 Jan 28 21:34 ..
lrwxrwxrwx 1 root root 37 Jan 28 21:34 cert.pem -> ../../archive/ssl.varlog.pl/cert1.pem
lrwxrwxrwx 1 root root 38 Jan 28 21:34 chain.pem -> ../../archive/ssl.varlog.pl/chain1.pem
lrwxrwxrwx 1 root root 42 Jan 28 21:34 fullchain.pem -> ../../archive/ssl.varlog.pl/fullchain1.pem
lrwxrwxrwx 1 root root 40 Jan 28 21:34 privkey.pem -> ../../archive/ssl.varlog.pl/privkey1.pem

Czyli mam pełen zestaw plików potrzebnych do podpięcia do serwera WWW lub serwera pocztowego. Przykładowo dla nginx konfiguracja SSL może wyglądać tak,

Po wejściu z przeglądarki na https://ssl.varlog.pl, powinniśmy zobaczyć, że nasze połączenie jest szyfrowane z użyciem TLS 1.2 i co ważne, certyfikat jest zaufany.

ssl varlog pl certificate

W przypadku jeśli mamy już działający serwer WWW który słucha na porcie 443, można uruchomić klienta i wskazać mu działający i widoczny ze świata document root, wtedy klient będzie komunikował się z serwerami Let's Encrypt poprzez wymianę plików bezpośrednio z katalogu document root.

# ./letsencrypt-auto certonly --webroot -w /var/www/ssl.varlog.pl/ -d ssl.varlog.pl

W przypadku jeśli chcemy wygenerować certyfikat obsługujący kilka domen (SNI), można użyć przełącznika -d wiele razy

# ./letsencrypt-auto certonly --webroot -w /var/www/ssl.varlog.pl/ -d ssl.varlog.pl -d www.ssl.varlog.pl

Certyfikaty generowane są na 3 miesiące, ale proces ich odnowienia można zautomatyzować skryptem ;-) Po więcej opcji i możliwości letsencrypt odsyłam do dokumentacji projektu.