To historyczny zapis konfiguracji z 2016 roku — acme.sh i Apache na Debianie Jessie. Działało bez zarzutu. Dla nowoczesnego podejścia z Dockerem i Traefik zapraszam do wpisu kontynuacji.


Przed Let's Encrypt uzyskanie zaufanego certyfikatu SSL wymagało płacenia komerycjnemu CA (Comodo, DigiCert, GoDaddy) od 200 do kilku tysięcy złotych rocznie, ręcznej weryfikacji tożsamości i samodzielnej obsługi odnowień. Let's Encrypt uruchomił się w 2015 roku, wyszedł z bety w kwietniu 2016 i zmienił to całkowicie: darmowe certyfikaty Domain Validation, automatyczne wydawanie przez protokół ACME, 90-dniowy czas ważności z wbudowaną obsługą odnowień. Dla małych serwerów i prywatnych stron działających dotychczas na HTTP była to pierwsza praktyczna droga do HTTPS.

Oficjalny klient Certbot nie był jeszcze dostępny w repozytoriach Debiana Jessie, więc skorzystałem z jednego z alternatywnych klientów — prostego skryptu bash: https://github.com/Neilpang/acme.sh

Używając tego skryptu można wszystko zrobić dosłownie w 5 minut.

Wymagania

  • Dostęp root do serwera
  • Apache działający na Debianie Jessie
  • Domena wskazująca na publiczne IP serwera
  • Otwarty port 80 (używany przez challenge HTTP-01 do weryfikacji własności domeny)

Na wstępie ustalmy, że wszystko wykonujemy z roota oraz:

/root/.acme.sh/acme.sh     # miejsce składowania skryptów klienta
mojastrona.pl              # strona, dla której chcemy uzyskać certyfikat
/mnt/www/mojastrona.pl     # katalog na dysku naszej strony
/etc/apache2               # lokalizacja Apache wraz z plikami konfiguracji

Krok 1 — Pobierz klienta

Przechodzimy do katalogu /root/.acme.sh/acme.sh (tworzymy jeśli nie istnieje) i wykonujemy:

git clone https://github.com/Neilpang/acme.sh

Jeśli nie mamy gita, pobieramy pliki ręcznie ze strony projektu i wypakowujemy.

Krok 2 — Symlink dla wygody

ln -s /root/.acme.sh/ /etc/apache2/letsencrypt

Krok 3 — Pobierz certyfikat

Upewniamy się, że strona jest dostępna z internetu, następnie:

./acme.sh issue /mnt/www/mojastrona.pl/ mojastrona.pl

Lub jeśli mamy aliasy (np. www.mojastrona.pl):

./acme.sh issue /mnt/www/mojastrona.pl/ mojastrona.pl www.mojastrona.pl

acme.sh umieszcza tymczasowy plik w webroocie, Let's Encrypt go pobiera, żeby zweryfikować że kontrolujesz domenę, i wydaje certyfikat. Pliki zapisane zostaną w:

/root/.acme.sh/mojastrona.pl/

Krok 4 — Konfiguracja Apache

Wskazujemy Apache na nowe certyfikaty w pliku virtual hosta:

SSLCACertificateFile  /etc/apache2/letsencrypt/mojastrona.pl/ca.cer
SSLCertificateFile    /etc/apache2/letsencrypt/mojastrona.pl/mojastrona.pl.cer
SSLCertificateKeyFile /etc/apache2/letsencrypt/mojastrona.pl/mojastrona.pl.key

Następnie przeładowujemy Apache:

service apache2 reload

Od tego momentu strona powinna serwować certyfikat Let's Encrypt.

Krok 5 — Automatyczne odnawianie

Certyfikaty mają ważność 90 dni. Aby odnawiać automatycznie, tworzymy wykonywalny skrypt acme_cron:

#!/bin/sh
/root/.acme.sh/acme.sh/acme.sh cron >> /var/log/le-renew.log
service apache2 reload

I przenosimy go do /etc/cron.daily.

holas.pl z certyfikatem Let's Encrypt

Proces nie jest skomplikowany — po pierwszej konfiguracji odnawianie przebiega w pełni automatycznie.


Ta konfiguracja działała sprawnie, dopóki nie przeniosłem wszystkiego na Dockera. Nowoczesne podejście z Traefik obsługuje Let's Encrypt automatycznie — bez skryptów, bez crona, bez ręcznej konfiguracji. Więcej: Let's Encrypt z Dockerem i Traefik.