9 grudnia, 2021

Jak utworzyć certyfikat SSL z podpisem własnym dla Apache w Ubuntu 16.04

wprowadzenie

TLS, czyli transport layer security i jego poprzednik SSL, czyli secure sockets layer, są protokołami sieciowymi używanymi do owijania normalnego ruchu w chronione, szyfrowane opakowanie.

korzystając z tej technologii, serwery mogą bezpiecznie wysyłać ruch między serwerem a klientami bez możliwości przechwycenia wiadomości przez strony zewnętrzne. System certyfikatów pomaga również użytkownikom w weryfikacji tożsamości witryn, z którymi się łączą.

w tym przewodniku pokażemy, jak skonfigurować samopodpisany certyfikat SSL do użytku z serwerem Apache na serwerze Ubuntu 16.04.

Uwaga: certyfikat z podpisem własnym szyfruje komunikację między serwerem a dowolnymi klientami. Ponieważ jednak nie jest on podpisany przez żaden z zaufanych urzędów certyfikacji dołączonych do przeglądarek internetowych, użytkownicy nie mogą używać certyfikatu do automatycznego sprawdzania tożsamości serwera.

certyfikat z podpisem własnym może być odpowiedni, jeśli nie masz nazwy domeny powiązanej z serwerem i w przypadkach, w których zaszyfrowany interfejs internetowy nie jest skierowany do użytkownika. Jeśli masz nazwę domeny, w wielu przypadkach lepiej jest użyć certyfikatu podpisanego przez CA. Możesz dowiedzieć się, jak skonfigurować bezpłatny zaufany certyfikat w projekcie Let ’ s Encrypt tutaj.

wymagania wstępne

zanim zaczniesz, powinieneś mieć skonfigurowanego użytkownika innego niż root z uprawnieniami sudo. Możesz dowiedzieć się, jak skonfigurować takie konto użytkownika, postępując zgodnie z naszą początkową konfiguracją serwera dla Ubuntu 16.04.

musisz mieć zainstalowany serwer WWW Apache. Jeśli chcesz zainstalować cały stos LAMP (Linux, Apache, MySQL, PHP) na swoim serwerze, możesz postępować zgodnie z naszym przewodnikiem na temat konfigurowania lampy na Ubuntu 16.04. Jeśli chcesz tylko serwer WWW Apache, pomiń kroki odnoszące się do PHP i MySQL w przewodniku.

po spełnieniu warunków wstępnych Kontynuuj poniżej.

Krok 1: Utwórz certyfikat SSL

TLS / SSL działa przy użyciu kombinacji certyfikatu publicznego i klucza prywatnego. Klucz SSL jest utrzymywany w tajemnicy na serwerze. Służy do szyfrowania treści wysyłanych do klientów. Certyfikat SSL jest publicznie udostępniany wszystkim żądającym treści. Może być używany do odszyfrowania zawartości podpisanej powiązanym kluczem SSL.

możemy utworzyć parę kluczy i certyfikatów z OpenSSL w jednym poleceniu:

  • sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

zostaniesz poproszony o serię pytań. Zanim przejdziemy do tego, rzućmy okiem na to, co dzieje się w Komendzie, którą wydajemy:

  • openssl: jest to podstawowe narzędzie wiersza poleceń do tworzenia i zarządzania certyfikatami OpenSSL, kluczami i innymi plikami.
  • req: to polecenie określa, że chcemy używać zarządzania żądaniem podpisywania certyfikatu (CSR) X. 509. „X. 509” to standard infrastruktury klucza publicznego, do którego stosują się SSL i TLS w celu zarządzania kluczami i certyfikatami. Chcemy stworzyć nowy cert X. 509, więc używamy tej podpowiedzi.
  • – x509: To dodatkowo modyfikuje poprzednie polecenie, informując narzędzie, że chcemy utworzyć certyfikat z podpisem własnym, zamiast generować żądanie podpisania certyfikatu, jak to zwykle ma miejsce.
  • -Węzły: To mówi OpenSSL, aby pominął opcję Zabezpieczenia naszego certyfikatu hasłem. Potrzebujemy Apache ’ a, aby był w stanie odczytać plik, bez interwencji użytkownika, podczas uruchamiania serwera. Hasło zapobiegałoby temu, ponieważ musielibyśmy je wprowadzać po każdym restarcie.
  • – dni 365: Ta opcja określa czas, przez jaki certyfikat zostanie uznany za ważny. Ustaliliśmy to na rok.
  • – newkey rsa:2048: określa, że chcemy jednocześnie wygenerować nowy certyfikat i nowy klucz. W poprzednim kroku nie stworzyliśmy klucza, który jest wymagany do podpisania certyfikatu, więc musimy go utworzyć wraz z certyfikatem. Część rsa:2048 mówi, aby klucz RSA miał długość 2048 bitów.
  • – keyout: ta linia mówi OpenSSL, gdzie umieścić wygenerowany plik klucza prywatnego, który tworzymy.
  • – out: To mówi OpenSSL, gdzie umieścić certyfikat, który tworzymy.

