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.
Spis treści
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.