december 9, 2021

hur man skapar ett självsignerat SSL-certifikat för Apache i Ubuntu 16.04

introduktion

TLS, eller transport layer security, och dess föregångare SSL, som står för secure sockets layer, är webbprotokoll som används för att linda in normal trafik i ett skyddat, krypterat omslag.

med hjälp av denna teknik kan servrar skicka trafik säkert mellan servern och klienterna utan möjlighet att meddelandena avlyssnas av externa parter. Certifikatsystemet hjälper också användare att verifiera identiteten på de webbplatser som de ansluter till.

i den här guiden visar vi dig hur du ställer in ett självsignerat SSL-certifikat för användning med en Apache-webbserver på en Ubuntu 16.04-server.

Obs: ett självsignerat certifikat krypterar kommunikationen mellan din server och alla klienter. Eftersom det inte är signerat av någon av de betrodda certifikatmyndigheterna som ingår i webbläsare, kan användarna inte använda certifikatet för att validera serverns identitet Automatiskt.

ett självsignerat certifikat kan vara lämpligt om du inte har ett domännamn associerat med din server och för fall där det krypterade webbgränssnittet inte är användarvänt. Om du har ett domännamn är det i många fall bättre att använda ett CA-signerat certifikat. Du kan ta reda på hur du ställer in ett gratis pålitligt certifikat med Let ’ s Encrypt-projektet här.

förutsättningar

innan du börjar bör du ha en icke-root-användare konfigurerad med sudo privilegier. Du kan lära dig hur du ställer in ett sådant användarkonto genom att följa vår första serverinställning för Ubuntu 16.04.

du måste också ha Apache webbserver installerad. Om du vill installera en hel lamp (Linux, Apache, MySQL, PHP) stack på din server kan du följa vår guide för att ställa in LAMP på Ubuntu 16.04. Om du bara vill ha Apache-webbservern, hoppa över stegen för PHP och MySQL i guiden.

när du har slutfört förutsättningarna, Fortsätt nedan.

Steg 1: Skapa SSL-certifikatet

TLS / SSL fungerar genom att använda en kombination av ett offentligt certifikat och en privat nyckel. SSL-nyckeln hålls hemlig på servern. Det används för att kryptera innehåll som skickas till kunder. SSL-certifikatet delas offentligt med alla som begär innehållet. Det kan användas för att dekryptera innehållet signerat av den tillhörande SSL-nyckeln.

vi kan skapa ett självsignerat nyckel – och certifikatpar med OpenSSL i ett enda kommando:

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

du kommer att ställas en rad frågor. Innan vi går igenom det, låt oss ta en titt på vad som händer i kommandot vi utfärdar:

  • openssl: detta är det grundläggande kommandoradsverktyget för att skapa och hantera OpenSSL-certifikat, nycklar och andra filer.
  • req: detta underkommando anger att vi vill använda hantering av X. 509 certificate signing request (CSR). ”X. 509” är en infrastrukturstandard för offentlig nyckel som SSL och TLS följer för sin nyckel-och certifikathantering. Vi vill skapa en ny X. 509 cert, så vi använder detta underkommando.
  • – x509: Detta ändrar ytterligare det tidigare underkommandot genom att berätta för verktyget att vi vill göra ett självsignerat certifikat istället för att generera en certifikatsigneringsbegäran, som normalt skulle hända.
  • -noder: detta berättar OpenSSL att hoppa över alternativet för att säkra vårt certifikat med en lösenfras. Vi behöver Apache för att kunna läsa filen, utan användarintervention, när servern startar. En lösenfras skulle förhindra att detta händer eftersom vi måste ange det efter varje omstart.
  • – dagar 365: Det här alternativet anger hur lång tid certifikatet ska anses vara giltigt. Vi satte det i ett år här.
  • -newkey rsa:2048: detta anger att vi vill generera ett nytt certifikat och en ny nyckel samtidigt. Vi skapade inte nyckeln som krävs för att underteckna certifikatet i ett tidigare steg, så vi måste skapa det tillsammans med certifikatet. rsa:2048 – delen berättar att den ska göra en RSA-nyckel som är 2048 bitar lång.
  • -keyout: den här raden berättar OpenSSL var du ska placera den genererade privata nyckelfilen som vi skapar.
  • – ut: Detta berättar OpenSSL var du ska placera certifikatet som vi skapar.

som vi nämnde ovan skapar dessa alternativ både en nyckelfil och ett certifikat. Vi kommer att ställas några frågor om vår server för att bädda in informationen korrekt i certifikatet.

fyll i anvisningarna på lämpligt sätt. Den viktigaste raden är den som begär Common Name (e.g. server FQDN or YOUR name). Du måste ange domännamnet som är associerat med din server eller, mer troligt, din servers offentliga IP-adress.

hela anvisningarna kommer att se ut så här:

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