jak stwierdziliśmy powyżej, te opcje utworzą zarówno plik klucza, jak i certyfikat. Zostanie nam zadane kilka pytań dotyczących naszego serwera w celu poprawnego osadzenia informacji w certyfikacie.

wypełnij odpowiednio monity. Najważniejszą linią jest ta, która żąda Common Name (e.g. server FQDN or YOUR name). Musisz wprowadzić nazwę domeny powiązaną z serwerem lub, co bardziej prawdopodobne, publiczny adres IP serwera.

całość podpowiedzi będzie wyglądała mniej więcej tak:

Output
Country Name (2 letter code) :USState or Province Name (full name) :New YorkLocality Name (eg, city) :New York CityOrganization Name (eg, company) :Bouncy Castles, Inc.Organizational Unit Name (eg, section) :Ministry of Water SlidesCommon Name (e.g. server FQDN or YOUR name) :server_IP_addressEmail Address :admin@your_domain.com

oba utworzone pliki zostaną umieszczone w odpowiednich podkatalogach katalogu /etc/ssl.

podczas gdy korzystamy z OpenSSL, powinniśmy również stworzyć silną grupę Diffie-Hellman, która jest używana do negocjowania idealnej tajemnicy przekazywania z klientami.

możemy to zrobić wpisując:

  • sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

może to potrwać kilka minut, ale po zakończeniu będziesz miał silną grupę DH w /etc/ssl/certs/dhparam.pem , której możemy użyć w naszej konfiguracji.

Krok 2: Skonfiguruj Apache do używania SSL

utworzyliśmy nasze pliki kluczy i certyfikatów w katalogu /etc/ssl. Teraz musimy tylko zmodyfikować naszą konfigurację Apache, aby z nich skorzystać.

wprowadzimy kilka poprawek do naszej konfiguracji:

  1. utworzymy fragment konfiguracji, aby określić silne domyślne ustawienia SSL.
  2. zmodyfikujemy dołączony plik wirtualnego hosta SSL Apache, aby wskazywał na nasze wygenerowane certyfikaty SSL.
  3. (zalecane) zmodyfikujemy niezaszyfrowany plik hosta wirtualnego, aby automatycznie przekierowywać żądania do zaszyfrowanego hosta wirtualnego.

kiedy skończymy, powinniśmy mieć bezpieczną konfigurację SSL.

Utwórz fragment konfiguracji Apache z silnymi ustawieniami szyfrowania

najpierw utworzymy fragment konfiguracji Apache, aby zdefiniować niektóre ustawienia SSL. Spowoduje to skonfigurowanie Apache z silnym pakietem szyfrów SSL i włączenie niektórych zaawansowanych funkcji, które pomogą chronić nasz serwer. Ustawione przez nas parametry mogą być używane przez dowolne wirtualne hosty obsługujące protokół SSL.

Utwórz nowy fragment w katalogu /etc/apache2/conf-available. Nazwiemy plik ssl-params.conf, aby jasno określić jego cel:

  • sudo nano /etc/apache2/conf-available/ssl-params.conf

aby bezpiecznie skonfigurować Apache SSL, będziemy korzystać z zaleceń Remy van Elst na Cipherli.st miejsce. Ta strona została zaprojektowana w celu zapewnienia łatwych w użyciu ustawień szyfrowania dla popularnego oprogramowania. Możesz przeczytać więcej o jego decyzjach dotyczących wyborów Apaczów tutaj.

sugerowane ustawienia na stronie połączonej z powyższym oferują silne bezpieczeństwo. Czasami wiąże się to z większą kompatybilnością z klientami. Jeśli chcesz obsługiwać starszych klientów, istnieje alternatywna Lista, do której można uzyskać dostęp, klikając link na stronie oznaczonej ” tak, daj mi ciphersuite, który działa ze starszym / starym oprogramowaniem.”Listę tę można zastąpić kopiowanymi poniżej elementami.

wybór używanej konfiguracji będzie zależał w dużej mierze od tego, czego potrzebujesz do obsługi. Oboje zapewnią wielkie bezpieczeństwo.

dla naszych celów możemy skopiować podane ustawienia w całości. Wprowadzimy tylko dwie małe zmiany.

