Sådan oprettes et selvsigneret SSL-certifikat til Apache i Ubuntu 16.04
introduktion
TLS, eller transport layer security, og dets forgænger SSL, som står for secure sockets layer, er internetprotokoller, der bruges til at pakke normal trafik i en beskyttet, krypteret indpakning.
ved hjælp af denne teknologi kan servere sende trafik sikkert mellem serveren og klienterne uden mulighed for, at meddelelserne opfanges af eksterne parter. Certifikatsystemet hjælper også brugere med at verificere identiteten af de sider, de opretter forbindelse til.
i denne vejledning viser vi dig, hvordan du opretter et selvsigneret SSL-certifikat til brug med en Apache-server på en Ubuntu 16.04-server.
Bemærk: et selvsigneret certifikat krypterer kommunikationen mellem din server og eventuelle klienter. Men fordi det ikke er underskrevet af nogen af de betroede certifikatmyndigheder, der er inkluderet i internetsøgere, kan brugerne ikke bruge certifikatet til automatisk at validere identiteten på din server.
et selvsigneret certifikat kan være passende, hvis du ikke har et domænenavn tilknyttet din server og i tilfælde, hvor den krypterede internetgrænseflade ikke er brugervendt. Hvis du har et domænenavn, er det i mange tilfælde bedre at bruge et ca-underskrevet certifikat. Du kan finde ud af, hvordan du opretter et gratis betroet certifikat med Let ‘ s Encrypt-projektet her.
forudsætninger
før du begynder, skal du have en ikke-root-bruger konfigureret med sudo
privilegier. Du kan lære, hvordan du opretter en sådan brugerkonto ved at følge vores oprindelige serveropsætning til Ubuntu 16.04.
du skal også have Apache-serveren installeret. Hvis du vil installere en hel lamp-stak på din server, kan du følge vores guide til opsætning af LAMP på Ubuntu 16.04. Hvis du bare vil have Apache-serveren, skal du springe over trinnene vedrørende PHP og Myscl i guiden.
når du har gennemført forudsætningerne, fortsæt nedenfor.
Trin 1: Opret SSL-certifikatet
TLS/SSL fungerer ved hjælp af en kombination af et offentligt certifikat og en privat nøgle. SSL-nøglen holdes hemmelig på serveren. Det bruges til at kryptere indhold sendt til klienter. SSL-certifikatet deles offentligt med alle, der anmoder om indholdet. Det kan bruges til at dekryptere indholdet underskrevet af den tilknyttede SSL-nøgle.
vi kan oprette et selvsigneret nøgle – og certifikatpar med OpenSSL i en enkelt 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 vil blive stillet en række spørgsmål. Før vi går over det, lad os se på, hvad der sker i den kommando, Vi udsteder:
- openssl: dette er det grundlæggende kommandolinjeværktøj til oprettelse og styring af OpenSSL-certifikater, nøgler og andre filer.
- spørgsmål: denne underkommando angiver, at vi vil bruge CSR-styring (509 certificate signering anmodning). “509” er en offentlig nøgleinfrastrukturstandard, som SSL og TLS overholder for sin nøgle-og certifikatstyring. Vi ønsker at oprette en ny 509 cert, så vi bruger denne underkommando.
- – h509: Dette ændrer yderligere den forrige underkommando ved at fortælle værktøjet, at vi ønsker at oprette et selvsigneret certifikat i stedet for at generere en anmodning om certifikatsignering, som normalt ville ske.
- – noder: dette fortæller OpenSSL at springe over muligheden for at sikre vores certifikat med en adgangskode. Vi har brug for Apache for at kunne læse filen uden brugerintervention, når serveren starter. En adgangssætning ville forhindre, at dette sker, fordi vi bliver nødt til at indtaste det efter hver genstart.
- – dage 365: Denne indstilling angiver, hvor lang tid certifikatet betragtes som gyldigt. Vi sætter det i et år her.
- – nynøgle rsa:2048: dette angiver, at vi vil generere et nyt certifikat og en ny nøgle på samme tid. Vi oprettede ikke den nøgle, der kræves for at underskrive certifikatet i et tidligere trin, så vi er nødt til at oprette det sammen med certifikatet.
rsa:2048
– delen fortæller den at lave en RSA-nøgle, der er 2048 bit lang. - – keyout: denne linje fortæller OpenSSL, hvor den genererede private nøglefil, som vi opretter, skal placeres.
- – ud: Dette fortæller OpenSSL, hvor det certifikat, vi opretter, skal placeres.
som vi sagde ovenfor, opretter disse indstillinger både en nøglefil og et certifikat. Vi bliver stillet et par spørgsmål om vores server for at integrere oplysningerne korrekt i certifikatet.
udfyld vejledningen korrekt. Den vigtigste linje er den, der anmoder om Common Name (e.g. server FQDN or YOUR name)
. Du skal indtaste det domænenavn, der er knyttet til din server eller, mere sandsynligt, din servers offentlige IP-adresse.
hele vejledningen vil se sådan ud:
OutputCountry 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
begge de filer, du oprettede, placeres i de relevante undermapper i /etc/ssl
– mappen.
mens vi bruger OpenSSL, bør vi også oprette en stærk Diffie-Hellman-gruppe, som bruges til at forhandle perfekt Fremadhemmelighed med klienter.
vi kan gøre dette ved at skrive:
- sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
dette kan tage et par minutter, men når det er gjort, vil du have en stærk DH-gruppe på /etc/ssl/certs/dhparam.pem
, som vi kan bruge i vores konfiguration.
Trin 2: Konfigurer Apache til at bruge SSL
vi har oprettet vores nøgle-og certifikatfiler under mappen /etc/ssl
. Nu skal vi bare ændre vores Apache-konfiguration for at drage fordel af disse.
vi foretager et par justeringer af vores konfiguration:
- vi opretter et konfigurationsuddrag for at specificere stærke standard SSL-indstillinger.
- vi ændrer den medfølgende SSL Apache Virtual Host-fil for at pege på vores genererede SSL-certifikater.
- (anbefales) vi ændrer den ukrypterede virtuelle værtsfil for automatisk at omdirigere anmodninger til den krypterede virtuelle vært.
når vi er færdige, skal vi have en sikker SSL-konfiguration.
Opret et Apache-Konfigurationsstykke med stærke krypteringsindstillinger
først opretter vi et Apache-konfigurationsstykke til at definere nogle SSL-indstillinger. Dette vil sætte Apache op med en stærk SSL cipher suite og aktivere nogle avancerede funktioner, der hjælper med at holde vores server sikker. De parametre, vi indstiller, kan bruges af alle virtuelle værter, der muliggør SSL.
Opret et nyt uddrag i mappen /etc/apache2/conf-available
. Vi navngiver filen ssl-params.conf
for at gøre dens formål klart:
- sudo nano /etc/apache2/conf-available/ssl-params.conf
for at konfigurere Apache SSL sikkert bruger vi anbefalingerne fra Remy van Elst på Cipherli.st sted. Dette site er designet til at give nem at forbruge krypteringsindstillinger for populære programmer. Du kan læse mere om hans beslutninger vedrørende Apache-valgene her.
de foreslåede indstillinger på siden, der er linket til ovenfor, giver stærk sikkerhed. Sommetider, dette kommer på bekostning af større klientkompatibilitet. Hvis du har brug for at støtte ældre klienter, er der en alternativ liste, der kan tilgås ved at klikke på linket på siden mærket “Ja, giv mig en ciphersuite, der fungerer med ældre / gamle programmer.”Denne liste kan erstattes af de elementer, der er kopieret nedenfor.
valget af hvilken konfiguration du bruger afhænger stort set af, hvad du har brug for at understøtte. De vil begge give stor sikkerhed.
til vores formål kan vi kopiere de angivne indstillinger i deres helhed. Vi vil bare lave to små ændringer.
Indstil SSLOpenSSLConfCmd DHParameters
direktivet til at pege på Diffie-Hellman-filen, vi genererede tidligere. Også, tage et øjeblik til at læse op på HTTP strenge transportsikkerhed, eller HSTS, og specifikt om “preload” funktionalitet. Forudindlæsning af HSTS giver øget sikkerhed, men kan have vidtrækkende konsekvenser, hvis det ved et uheld aktiveres eller aktiveres forkert. I denne vejledning vil vi ikke forudindlæse indstillingerne, men du kan ændre det, hvis du er sikker på at du forstår implikationerne:
# 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"
Gem og luk filen, når du er færdig.
Rediger standard Apache SSL Virtual Host File
næste, lad os ændre /etc/apache2/sites-available/default-ssl.conf
, standard Apache SSL Virtual Host file. Hvis du bruger en anden serverblokfil, skal du erstatte navnet i kommandoerne nedenfor.
før vi går videre, lad os sikkerhedskopiere den originale SSL Virtual Host-fil:
- sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak
åbn nu SSL Virtual Host-filen for at foretage justeringer:
- sudo nano /etc/apache2/sites-available/default-ssl.conf
inde, med de fleste af kommentarerne fjernet, skal den virtuelle værtsfil som standard se sådan ud:
<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 foretager nogle mindre justeringer af filen. Vi indstiller de normale ting, vi gerne vil justere i en virtuel værtsfil (ServerAdmin-e-mail-adresse, servernavn osv.), juster SSL-direktiverne, så de peger på vores certifikat-og nøglefiler, og frigør et afsnit, der giver kompatibilitet for ældre bro.sere.
når du har foretaget disse ændringer, skal din serverblok ligne denne:
<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>
Gem og luk filen, når du er færdig.
(anbefales) rediger den ukrypterede virtuelle værtsfil for at omdirigere til HTTPS
som det står nu, vil serveren give både ukrypteret HTTP og krypteret HTTPS-trafik. For bedre sikkerhed anbefales det i de fleste tilfælde at omdirigere HTTP til HTTPS automatisk. Hvis du ikke ønsker eller har brug for denne funktionalitet, kan du sikkert springe over dette afsnit.
for at justere den ukrypterede virtuelle værtsfil for at omdirigere al trafik til SSL-krypteret, kan vi åbne filen /etc/apache2/sites-available/000-default.conf
:
- sudo nano /etc/apache2/sites-available/000-default.conf
inde i VirtualHost
konfigurationsblokkene skal vi bare tilføje et Redirect
direktiv, der peger al trafik på SSL-versionen af siden:
<VirtualHost *:80> . . . Redirect "/" "https://your_domain_or_IP/" . . .</VirtualHost>
Gem og luk filen, når du er færdig.
Trin 3: Juster Brandvæggen
hvis du har aktiveret brandvæggen ufw
, som anbefalet af forudsætningsvejledningerne, skal du muligvis justere indstillingerne for at tillade SSL-trafik. Heldigvis registrerer Apache et par profiler med ufw
efter installationen.
vi kan se de tilgængelige profiler ved at skrive:
- sudo ufw app list
du skal se en liste som denne:
OutputAvailable applications: Apache Apache Full Apache Secure OpenSSH
du kan se den aktuelle indstilling ved at skrive:
- sudo ufw status
hvis du kun tillod almindelig HTTP-trafik tidligere, kan dit output se sådan ud:
OutputStatus: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Apache (v6) ALLOW Anywhere (v6)
for yderligere at lade HTTPS-trafik ind, Vi kan tillade profilen” Apache Full “og derefter slette den overflødige” Apache ” – profilgodtgørelse:
- sudo ufw allow 'Apache Full'
- sudo ufw delete allow 'Apache'
din status skal se sådan ud nu:
- sudo ufw status
OutputStatus: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache Full ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Apache Full (v6) ALLOW Anywhere (v6)
Trin 4: Aktiver ændringerne i Apache
nu hvor vi har foretaget vores ændringer og justeret vores brandvæg, kan vi aktivere SSL-og headers-modulerne i Apache, aktivere vores SSL-klar virtuelle vært og genstarte Apache.
vi kan aktivere mod_ssl
, Apache SSL-modulet og mod_headers
, der kræves af nogle af indstillingerne i Vores SSL-uddrag, med kommandoen a2enmod
:
- sudo a2enmod ssl
- sudo a2enmod headers
dernæst kan vi aktivere vores SSL virtuelle vært med kommandoen a2ensite
:
- sudo a2ensite default-ssl
vi bliver også nødt til at aktivere vores ssl-params.conf
fil for at læse de værdier, vi indstiller:
- sudo a2enconf ssl-params
på dette tidspunkt er vores hjemmeside og de nødvendige moduler aktiveret. Vi bør kontrollere for at sikre, at der ikke er nogen syntaksfejl i vores filer. Vi kan gøre dette ved at skrive:
- sudo apache2ctl configtest
hvis alt er vellykket, får du et resultat, der ser sådan ud:
OutputAH00558: 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ørste linje er bare en besked, der fortæller dig, at ServerName
direktivet ikke er indstillet globalt. Hvis du vil slippe af med denne meddelelse, kan du indstille ServerName
til din servers domænenavn eller IP-adresse i /etc/apache2/apache2.conf
. Dette er valgfrit, da meddelelsen ikke vil skade.
hvis dit output har Syntax OK
i det, din konfigurationsfil har ingen syntaksfejl. Vi kan sikkert genstarte Apache for at implementere vores ændringer:
- sudo systemctl restart apache2
Trin 5: Test kryptering
nu er vi klar til at teste vores SSL-server.
åbn din internetsøgemaskine, og skriv https://
efterfulgt af din servers domænenavn eller IP i adresselinjen:
https://server_domain_or_IP
da det certifikat, vi oprettede, ikke er underskrevet af en af dine pålidelige certifikatmyndigheder, vil du sandsynligvis se en skræmmende advarsel som den nedenfor:
dette forventes og normalt. Vi er kun interesserede i krypteringsaspektet af vores certifikat, ikke tredjeparts validering af vores værts ægthed. Klik på” Avanceret ” og derefter på linket for at fortsætte til din vært alligevel:
du skal føres til din side. Hvis du kigger i adresselinjen, vil du se en lås med en “h” over den. I dette tilfælde betyder det bare, at certifikatet ikke kan valideres. Det krypterer stadig din forbindelse.
hvis du konfigurerede Apache til at omdirigere HTTP til HTTPS, kan du også kontrollere, om omdirigeringen fungerer korrekt:
http://server_domain_or_IP
hvis dette resulterer i det samme ikon, betyder det, at din omdirigering fungerede korrekt.
Trin 6: Skift til en Permanent omdirigering
hvis din omdirigering fungerede korrekt, og du er sikker på, at du kun vil tillade krypteret trafik, skal du ændre den ukrypterede Apache virtuelle vært igen for at gøre omdirigeringen permanent.
åbn din serverblokkonfigurationsfil igen:
- sudo nano /etc/apache2/sites-available/000-default.conf
Find den Redirect
linje, vi tilføjede tidligere. Tilføj permanent
til den linje, som ændrer omdirigeringen fra en 302 midlertidig omdirigering til EN 301 permanent omdirigering:
<VirtualHost *:80> . . . Redirect permanent "/" "https://your_domain_or_IP/" . . .</VirtualHost>
Gem og luk filen.
Tjek din konfiguration for syntaksfejl:
- sudo apache2ctl configtest
når du er klar, skal du genstarte Apache for at gøre omdirigeringen permanent:
- sudo systemctl restart apache2
konklusion
du har konfigureret din Apache-server til at bruge stærk kryptering til klientforbindelser. Dette giver dig mulighed for at betjene anmodninger sikkert og forhindrer eksterne parter i at læse din trafik.