Darmowy certyfikat SSL dla strony

Jak uzyskać darmowy certyfikat SSL na potrzeby strony internetowej, aby przeglądarka otwarła stronę przy pomocy szyfrowanego połączenia https, bez żadnych komunikatów o błędach.

Strona szyfrowana HTTPS

Spis treści

  1. Dlaczego https jest tak ważne?
  2. Certyfikaty generowane ręcznie
  3. Certyfikat SSL za darmo

Dlaczego https jest tak ważne?

Pewnie nikt się już nie zastanawia, dlaczego połączenie szyfrowane przy stronach WWW jest tak ważne w przypadku bankowości elektronicznej czy poczty e-mail. Natomiast mało kto się zastanawia, po co szyfrowanie w przypadku stron internetowych mniejszego kalibru. Jeśli korzystasz z otwartych hotspotów WiFi, w zasadzie każdy może podglądnąć co robisz w obrębie połączeń nieszyfrowanych. Jeśli strona jest serwowana przez https, ten problem nie występuje. Słaby argument? To może spróbujmy inaczej. Google od dawna traktuje sprawę szyfrowania stron poważnie. Pozycja strony w wynikach wyszukiwania może być bardzo istotna, a jak Google zacznie obniżać pozycje stron niedostępnych przez https, szyfrowanie będzie jeszcze ważniejsze niż obecnie. Dla niektórych firm bycie lub nie w wynikach największej wyszukiwarki, to również kwestia bycia lub niebycia jako firmy. To powinno przemówić do wszystkich :)

Certyfikaty generowane ręcznie

Oczywiście certyfikat można wygenerować ręcznie. Sprawdzi się to spokojnie w przypadku, gdy masz np. własny serwerek, na którym uruchamiasz kilka usług (poczta, www) i chcesz korzystać z tych usług szyfrując połączenia. Na takie potrzeby wystarczy certyfikat wygenerowany własnoręcznie i zaakceptowany w programie pocztowym i przeglądarce. Połączenie będzie szyfrowane, a komunikatów o certyfikatach można się pozbyć dodając te certyfikaty do zaufanych. Nie trudno znaleźć w Google informacji o tym, jak wygenerować taki certyfikat.

Niestety jeśli chcesz udostępniać taką stronę komuś innemu, dobrze byłoby mieć certyfikat, którego nie odrzuci przeglądarka. Jednym z niewielu serwisów, gdzie możesz dostać taki certyfikat za darmo jest www.startssl.com.

Certyfikat SSL za darmo

Obecnie znane na rynku są dwa rozwiązania umożliwiające uzyskanie darmowego certyfikatu: startssl.com oraz letsencrypt.org. Pierwsze pozwala wygenerować certyfikat ważny przez rok, drugie jedynie na 3 miesiące. Poniżej opiszę krótko obydwa przypadki

Let's Encrypt

Jak to działa?

Rozwiązanie drugie jest zupełnie innym podejściem. Firma wyszła z założenia, że użytkownik nie chce pamiętać o generowaniu certyfikatu, odświeżaniu cyklicznemu ani wgrywaniu na serwer www. Dlatego proces odnowienia certyfikatu i podmiany w serwerze WWW można w pełni zautomatyzować. Na stronie letsencrypt.org opisane jest co zrobić, jeśli możemy zainstalować i uruchamiać skrypt do odnawiania (dostępny najczęściej jako paczka systemowa). Rozwiązanie takie jest zalecane.
Część dostawców usług integruje się z rozwiązaniami Let's Encrypt, dzięki czemu od strony użytkownika nie jest wymagana żadna praca, poza zaznaczeniem odpowiednich opcji w panelu użytkownika. Przykładem takiego dostawcy jest UnixStorm – wystarczy wybrać w panelu opcję Utwórz darmowy certyfikat Let's Encrypt, nic więcej nie trzeba robić.
Tych wersji nie będę opisywał, bo na wspomnianej stronie są wyjaśnione raczej w wystarczającym stopniu.

Co zrobić w przypadku konta WWW bez shella