Ustaw dyrektywę SSLOpenSSLConfCmd DHParameters tak, aby wskazywała na plik Diffie-Hellman, który wygenerowaliśmy wcześniej. Poświęć również chwilę na zapoznanie się z http Strict Transport Security lub HSTS, a konkretnie z funkcją „preload”. Wstępne ładowanie HSTS zapewnia zwiększone bezpieczeństwo, ale może mieć daleko idące konsekwencje w przypadku przypadkowego lub nieprawidłowego włączenia. W tym przewodniku nie pobieramy wstępnie ustawień, ale możesz je zmodyfikować, jeśli jesteś pewien, że rozumiesz konsekwencje:

/etc/apache2/conf-available/ssl-params.conf
# from https://cipherli.st/# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.htmlSSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDHSSLProtocol All -SSLv2 -SSLv3SSLHonorCipherOrder On# Disable preloading HSTS for now. You can use the commented out header line that includes# the "preload" directive if you understand the implications.#Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains"Header always set X-Frame-Options DENYHeader always set X-Content-Type-Options nosniff# Requires Apache >= 2.4SSLCompression off SSLSessionTickets OffSSLUseStapling on SSLStaplingCache "shmcb:logs/stapling-cache(150000)"SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"

Zapisz i zamknij plik po zakończeniu.

zmodyfikuj domyślny plik wirtualnego hosta Apache SSL

następnie zmodyfikuj /etc/apache2/sites-available/default-ssl.conf, domyślny plik wirtualnego hosta Apache SSL. Jeśli używasz innego pliku bloku serwera, zastąp jego nazwę w poleceniach poniżej.

zanim przejdziemy dalej, zróbmy kopię zapasową oryginalnego pliku wirtualnego hosta SSL:

  • sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

teraz otwórz plik wirtualnego hosta SSL, aby wprowadzić korekty:

  • sudo nano /etc/apache2/sites-available/default-ssl.conf

wewnątrz, po usunięciu większości komentarzy, plik wirtualnego hosta powinien domyślnie wyglądać mniej więcej tak:

/etc/apache2/sites-available / default-ssl.conf
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> # BrowserMatch "MSIE " \ # nokeepalive ssl-unclean-shutdown \ # downgrade-1.0 force-response-1.0 </VirtualHost></IfModule>

będziemy wprowadzać drobne poprawki do pliku. Ustawimy normalne rzeczy, które chcemy dostosować w pliku wirtualnego hosta (adres e-mail ServerAdmin, Nazwa serwera itp.), dostosuj dyrektywy SSL, aby wskazywały na nasze pliki certyfikatów i kluczy, i odkomentuj jedną sekcję, która zapewnia zgodność dla starszych przeglądarek.

po wprowadzeniu tych zmian blok serwera powinien wyglądać podobnie:

/etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin [email protected] ServerName server_domain_or_IP DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE " \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 </VirtualHost></IfModule>

Zapisz i zamknij plik po zakończeniu.

(zalecane) zmodyfikuj niezaszyfrowany plik hosta wirtualnego, aby przekierował do HTTPS

w obecnej postaci serwer będzie dostarczał zarówno niezaszyfrowany ruch HTTP, jak i szyfrowany https. Dla lepszego bezpieczeństwa, w większości przypadków zaleca się automatyczne przekierowanie HTTP do HTTPS. Jeśli nie chcesz lub potrzebujesz tej funkcji, możesz bezpiecznie pominąć tę sekcję.

aby dostosować niezaszyfrowany plik wirtualnego hosta, aby przekierować cały ruch do szyfrowania SSL, możemy otworzyć plik /etc/apache2/sites-available/000-default.conf :

  • sudo nano /etc/apache2/sites-available/000-default.conf

wewnątrz, wewnątrz bloków konfiguracyjnych VirtualHost, musimy tylko dodać dyrektywę Redirect, wskazując cały ruch na wersję SSL witryny:

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80> . . . Redirect "/" "https://your_domain_or_IP/" . . .</VirtualHost>

Zapisz i zamknij plik po zakończeniu.

Krok 3: Dostosuj zaporę

jeśli masz włączoną zaporę ufw, zgodnie z zaleceniami przewodników po wymaganiach, może być konieczne dostosowanie ustawień, aby umożliwić ruch SSL. Na szczęście Apache rejestruje kilka profili z ufw po instalacji.

możemy zobaczyć dostępne profile wpisując:

  • sudo ufw app list

powinieneś zobaczyć taką listę:

Output
Available applications: Apache Apache Full Apache Secure OpenSSH

bieżące ustawienie możesz zobaczyć wpisując:

  • sudo ufw status

jeśli wcześniej dozwolony był tylko zwykły ruch HTTP, wynik może wyglądać następująco:

Output
Status: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Apache (v6) ALLOW Anywhere (v6)

aby dodatkowo wpuścić ruch HTTPS, możemy zezwolić na profil „Apache Full”, a następnie usunąć zbędny limit profilu ” Apache:

  • sudo ufw allow 'Apache Full'
  • sudo ufw delete allow 'Apache'

