Wdrażając protokół `https` na stronach klientów, często napotykałem na różne trudności, które wynikały z braku zrozumienia zagadnień i zbytniego skomplikowania pojęć.
W tym poradniku szczegółowo opisuję kroki, które należy wykonać, aby uzyskać i wdrożyć ważny certyfikat na serwerze WWW.
**W każdym podtytule zawsze krótko podsumowuję krok dla zaawansowanych użytkowników, a na dole omawiam szczegóły dla początkujących.
Ostrzeżenie: Cały proces wdrażania certyfikatu może trwać ponad godzinę i często jest przerywany (witryna może być niedostępna).
W instrukcjach założono, że mamy dostęp do serwera WWW Terminal działającego pod kontrolą systemu Linux i wykorzystującego Apache.
W przypadku Nginx cała teoria ma takie samo zastosowanie, tylko łączenie plików z certyfikatami jest inne.
Łączymy się z serwerem za pomocą protokołu SSH.
W systemie Mac lub Linux należy wywołać polecenie:
ssh uživatel@server
Na przykład, chcę się połączyć z użytkownikiem root
na stronie baraja.cz
:
ssh root@baraja.cz
Lub do użytkownika jan
na określony adres IP:
ssh jan@127.0.0.1
Po wysłaniu zapytania połączenie zostanie nawiązane bezpośrednio lub zostaniesz poproszony o podanie hasła. Podczas wpisywania hasła nic się nie wyświetla, dlatego należy potwierdzić hasło klawiszem Enter i poczekać na autoryzację połączenia.
Ostrzeżenie: Jeśli nie mamy praw do działania, musimy je przypisać. Albo przełączamy się bezpośrednio na użytkownika
root
komendąsudo su
, albo poprzedzamy komendę, którą chcemy wykonać pod rootem, słowemroot
na początku, na przykładroot rm <name>
pod rootem usunie plik<name>
. Podczas korzystania z poleceniasudo
może się zdarzyć, że zostaniemy poproszeni o podanie hasła.
Szczegóły:
Dostęp SSH jest konfigurowany przez hosting, w którym dzierżawisz serwer.
Jeśli konwertujesz istniejącą stronę z http
na https
, musisz zagwarantować, że cały ruch zostanie przekierowany do nowego protokołu https
.
W przypadku Apache'a można to łatwo osiągnąć, stosując przekierowanie w pliku .htaccess
:
<IfModule mod_rewrite.c>RewriteEngine OnRewriteCond %{HTTPS} !onRewriteRule .? https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]</IfModule>
Ta konfiguracja zapewni, że wszystkie żądania do http
będą przekierowywane z kodem HTTP 301
do https
. Ta konfiguracja jest domyślna dla struktury Nette, ale ma zastosowanie także we wszystkich innych przypadkach.
Szczegóły:
Plik .htaccess
zawiera specyficzną konfigurację serwera WWW, która ma wpływ na każde żądanie. Zwykle umieszcza się go w tym samym katalogu co index.php
lub inne pliki dostępne z Internetu.
Jego ustawienie jest ważne tylko dla serwera Apache i może być wyłączone lub ograniczone dla niektórych hostów. Aby uzyskać bardziej szczegółowe informacje, zawsze należy skontaktować się z firmą hostingową, w której znajduje się witryna.
Czasami zdarza się, że .htaccess
nie chce dobrze współpracować i konfiguracja jest bardzo trudna (np. dla wielu domen, z których każda zachowuje się inaczej). W takim przypadku przekierowanie na HTTPS może być w razie potrzeby obsługiwane bezpośrednio w PHP:
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'poza') {$location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];header('HTTP/1.1 301 Przeniesiony na stałe');header('Lokalizacja:' . preg_replace('/^(https:/(?:www.)(.*)$/.', '$1$2', $location));die;}
Umieść skrypt w pliku index.php
. Nie polecam jednak tego rozwiązania.
W przypadku Apache'a musimy znaleźć plik Virtual hosts.
Zazwyczaj znajdują się one w ścieżce /etc/apache2/sites-available
.
Wylistuj zawartość katalogu za pomocą polecenia ls -al
i znajdź plik, w którym znajduje się wirtualna konfiguracja dla naszej strony.
VirtualHosts są zwykle umieszczane w plikach z rozszerzeniem .conf
. Wartość domyślna jest często podana w pliku 000-default.conf
.
Szczegóły:
cd
, na przykład cd /etc/apache2/sites-available
.cat <nazwa>
lub edytowana za pomocą poleceń nano <nazwa>
lub vim <nazwa>
.CTRL + X
lub przez dwukrotne naciśnięcie klawisza ESC
.mc
), który w przypadku Ubuntu instaluje się po prostu za pomocą apt-get install mc
lub sudo apt-get install mc
.W ramach hosta wirtualnego musimy przygotować nowy port dla portu 443
(częstym problemem może być blokowanie portu 443 przez zaporę sieciową).
Zawartość pliku może wyglądać na przykład tak:
<IfModule mod_ssl.c><VirtualHost *:443>ServerName baraja.czServerAdmin jan@barasek.comDocumentRoot /var/www/baraja.cz/wwwHeader always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"ErrorLog ${APACHE_LOG_DIR}/baraja.cz.ssl.error.logCustomLog ${APACHE_LOG_DIR}/baraja.cz.ssl.access.log combinedSSLEngine onSSLCertificateFile /etc/ssl/baraja.cz/baraja.cz.crtSSLCertificateKeyFile /etc/ssl/baraja.cz/baraja.cz.keySSLCertificateChainFile /etc/ssl/baraja.cz/rapidssl.crtSSLProtocol all -SSLv3SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSSSSLHonorCipherOrder onSSLCompression off<FilesMatch "\.(cgi|shtml|phtml|php)$">SSLOptions +StdEnvVars</FilesMatch><Directory /usr/lib/cgi-bin>SSLOptions +StdEnvVars</Directory>BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0# MSIE 7 and newer should be able to use keepaliveBrowserMatch "MSIE [17-9]" \ssl-unclean-shutdown</VirtualHost></IfModule>
Najważniejszym obszarem jest teczka:
SSLEngine onSSLCertificateFile /etc/ssl/baraja.cz/baraja.cz.crtSSLCertificateKeyFile /etc/ssl/baraja.cz/baraja.cz.keySSLCertificateChainFile /etc/ssl/baraja.cz/rapidssl.crt
Zrozumienie tej konfiguracji jest absolutnie niezbędne. Jeśli trzeba wyszukać bardziej szczegółowe informacje, należy użyć słów SSLCertificateFile
, SSLCertificateKeyFile
i SSLCertificateChainFile
, które są wspólne dla wszystkich serwerów Apache.
Ostrzeżenie: Problem SSL jest stosunkowo stary i często używa się różnych nazw dla tej samej rzeczy, aby zachować kompatybilność wsteczną! Dlatego ważne jest, aby zrozumieć tę zasadę.
Szczegóły:
Ważne jest, aby VirualHost zawierał:
<IfModule mod_ssl.c>
mówi, że chcemy używać SSL<VirtualHost *:443>
, że cała komunikacja będzie odbywać się na porcie 443SSLEngine on
, że SSL jest włączony dla tego VirtualHostSSLCertificateFile
, SSLCertificateKeyFile
i SSLCertificateChainFile
są plikami z określonymi kluczami.Nic więcej nie jest potrzebne.
W ostatecznej konfiguracji VirtualHost tak naprawdę będziemy potrzebować tylko 3 plików SSLCertificateFile
, SSLCertificateKeyFile
i SSLCertificateChainFile
, które możemy umieścić w dowolnym miejscu na serwerze (nazwa i lokalizacja nie mają znaczenia). Ważne jest, aby podać ścieżkę roboczą i upewnić się, że zawartość plików jest prawidłowa.
Konkretna metoda uzyskiwania certyfikatów może być różna dla poszczególnych urzędów certyfikacji. Ważne jest, aby zrozumieć tę zasadę, a następnie zastosować ją w swoim przypadku.
Plik | Znaczenie |
---|---|
Ten certyfikat jest wysyłany przez organ | . |
SSLCertificateKeyFile |
Mój wygenerowany klucz prywatny |
Pobrałem z sieci typ intermediate + root | . |
Na serwerze najpierw generujemy klucz prywatny. Ważne jest słowo prywatny, które oznacza, że nie zna go nikt poza serwerem WWW. Najlepiej, aby nigdy nie opuszczał serwera i był umieszczony w bezpiecznym miejscu. Utrata tego klucza oznacza utratę bezpieczeństwa, ponieważ osoba atakująca będzie mogła podszyć się pod konkretny serwer.
Aby wygenerować klucz, użyj polecenia:
openssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr
Aby go wygenerować, musimy mieć zainstalowany na serwerze program openssl
, który możemy uzyskać, uruchamiając na przykład sudo apt install openssl
.
Może istnieć kilka rodzajów kluczy, w tym przypadku generujemy klucz RSA o długości 2048 bajtów (rsa:2048
).
Wynikiem działania tego polecenia są 2 pliki (które można nazwać zgodnie z domeną):
yourdomain.key
- jest to klucz prywatny. Zapisz ścieżkę do tego klucza w Apache VirtualHost do SSLCertificateKeyFile
.yourdomain.csr
- jest to zapytanie o certyfikat
, czyli żądanie wydania certyfikatu.Treść wniosku musi być zawsze przedstawiona CA do zatwierdzenia. Zazwyczaj odbywa się to za pomocą interfejsu internetowego w administracji na stronie, na której sprzedawane są certyfikaty. Zatwierdzenie wniosku różni się w zależności od rodzaju świadectwa. Najczęściej jest ona wykonywana automatycznie przez robota i trwa od 5 minut do 8 godzin. W przypadku drogich certyfikatów, gdzie weryfikowana jest także fizyczna własność obiektu i firmy obsługującej, weryfikacja odbywa się ręcznie i może trwać kilka dni.
Jeśli się spieszysz, istnieje agencja certyfikacyjna Let's encrypt
, która automatycznie autoryzuje wnioski z 3-miesięcznym okresem ważności.
Ostrzeżenie: W niektórych przypadkach urząd certyfikacji oferuje automatyczne generowanie wniosków. Nie jest to zalecana praktyka, ponieważ zna ona klucz prywatny. W takim przypadku należy zawsze uzyskać klucz prywatny od agencji i umieścić go w pliku na serwerze w taki sam sposób, jak w przypadku generowania żądania.
W międzyczasie, w oczekiwaniu na zatwierdzenie wniosku i wydanie certyfikatu, zabezpieczamy klucz publiczny urzędu certyfikacji. W Apache VirtualHost jest to reprezentowane przez plik SSLCertificateChainFile
(w języku angielskim nazywa się to Intermediate and Root CA
). Klucz ten jest z zasady publiczny i informuje przeglądarkę internetową, kto jest urzędem certyfikacji. Plik ten jest zwykle pobierany ze strony internetowej urzędu certyfikacji lub dostarczany pocztą elektroniczną.
Należy zawsze pobierać prawidłowy klucz zgodny z wybranym algorytmem. Na przykład RapidSSL można pobrać tutaj: https://knowledge.digicert.com/generalinformation/INFO1548….
Na podstawie tego żądania urząd certyfikacji wystawił nam certyfikat. W przypadku Apache VirtualHost jest on reprezentowany przez plik SSLCertificateFile
.
Co ważne, certyfikat ma ograniczoną ważność i należy powtórzyć ten proces (najlepiej przed wygaśnięciem ważności). Datę wygaśnięcia można łatwo znaleźć w przeglądarce Chrome, klikając zieloną kłódkę w przeglądarce i przeglądając szczegóły certyfikatu, jeśli jest on podany przez urząd certyfikacji.
Po upływie daty ważności certyfikat jest nieważny i witryna odmawia połączenia, a użytkownicy otrzymują komunikat o błędzie o naruszeniu bezpieczeństwa.
Poprawność ustawień Apache'a można częściowo zweryfikować za pomocą polecenia apache2ctl -S
.
Aby zmiany zaczęły obowiązywać, Apache musi zostać ponownie uruchomiony, na przykład za pomocą polecenia:
sudo service apache2 restart
Jeśli nie zostanie wyświetlony żaden komunikat o błędzie, od razu przechodzimy do sprawdzenia funkcjonalności za pomocą przeglądarki internetowej (polecam Google Chrome, który pokazuje najwięcej szczegółów).
W przypadku wystąpienia błędu, wywołujemy polecenie apache2ctl -S
, które może pokazać ścieżkę do logów, gdzie możemy zobaczyć, co w przybliżeniu jest nie tak. Ważne jest, aby wszystkie czynności opisane w niniejszej instrukcji wykonać w prawidłowej kolejności i nie zamieniać miejscami żadnego z kluczy.
Nie zapomnij zaznaczyć w kalendarzu daty wygaśnięcia certyfikatu, aby móc na czas odnowić jego ważność. Niektóre urzędy certyfikacji wysyłają wiadomość e-mail z powiadomieniem, ale nie zawsze jest to niezawodne.
Proces odnawiania i uzyskiwania nowego certyfikatu można przeprowadzić równolegle, gdy działa już obecny, a następnie po prostu go wymienić.
Do automatycznego odnawiania polecam program Certbot, który może automatycznie monitorować ważność i odnawiać certyfikaty. Odnawianie odbywa się na przykład za pomocą crona, który raz w miesiącu w nocy wywołuje polecenie wydania nowego certyfikatu i natychmiast go wdraża.
Jeśli nie rozumiesz zasad zarządzania certyfikatami, warto korzystać z usług sprawdzonej firmy, która dostarczy Ci funkcjonalny hosting wraz z certyfikatem. Dzięki temu zaoszczędzisz sobie wielu kłopotów.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | pl