in Daj Się Poznać 2017, Lifehacki

Manualne dodanie certyfikatu SSL od Let’s Encrypt bez roota na serwerze

Zgodnie z najnowszymi trendami chciałem dodać do swojego bloga certyfikat SSL. Na początku rozważałem zakup oficjalnego certyfikatu od swojego dostawcy, ale postawiłem sobie wyzwanie, żeby uzyskać go bezpłatnie. Trafiłem na kilka możliwości, z których najbardziej znane są Let’s Encrypt oraz StartSSL. Najpierw sprawdziłem StartSSL, ponieważ praktycznie wszystkie kroki procedury przechodzi się tam przez przeglądarkę, jednak mimo poprawnej weryfikacji nie udało mi się uzyskać oceny A wg SSL Labs (najwyższą jest A+). Dlatego spróbowałem swoich sił z Let’s Encrypt – gwarantują certyfikat ważny przez 90 dni (w przeciwieństwie do 3 lat od StartSSL), który trzeba odnawiać za pomocą odpowiedniego narzędzia (np. certbot) postawionego na serwerze. W założeniu tak częste odnawianie certyfikatu ma zwiększać bezpieczeństwo połączenia.

Po drodze napotkałem na kilka problemów. Najpoważniejszym był fakt, że Nazwa.pl nie wspiera oficjalnie certyfikatów od Let’s Encrypt i w moim pakiecie nie umożliwia uruchomienia skryptów z dostępem do roota (podczas instalacji wymagany jest root do pobrania i zainstalowania wszystkich zależności). Dlatego certyfikat musiałem wygenerować na swoim własnym komputerze, a dopiero potem wkleić go panelu administracyjnego strony.

Użyłem do tego celu Ubuntu uruchomionego w dockerze, a cała procedura okazała się całkiem przystępna (choć zdecydowanie mniej od automatycznej generacji i weryfikacji).

Uruchomiamy czystą instancję dockera w trybie odpiętym (-d) i wchodzimy do basha na konto root:

docker run -d ubuntu /sbin/init
docker ps
> CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
> 0a032a5d30bb        ubuntu              "/sbin/init"        46 seconds ago      Up 44 seconds                           loving_archimedes
docker exec -it loving_archimedes /bin/bash
> root@0a032a5d30bb:/#

Czysta instancja nie posiada zainstalowanego gita, więc instalujemy go i klonujemy repozytorium letsencrypt:

apt-get update
apt-get install git
mkdir /home/test; cd /home/test
git clone 'https://github.com/letsencrypt/letsencrypt'

Następnie możemy przejść do wygenerowania certyfikatu dla naszej strony. Skrypt wymusi instalację niezbędnych zależności i nie powinno to zająć dłużej niż kilka minut (oczywiście po -d należy wpisać własną domenę, gdzie pierwsza z nich jest domeną wiodącą).

cd letsencrypt/
./certbot-auto certonly -a manual --rsa-key-size 4096 -d dominikroszkowski.pl -d www.dominikroszkowski.pl

Podczas wykonywania będziemy zmuszeni zaakceptować pobranie >200 MB paczek. Sama generacja certyfikatu będzie wymagała od nas:

  • podania adresu e-mail,
  • wyrażenia zgody na warunki użytkowania
  • wyrażenia zgody na przechowywanie danych o nas przez Let’s Encrypt,
  • utworzenia na serwerze naszej strony pliku weryfikacyjnego.

Po wszystkim powinien wyświetlić się mniej więcej taki komunikat:

Make sure your web server displays the following content at
http://dominikroszkowski.pl/.well-known/acme-challenge/9U9wPdJ8z....OO1WD_kA before continuing:

9U9wPdJ8zlRyH7A3BckxOFyVr_7K6V.....l7JorGYPBDnItItiZS-uzvhrQiWq58x5Gw84

Tworzymy odpowiedni plik w katalogu http://dominikroszkowski.pl/.well-known/acme-challenge/ (np. za pomocą klienta FTP), naciskamy enter i czekamy na zakończenie weryfikacji. Wynikiem działania będą pliki certyfikatu i klucza prywatnego, które możemy skopiować ręcznie z katalogu /etc/letsencrypt/live/dominikroszkowski.pl:

  • cert.pem
  • chain.pem
  • fullchain.pem
  • privkey.pem

W przypadku serwera na Nazwa.pl interesują nas pliki fullchain.pem (certyfikat) oraz privkey.pem (klucz prywatny). Ze względu na problemy z kopiowaniem plików z dockera skopiowałem je z konsoli i wkleiłem do panelu administracyjnego w active.admin.

cat /etc/letsencrypt/live/dominikroszkowski.pl/fullchain.pem
cat /etc/letsencrypt/live/dominikroszkowski.pl/privkey.pem

Po kilku minutach sprawdziłem, czy certyfikat jest wykrywany przez SSL Labs i zmieniłem ustawienia WordPressa dodając ‘s’ do protokołu http.

http z s

Na początku Chrome nie chciał uznać bezpieczeństwa mojej witryny, ale po sprawdzeniu jej za pomocą narzędzia whynopadlock.com odkryłem, że kilka grafik miało swoje źródła w formie rozpoczynającej się od http://. Po podmianie linków wreszcie ucieszył mnie widok zielonej kłódki na pasku adresu.

Plan na przyszłość: zautomatyzować proces z poziomu Raspberry Pi lub skryptu na Windowsie.

PS Warto jeszcze wymusić przekierowanie odwiedzających z http na https za pomocą wpisu w .htaccess. Na serwerze Apache pomiędzy <IfModule mod_rewrite.c> należy dodać:

<IfModule mod_rewrite.c>
RewriteEngine On
(...)
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://dominikroszkowski.pl/$1 [R,L]
</IfModule>
  • Dariusz

    Cześć próbuje zrobić podobnie na mojej stronie jednak wyskakuję mi taki błąd:
    Domain: xxxx
    Type: unauthorized
    Detail: Invalid response from
    http://xxxxx.pl/.well-known/acme-challenge/udeb___mojkod___ tTkGkXno:

    Nie wiem czy wszystko robie dobrze utworzyłem katalogi .well-known/acme-challenge/plik o tej nazwie, która dostałem

    • Dominik

      Hej, tworzyłeś katalog przez klienta ftp?
      Jeśli tak, to do podanego katalogu domena/well-known/acme-challenge/ wgraj plik bez rozszerzenia o nazwie: 9U9wPdJ8z….OO1WD_kA. Jego zawartością (np. wpisaną w notepadzie) powinien być ciąg znaków analogiczny do tego z 4. linijki (po before continuing:). Na zrobienie tego kroku jest jakiś ograniczony czas, więc warto mieć przygotowane wcześniej połączenie z serwerem i jakiś gotowy plik otwarty w notepadzie.