båda filerna du skapade kommer att placeras i lämpliga underkataloger i katalogen /etc/ssl.

medan vi använder OpenSSL, vi bör också skapa en stark Diffie-Hellman grupp, som används i förhandlingarna perfekt framåt Sekretess med kunder.

vi kan göra detta genom att skriva:

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

det kan ta några minuter, men när det är klart kommer du att ha en stark DH-grupp på /etc/ssl/certs/dhparam.pem som vi kan använda i vår konfiguration.

steg 2: konfigurera Apache för att använda SSL

vi har skapat våra nyckel-och certifikatfiler under katalogen /etc/ssl. Nu behöver vi bara ändra vår Apache-konfiguration för att dra nytta av dessa.

vi kommer att göra några justeringar av vår konfiguration:

  1. vi skapar ett konfigurationsutdrag för att ange starka standard SSL-inställningar.
  2. vi kommer att ändra den medföljande SSL Apache virtuella värdfilen för att peka på våra genererade SSL-certifikat.
  3. (Rekommenderas) vi kommer att ändra den okrypterade virtuella värdfilen för att automatiskt omdirigera förfrågningar till den krypterade virtuella värden.

när vi är färdiga bör vi ha en säker SSL-konfiguration.

skapa ett Apache-Konfigurationsavsnitt med starka krypteringsinställningar

först skapar vi ett Apache-konfigurationsavsnitt för att definiera vissa SSL-inställningar. Detta kommer att ställa in Apache med en stark SSL-chiffersvit och aktivera några avancerade funktioner som hjälper till att hålla vår server säker. Parametrarna vi ställer in kan användas av alla virtuella värdar som möjliggör SSL.

skapa ett nytt utdrag i katalogen /etc/apache2/conf-available. Vi kommer att namnge filen ssl-params.conf för att göra dess syfte klart:

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

för att konfigurera Apache SSL säkert kommer vi att använda rekommendationerna från Remy van Elst på Cipherli.st webbplats. Denna webbplats är utformad för att ge lätt att konsumera krypteringsinställningar för populära program. Du kan läsa mer om hans beslut angående Apache-valen här.

de föreslagna inställningarna på webbplatsen som är länkade till ovan erbjuder stark säkerhet. Ibland, detta kommer på bekostnad av större klientkompatibilitet. Om du behöver stödja äldre klienter finns det en alternativ lista som kan nås genom att klicka på länken på sidan märkt ”Ja, ge mig en ciphersuite som fungerar med äldre / gammal programvara.”Den listan kan ersättas med de objekt som kopieras nedan.

valet av vilken konfiguration du använder beror till stor del på vad du behöver stödja. De båda kommer att ge stor säkerhet.

för våra ändamål kan vi kopiera de angivna inställningarna i sin helhet. Vi kommer bara att göra två små förändringar.

Ställ in SSLOpenSSLConfCmd DHParameters – direktivet för att peka på Diffie-Hellman-filen som vi genererade tidigare. Ta också en stund att läsa om HTTP Strict Transport Security, eller HSTS, och specifikt om ”preload” – funktionaliteten. Förladdning av HSTS ger ökad säkerhet, men kan få långtgående konsekvenser om det av misstag aktiveras eller aktiveras felaktigt. I den här guiden kommer vi inte att förinstallera inställningarna, men du kan ändra det om du är säker på att du förstår konsekvenserna:

/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"

spara och stäng filen när du är klar.

ändra standard Apache SSL virtuell värdfil

låt oss sedan ändra /etc/apache2/sites-available/default-ssl.conf, standard Apache SSL virtuell värdfil. Om du använder en annan serverblockfil, ersätt dess namn i kommandona nedan.

innan vi går vidare, Låt oss säkerhetskopiera den ursprungliga SSL virtuella värdfilen:

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

öppna nu SSL Virtual Host-filen för att göra justeringar:

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

inuti, med de flesta kommentarerna borttagna, ska den virtuella värdfilen se ut så här som standard:

/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>

vi kommer att göra några mindre justeringar av filen. Vi ställer in de normala sakerna vi vill justera i en virtuell värdfil (ServerAdmin-e-postadress, servernamn etc.), justera SSL-direktiven för att peka på våra certifikat-och nyckelfiler och Avkommentera ett avsnitt som ger kompatibilitet för äldre webbläsare.

när du har gjort dessa ändringar ska ditt serverblock se ut så här:

/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>

spara och stäng filen när du är klar.

(rekommenderas) ändra den okrypterade virtuella värdfilen för att omdirigera till HTTPS

som det står nu kommer servern att tillhandahålla både okrypterad HTTP och krypterad HTTPS-trafik. För bättre säkerhet rekommenderas det i de flesta fall att omdirigera HTTP till HTTPS automatiskt. Om du inte vill eller behöver den här funktionen kan du säkert hoppa över det här avsnittet.