Jeśli korzystasz z taniej opcji konta WWW gdzie uruchamiasz swoją stronę, do shella nie masz dostępu, a provider nie umożliwia integracji z Let's Encrypt, dalej masz możliwość korzystania z tej opcji! Na stronie Let's Encrypt jest informacja o różnych innych programach i skryptach, które umożliwiają generowanie certyfikatu. Są opcje zarówno dla użytkowników Linuksa (nic dziwnego) oraz Windowsa.
Jedną z ciekawych opcji (bo wystarcza dowolne konto shell, niezależne od miejsca z którego serwujesz swoją stronę) jest skrypt bashowy acme.sh dostępny na githubie. Wystarczy jakikolwiek shell (np. Raspbian na Raspberry Pi), zbędny jest dostęp do roota, czy instalacja/kompilacja jakichkolwiek programów. Poniżej opiszę co trzeba zrobić, żeby takie rozwiązanie mogło zadziałać.

Pobieranie certyfikatu w trybie standalone

Zgodnie z instrukcją, należy pobrać skrypt i „zainstalować” lokalnie na koncie użytkownika

git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
./acme.sh --install
cd ~/.acme.sh

Skrypt zostanie zainstalowany, oraz dopisany do crona (żeby cyklicznie generował nowy certyfikat). Teraz trzeba mu jeszcze „powiedzieć”, żeby działał w trybie standalone i nie robił nic poza wygenerownaniem nowego certyfikatu. Teraz trzeba zarejestrować konto, uruchamiając polecenie

./acme.sh --register-account

Po poprawnej rejestracji, dostaniesz komunikat z kluczem thumbprint:

ACCOUNT_THUMBPRINT='YxtQ0bzO994gEJPeQsg94GvFJSzgcMxEfSc0ZwIP4qa'

Walidacja własności domeny

Aby potwierdzić że jesteś właścicielem domeny, musisz na każde zapytanie http pasujące do https://twojadomena.tld/.well-known/acme-challenge/<jakiś losowy string> zwrócić odpowiedni ciąg znaków. Jeśli masz dostępnego PHP oraz .htaccess, wystarczy stworzyć plik letsencrypt.php o wartości:

<?
 $parts = explode("/", $_SERVER['REQUEST_URI']);
 $arg = array_pop($parts);
 $ACCOUNT_THUMBPRINT='YxtQ0bzO994gEJPeQsg94GvFJSzgcMxEfSc0ZwIP4qa';
 echo "$arg.$ACCOUNT_THUMBPRINT";
?>

oraz w pliku .htaccess dodać odpowiedni wpis rewrite:

RewriteCond    %{REQUEST_URI}       ^/.well-known/acme-challenge/([-_a-zA-Z0-9]+)$
RewriteRule    ^(.*)$               /letsencrypt.php  [L]

Zwróć uwagę, że w skrypcie musisz umieścić zawartość ACCOUNT_THUMBPRINT otrzymaną przy rejestracji konta (patrz wyżej).

Pierwsze wygenerowanie certyfikatu

Jeśli PHP sprawdzający własność domeny działa poprawnie, możesz uruchomić skrypt do wygenerowania pierwszego certyfikatu

./acme.sh --stateless --issue -d twojadomena.tld

Jeśli wszystko poszło jak trzeba, certyfikat jest dostępny w katalogu ~/.acme.sh/twojadomena.tld, co zostało odpowiednio zakomunikowane. Jeśli coś poszło nie tak (np. nie działa poprawnie weryfikacja domeny), również zostaniesz o tym poinformowany.

Wgranie certyfikatu na serwer

Ciężko mi powiedzieć jak jest u innych providerów, mogę powiedzieć jak jest tu gdzie utrzymuję tą stronę, czyli w panelu konfiguracyjnym UnixStorm. Należy wejść w panelu w odpowiednie miejsce przy konfiguracji domeny (Certyfikaty SSL), zaznaczyć opcję Wklej wstępnie wygenerowany certyfikat i klucz, a następnie w polu tekstowym wkleić zawartość dwóch plików, którą uzyskasz uruchamiając

cat twojadomena.tld.key twojadomena.tld.cer

Zawartość powinna się zaczynać od tekstu -----BEGIN RSA PRIVATE KEY-----, a kończyć tekstem -----END CERTIFICATE-----.

StartSSL

Uwaga, to rozwiązanie jest obecnie problematyczne (od stycznia 2017)