Twój status powinien teraz wyglądać tak:

  • sudo ufw status
Output
Status: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache Full ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Apache Full (v6) ALLOW Anywhere (v6)

Krok 4: Włącz zmiany w Apache

teraz, gdy wprowadziliśmy zmiany i dostosowaliśmy zaporę, możemy włączyć Moduły SSL i nagłówki w Apache, włączyć nasz wirtualny Host gotowy do SSL i ponownie uruchomić Apache.

możemy włączyć mod_ssl, moduł SSL Apache i mod_headers, wymagane przez niektóre ustawienia w naszym fragmencie SSL, za pomocą polecenia a2enmod :

  • sudo a2enmod ssl
  • sudo a2enmod headers

następnie możemy włączyć nasz wirtualny Host SSL za pomocą polecenia a2ensite :

  • sudo a2ensite default-ssl

będziemy również musieli włączyć nasz plik ssl-params.conf, aby odczytać w ustawionych przez nas wartościach:

  • sudo a2enconf ssl-params

w tym momencie nasza strona i niezbędne moduły są włączone. Powinniśmy sprawdzić, czy nie ma błędów składniowych w naszych plikach. Możemy to zrobić wpisując:

  • sudo apache2ctl configtest

jeśli wszystko się powiedzie, otrzymasz wynik, który wygląda tak:

Output
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this messageSyntax OK

pierwsza linia to tylko komunikat informujący, że dyrektywa ServerName nie jest ustawiona globalnie. Jeśli chcesz pozbyć się tej wiadomości, możesz ustawić ServerName na nazwę domeny lub adres IP serwera w polu /etc/apache2/apache2.conf. Jest to opcjonalne, ponieważ wiadomość nie zaszkodzi.

jeśli twoje wyjście zawiera Syntax OK, Twój plik konfiguracyjny nie zawiera błędów składni. Możemy bezpiecznie ponownie uruchomić Apache, aby wdrożyć nasze zmiany:

  • sudo systemctl restart apache2

Krok 5: Przetestuj Szyfrowanie

teraz jesteśmy gotowi do przetestowania naszego serwera SSL.

Otwórz przeglądarkę i wpisz https:// następnie nazwę domeny lub IP serwera w pasku adresu:

https://server_domain_or_IP

ponieważ utworzony przez nas certyfikat nie jest podpisany przez jeden z zaufanych urzędów certyfikacji w przeglądarce, prawdopodobnie zobaczysz przerażająco wyglądające Ostrzeżenie, takie jak poniższe:

Apache self-signed Cert warning

jest to oczekiwane i normalne. Interesuje nas tylko aspekt szyfrowania naszego certyfikatu, a nie Walidacja autentyczności naszego hosta przez stronę trzecią. Kliknij „Zaawansowane”, a następnie łącze dostarczone, aby przejść do hosta tak czy inaczej:

Apache self-signed override

powinieneś zostać przeniesiony na swoją stronę. Jeśli spojrzysz na pasek adresu przeglądarki, zobaczysz blokadę z „x” nad nią. W tym przypadku oznacza to po prostu, że certyfikat nie może zostać zweryfikowany. Nadal szyfruje twoje połączenie.

jeśli skonfigurowałeś Apache do przekierowywania HTTP do HTTPS, możesz również sprawdzić, czy przekierowanie działa poprawnie:

http://server_domain_or_IP

jeśli w wyniku tego pojawi się ta sama ikona, oznacza to, że przekierowanie działało poprawnie.

Krok 6: Zmień na stałe przekierowanie

jeśli przekierowanie działało poprawnie i jesteś pewien, że chcesz zezwolić tylko na zaszyfrowany ruch, powinieneś ponownie zmodyfikować niezaszyfrowany wirtualny Host Apache, aby przekierowanie stało się trwałe.

Otwórz ponownie plik konfiguracyjny bloku serwera:

  • sudo nano /etc/apache2/sites-available/000-default.conf

znajdź linię Redirect, którą dodaliśmy wcześniej. Dodaj permanent do tej linii, która zmienia przekierowanie z tymczasowego przekierowania 302 na stałe przekierowanie 301:

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80> . . . Redirect permanent "/" "https://your_domain_or_IP/" . . .</VirtualHost>

Zapisz i zamknij plik.

sprawdź konfigurację pod kątem błędów składniowych:

  • sudo apache2ctl configtest

gdy będziesz gotowy, uruchom ponownie Apache, aby przekierowanie stało się trwałe:

  • sudo systemctl restart apache2

wniosek

skonfigurowałeś swój serwer Apache tak, aby używał silnego szyfrowania dla połączeń klienckich. Pozwoli to bezpiecznie obsługiwać żądania i uniemożliwi stronom zewnętrznym odczytanie ruchu.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.