för att justera den okrypterade virtuella värdfilen för att omdirigera all trafik till SSL-krypterad kan vi öppna filen /etc/apache2/sites-available/000-default.conf :

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

inuti, inom VirtualHost konfigurationsblock, behöver vi bara lägga till ett Redirect-direktiv som pekar all trafik till SSL-versionen av webbplatsen:

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

spara och stäng filen när du är klar.

steg 3: Justera brandväggen

om du har ufw brandväggen aktiverad, som rekommenderas av nödvändiga guider, kan behöva justera inställningarna för att möjliggöra SSL-trafik. Lyckligtvis registrerar Apache några profiler med ufw vid installationen.

vi kan se tillgängliga profiler genom att skriva:

  • sudo ufw app list

du bör se en lista som denna:

Output
Available applications: Apache Apache Full Apache Secure OpenSSH

du kan se den aktuella inställningen genom att skriva:

  • sudo ufw status

om du bara tillät vanlig HTTP-trafik tidigare kan din produktion se ut så här:

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

för att dessutom släppa in HTTPS-trafik kan vi tillåta” Apache Full ”- profilen och sedan ta bort den överflödiga” Apache ” – profiltillägget:

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

din status ska se ut så här nu:

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

steg 4: Aktivera ändringarna i Apache

nu när vi har gjort våra ändringar och justerat vår brandvägg kan vi aktivera SSL-och headers-modulerna i Apache, aktivera vår SSL-klara virtuella värd och starta om Apache.

vi kan aktivera mod_ssl, Apache SSL-modulen och mod_headers, som behövs av några av inställningarna i vårt SSL-utdrag, med kommandot a2enmod :

  • sudo a2enmod ssl
  • sudo a2enmod headers

därefter kan vi aktivera vår SSL virtuella värd med kommandot a2ensite :

  • sudo a2ensite default-ssl

vi måste också aktivera vår ssl-params.conf – fil för att läsa i de värden vi ställer in:

  • sudo a2enconf ssl-params

vid denna tidpunkt är vår webbplats och nödvändiga moduler aktiverade. Vi bör kontrollera att det inte finns några syntaxfel i våra filer. Vi kan göra detta genom att skriva:

  • sudo apache2ctl configtest

om allt är framgångsrikt får du ett resultat som ser ut så här:

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

den första raden är bara ett meddelande som säger att ServerName – direktivet inte är inställt globalt. Om du vill bli av med det meddelandet kan du ställa in ServerName till serverns domännamn eller IP-adress i /etc/apache2/apache2.conf. Detta är valfritt eftersom meddelandet inte skadar.

om din produktion har Syntax OK i den har din konfigurationsfil inga syntaxfel. Vi kan säkert starta om Apache för att genomföra våra ändringar:

  • sudo systemctl restart apache2

Steg 5: Testkryptering

nu är vi redo att testa vår SSL-server.

öppna din webbläsare och skriv https:// följt av serverns domännamn eller IP i adressfältet:

https://server_domain_or_IP

eftersom certifikatet vi skapade inte är signerat av en av webbläsarens betrodda certifikatmyndigheter kommer du sannolikt att se en skrämmande varning som den nedan:

Apache självsignerad cert varning

detta förväntas och normalt. Vi är bara intresserade av krypteringsaspekten i vårt certifikat, inte tredje part validering av vår värds äkthet. Klicka på ”Avancerat” och sedan länken för att gå vidare till din värd ändå:

Apache självsignerad åsidosättning

du bör tas till din webbplats. Om du tittar i webbläsarens adressfält ser du ett lås med ett ”x” över det. I det här fallet betyder det bara att certifikatet inte kan valideras. Det krypterar fortfarande din anslutning.

om du konfigurerade Apache för att omdirigera HTTP till HTTPS kan du också kontrollera om omdirigeringen fungerar korrekt:

http://server_domain_or_IP

om detta resulterar i samma ikon betyder det att din omdirigering fungerade korrekt.

steg 6: Byt till en Permanent omdirigering

om din omdirigering fungerade korrekt och du är säker på att du bara vill tillåta krypterad trafik, bör du ändra den okrypterade Apache virtuella värden igen för att göra omdirigeringen permanent.

öppna konfigurationsfilen för serverblock igen:

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

hitta raden Redirect som vi lade till tidigare. Lägg tillpermanent till den raden, som ändrar omdirigeringen från en 302 tillfällig omdirigering till en 301 permanent omdirigering:

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

spara och stäng filen.

kontrollera din konfiguration för syntaxfel:

  • sudo apache2ctl configtest

när du är redo startar du om Apache för att göra omdirigeringen permanent:

  • sudo systemctl restart apache2

slutsats

du har konfigurerat din Apache-server för att använda stark kryptering för klientanslutningar. Detta gör att du kan betjäna förfrågningar säkert och förhindra att externa parter läser din trafik.

Lämna ett svar

Din e-postadress kommer inte publiceras.