Niestety ze względu na problemy z darmowymi certyfikatami od StartSSL m.in. w przeglądarkach Firefox oraz Chrome, rozwiązanie nie jest na chwilę obecną (marzec 2017) zalecane. Certyfikaty wydane przed 21 października 2016 działają poprawnie, późniejsze – nie. Miejmy nadzieję, że firma problem zostanie rozwiązany. Na dzień dzisiejszy lepiej spróbować rozwiązania Let's Encrypt opisanego poniżej.

Rejestracja w serwisie

Aby otrzymać certyfikat, musisz założyć w serwisie konto. Wystarczy wejść na stronę, kliknąć w Sign-up, wybrać kraj oraz podać adres e-mail. Warto oczywiście poczytać regulamin przed rejestracją.

Na podany adres przyjdzie e-mail z kodem weryfikacyjnym, który należy podać w formularzu rejestracji. Po zaakceptowaniu, w przeglądarce zostanie zainstalowany certyfikat użytkownika służący do logowania do Twojego konta. Warto pomyśleć od razu o zrobieniu kopii certyfikatu, na wypadek utraty profilu w przeglądarce. W Firefoksie należy przejść do opcji przeglądarki, w sekcji Zaawansowane wybieramy zakładkę Certyfikaty i klikamy w Wyświetl certyfikaty. W otwartym oknie, w zakładce Użytkownik należy wybrać certyfikat i kliknąć Kopia zapasowa. Jeśli korzystasz z Google Chrome, otwórz ustawienia i na samym dole kliknij Pokaż ustawienia zaawansowane. W sekcji HTTPS/SSL kliknij Zarządzaj certyfikatami, a następnie w zakładce Osobisty wybierz certyfikat i kliknij Eksportuj. W innych przeglądarkach znajdziesz go zapewne w podobnym miejscu.

Walidacja domeny

Oczywiście aby dostać certyfikat dla danej domeny, musisz potwierdzić że tą domeną zarządzasz. W przeciwnym razie każdy mógłby dostać certyfikat na dowolną domenę, co byłoby pewnym problemem jeśli chodzi o kwestie bezpieczeństwa.

Zatem po poprawnym zalogowaniu w serwisie, przejdź do zakładki Validations Wizard i wybierz Domain Validation. Podaj domenę (np. leniwy.tld – na potrzeby tego poradnika będę się posługiwał tą właśnie domeną) i wybierz jeden z adresów e-mail, do którego masz dostęp (jeśli zarządzasz domeną, powinieneś mieć działający adres postmaster, w tym przykładzie postmaster@leniwy.ltd). Po wprowadzeniu kodu z otrzymanego maila i poprawnej weryfikacji domeny, można przejść do generowania certyfikatu.

Generowanie certyfikatu

W zakładce Certificates Wizard wybierz z kolumny Free User opcję DV SSL Certificate (możesz poczytać o pozostałych opcjach jeśli interesują Cię certyfikaty płatne). Podaj domeny, dla których chcesz wystawić certyfikat. W przypadku certyfikatu dla strony, warto podać zarówno wersję z WWW jak i bez, czyli podajemy domeny leniwy.tld oraz www.leniwy.tld.

Do wygenerowania certyfikatu, będziesz potrzebować tzw. Certificate Signing Request. Możesz to (zgodnie z instrukcją na stronie) wygenerować w konsoli Linuksa poleceniem openssl req -newkey rsa:2048 -keyout yourname.key -out yourname.csr. Po wypełnieniu formularza przy generowaniu CSR, należy skopiować zawartość pliku yourname.csr i wkleić w odpowiednie pole na stronie. Po kliknięciu Submit otrzymasz komunikat Your certificate is issued, please click here to download the certificate. Oczywiście należy ściągnąć certyfikat na dysk, w celu późniejszego użycia.

Skąd wziąć klucz RSA

W pliku zip z certyfikatem otrzymasz kilka różnych postaci certyfikatu, na potrzeby różnych serwerów WWW. Niemniej jednak możesz potrzebować również klucza RSA do poprawnego działania https na stronie. Aby go uzyskać, możesz to zrobić w konsoli poleceniem openssl rsa -in yourname.key -out rsakey.pem. Alternatywnie, przejdź na stronie startssl.com do zakładki Tool Box i wybierz Decrypt Private Key, następnie wklej zawartość pliku yourname.key i podaj hasło.

Tak otrzymany klucz razem z certyfikatem otrzymanym w pliku zip stanowi parę potrzebną do poprawnego podawania strony WWW przy pomocy połączenia szyfrowanego.