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
rootkomendąsudo su, albo poprzedzamy komendę, którą chcemy wykonać pod rootem, słowemrootna początku, na przykładroot rm <name>pod rootem usunie plik<name>. Podczas korzystania z poleceniasudomoż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.html.
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 a novinky nejen ze světa PHP a programování. Nenechte si ujít jediný článek.
Články píše Jan Barášek © 2009-2025 | Kontakt | Mapa webu
Status | Aktualizováno: ... | pl