Hoe maak je een zelfondertekend SSL-certificaat voor Apache in Ubuntu 16.04
introductie
TLS, of transport Layer security, en zijn voorganger SSL, wat staat voor secure sockets layer, zijn webprotocollen die worden gebruikt om normaal verkeer in een beveiligde, versleutelde wrapper te wikkelen.
met behulp van deze technologie kunnen servers veilig verkeer tussen de server en clients verzenden zonder dat de berichten door derden kunnen worden onderschept. Het certificaatsysteem helpt gebruikers ook bij het verifiëren van de identiteit van de sites waarmee ze verbinding maken.
in deze gids laten we u zien hoe u een zelfondertekend SSL-certificaat kunt instellen voor gebruik met een Apache-webserver op een Ubuntu 16.04-server.
opmerking: een zelfondertekend certificaat versleutelt de communicatie tussen uw server en alle clients. Gebruikers kunnen het certificaat echter niet gebruiken om de identiteit van uw server automatisch te valideren, omdat het niet is ondertekend door een van de vertrouwde certificaatautoriteiten die bij webbrowsers zijn inbegrepen.
een zelfondertekend certificaat kan geschikt zijn als u geen domeinnaam aan uw server hebt gekoppeld en voor gevallen waarin de versleutelde webinterface niet op de gebruiker gericht is. Als je een domeinnaam hebt, is het in veel gevallen beter om een CA-ondertekend certificaat te gebruiken. U kunt hier lezen hoe u een gratis vertrouwd certificaat kunt instellen met het project Let ‘ s Encrypt.
Prerequisites
voordat u begint, moet u een niet-root gebruiker hebben geconfigureerd met sudo
privileges. U kunt leren hoe u een dergelijk gebruikersaccount kunt instellen door onze initiële serverinstellingen voor Ubuntu 16.04 te volgen.
u moet ook de Apache webserver geïnstalleerd hebben. Als u een hele LAMP (Linux, Apache, MySQL, PHP) stack op uw server wilt installeren, kunt u onze handleiding volgen over het instellen van LAMP op Ubuntu 16.04. Als je gewoon de Apache webserver wilt, sla dan de stappen met betrekking tot PHP en MySQL in de gids over.
wanneer u de Voorwaarden hebt vervuld, ga dan verder hieronder.
Stap 1: Maak het SSL certificaat
TLS / SSL werkt met behulp van een combinatie van een publiek certificaat en een private sleutel. De SSL-sleutel wordt geheim gehouden op de server. Het wordt gebruikt om inhoud verzonden naar clients te versleutelen. Het SSL-certificaat wordt openbaar gedeeld met iedereen die de inhoud aanvraagt. Het kan worden gebruikt om de inhoud te decoderen ondertekend door de bijbehorende SSL-sleutel.
we kunnen een zelfondertekend sleutel-en certificaatpaar maken met OpenSSL in een enkel commando:
- sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
u zult een reeks vragen worden gesteld. Voordat we dat bespreken, laten we eens kijken naar wat er gebeurt in het commando dat we geven:
- openssl: Dit is het basis commandoregelgereedschap voor het maken en beheren van OpenSSL-certificaten, sleutels en andere bestanden.
- req: deze subopdracht geeft aan dat we X. 509 certificate signing request (CSR) – beheer willen gebruiken. De “X. 509” is een openbare-sleutelinfrastructuurstandaard die SSL en TLS naleven voor het sleutel-en certificaatbeheer. We willen een nieuw X. 509 cert maken, dus we gebruiken dit subcommando.
- – x509: Dit wijzigt verder de vorige subopdracht door het hulpprogramma te vertellen dat we een zelfondertekend certificaat willen maken in plaats van een certificaatondertekeningsverzoek te genereren, zoals normaal zou gebeuren.
- – nodes: dit vertelt OpenSSL om de optie om ons certificaat te beveiligen met een wachtzin over te slaan. We hebben Apache nodig om het bestand te kunnen lezen, zonder tussenkomst van de gebruiker, wanneer de server opstart. Een wachtwoordzin zou dit voorkomen omdat we het na elke herstart zouden moeten invoeren.
- – dagen 365: Met deze optie wordt de duur van de geldigheid van het certificaat ingesteld. We zetten het hier op een jaar.
- – newkey rsa: 2048: geeft aan dat we tegelijkertijd een nieuw certificaat en een nieuwe sleutel willen genereren. We hebben niet de sleutel gemaakt die nodig is om het certificaat te ondertekenen in een vorige stap, dus moeten we het samen met het certificaat maken. Het
rsa:2048
gedeelte vertelt het om een RSA sleutel te maken die 2048 bits lang is. - – keyout: deze regel vertelt OpenSSL waar het gegenereerde privésleutelbestand dat we maken moet worden geplaatst.
- – out: Dit vertelt OpenSSL waar het certificaat moet worden geplaatst dat we maken.
zoals hierboven vermeld, zullen deze opties zowel een sleutelbestand als een certificaat aanmaken. We zullen een paar vragen over onze server worden gesteld om de informatie correct in het certificaat in te voegen.
vul de aanwijzingen op de juiste wijze in. De belangrijkste regel is degene die de Common Name (e.g. server FQDN or YOUR name)
aanvraagt. U moet de domeinnaam invoeren die is gekoppeld aan uw server of, waarschijnlijker, het publieke IP-adres van uw server.
het geheel van de prompts ziet er ongeveer zo uit:
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
beide bestanden die u hebt aangemaakt zullen in de juiste submappen van de /etc/ssl
map worden geplaatst.
terwijl we OpenSSL gebruiken, moeten we ook een sterke Diffie-Hellman groep creëren, die wordt gebruikt bij het onderhandelen over perfecte Forward Secrecy met klanten.
we kunnen dit doen door te typen:
- sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
dit kan een paar minuten duren, maar als het klaar is, heb je een sterke DH-groep op /etc/ssl/certs/dhparam.pem
die we kunnen gebruiken in onze configuratie.
Stap 2: Configureer Apache om SSL
te gebruiken we hebben onze sleutel-en certificaatbestanden gemaakt onder de /etc/ssl
map. Nu hoeven we alleen nog maar onze Apache configuratie aan te passen om hiervan te profiteren.
we zullen enkele aanpassingen aan onze configuratie doen:
- We zullen een configuratiefragment maken om sterke standaard SSL-instellingen op te geven.
- we zullen het meegeleverde SSL Apache Virtual Host bestand wijzigen om naar onze gegenereerde SSL certificaten te verwijzen.
- (aanbevolen) we zullen het niet-versleutelde virtuele Hostbestand wijzigen om verzoeken automatisch om te leiden naar de versleutelde virtuele Host.
als we klaar zijn, moeten we een beveiligde SSL-configuratie hebben.
Maak een Apache – Configuratiefragment aan met sterke versleutelingsinstellingen
eerst maken we een Apache-configuratiefragment om enkele SSL-instellingen te definiëren. Dit zal Apache instellen met een sterke SSL cipher suite en het inschakelen van een aantal geavanceerde functies die zullen helpen om onze server veilig te houden. De parameters die we zullen instellen kunnen worden gebruikt door virtuele Hosts die SSL inschakelen.
Maak een nieuw fragment aan in de /etc/apache2/conf-available
map. We zullen het bestand ssl-params.conf
een naam geven om het doel duidelijk te maken:
- sudo nano /etc/apache2/conf-available/ssl-params.conf
om Apache SSL veilig op te zetten, zullen we gebruik maken van de aanbevelingen van Remy van Elst op de Cipherli.st site. Deze site is ontworpen om gemakkelijk te consumeren encryptie-instellingen voor populaire software. U kunt meer lezen over zijn beslissingen met betrekking tot de Apache keuzes hier.
de voorgestelde instellingen op de site waarnaar hierboven wordt verwezen, bieden een sterke beveiliging. Soms, dit komt ten koste van een grotere client Compatibiliteit. Als u oudere clients wilt ondersteunen, is er een alternatieve lijst die toegankelijk is door te klikken op de link op de pagina met het label “Ja, geef me een cijfersuite die werkt met oudere / oude software.”Die lijst kan worden vervangen voor de items hieronder gekopieerd.
de keuze van welke configuratie u gebruikt zal grotendeels afhangen van wat u moet ondersteunen. Ze zullen beiden grote veiligheid bieden.
voor onze doeleinden kunnen we de opgegeven instellingen in hun geheel kopiëren. We zullen slechts twee kleine veranderingen aanbrengen.
Stel de SSLOpenSSLConfCmd DHParameters
richtlijn in om te wijzen naar het Diffie-Hellman bestand dat we eerder gegenereerd hebben. Neem ook even de tijd om te lezen over HTTP Strict Transport Security, of HST ‘ s, en specifiek over de “preload” functionaliteit. Het vooraf laden van HST ‘ s biedt een verhoogde beveiliging, maar kan verstrekkende gevolgen hebben als het per ongeluk of verkeerd is ingeschakeld. In deze gids zullen we de instellingen niet vooraf laden, maar u kunt dit wijzigen als u zeker weet dat u de implicaties begrijpt:
# 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"
sla het bestand op en sluit het als u klaar bent.
Wijzig het standaard Apache SSL Virtual Host bestand
vervolgens Wijzigen we /etc/apache2/sites-available/default-ssl.conf
, het standaard Apache SSL Virtual Host bestand. Als je een ander Server blok bestand gebruikt, vervang dan de naam in de commando ‘ s hieronder.
voordat we verder gaan, laten we een back-up maken van het originele SSL virtuele Host bestand:
- sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak
open nu het SSL Virtual Host-bestand om aanpassingen te maken:
- sudo nano /etc/apache2/sites-available/default-ssl.conf
binnen, met de meeste opmerkingen verwijderd, zou het virtuele Host bestand er standaard ongeveer zo uit moeten zien:
<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>
we zullen enkele kleine aanpassingen aan het bestand maken. We zullen de normale dingen die we zouden willen aanpassen in een virtuele Host bestand (ServerAdmin e-mailadres, servernaam, enz.), pas de SSL-richtlijnen aan om naar onze certificaat-en sleutelbestanden te verwijzen, en verwijder een sectie die compatibiliteit biedt voor oudere browsers.
na het maken van deze wijzigingen zou uw serverblok er ongeveer zo uit moeten zien:
<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>
sla het bestand op en sluit het als u klaar bent.
(aanbevolen) Wijzig het niet-versleutelde virtuele Hostbestand om te leiden naar HTTPS
zoals het nu is, zal de server zowel niet-versleuteld HTTP-als versleuteld HTTPS-verkeer leveren. Voor een betere beveiliging is het in de meeste gevallen aan te raden om HTTP automatisch om te leiden naar HTTPS. Als u deze functionaliteit niet wilt of nodig hebt, kunt u deze sectie veilig overslaan.
om het niet-versleutelde virtuele Hostbestand aan te passen om al het verkeer om te leiden naar SSL-versleuteling, kunnen we het /etc/apache2/sites-available/000-default.conf
bestand openen:
- sudo nano /etc/apache2/sites-available/000-default.conf
binnen, binnen de VirtualHost
configuratieblokken, hoeven we alleen maar een Redirect
richtlijn toe te voegen, die al het verkeer naar de SSL-versie van de site wijst:
<VirtualHost *:80> . . . Redirect "/" "https://your_domain_or_IP/" . . .</VirtualHost>
sla het bestand op en sluit het als u klaar bent.
Stap 3: Pas De Firewall
aan als u de firewall ufw
hebt ingeschakeld, zoals aanbevolen door de vereisten-gidsen, moet u mogelijk de instellingen aanpassen om SSL-verkeer toe te staan. Gelukkig registreert Apache een paar profielen met ufw
bij de installatie.
zien We de beschikbare profielen door te typen:
- sudo ufw app list
U ziet een lijst als deze:
OutputAvailable applications: Apache Apache Full Apache Secure OpenSSH
U kunt de huidige instelling door te typen:
- sudo ufw status
Als je alleen toegestaan normaal HTTP-verkeer eerder de uitvoer kan er als volgt uitzien:
OutputStatus: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Apache (v6) ALLOW Anywhere (v6)
bovendien laat het HTTPS-verkeer, we kunnen de “Apache Volledige profiel in en verwijder de overbodige “Apache” profiel uitkering:
- sudo ufw allow 'Apache Full'
- sudo ufw delete allow 'Apache'
Uw status moet komen te zien nu:
- sudo ufw status
OutputStatus: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache Full ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Apache Full (v6) ALLOW Anywhere (v6)
Stap 4: Schakel de wijzigingen in Apache
nu we onze wijzigingen hebben aangebracht en onze firewall hebben aangepast, kunnen we de SSL en headers modules in Apache inschakelen, onze SSL-ready virtuele Host inschakelen en Apache opnieuw opstarten.
we kunnen mod_ssl
, de Apache SSL-module en mod_headers
inschakelen, die nodig zijn voor sommige instellingen in ons SSL-fragment, met het commando a2enmod
:
- sudo a2enmod ssl
- sudo a2enmod headers
vervolgens kunnen we onze SSL virtuele Host inschakelen met het a2ensite
Commando:
- sudo a2ensite default-ssl
we zullen ook ons ssl-params.conf
bestand moeten inschakelen, om in de waarden te lezen die we hebben ingesteld:
- sudo a2enconf ssl-params
op dit moment zijn onze site en de benodigde modules ingeschakeld. We moeten controleren of er geen syntaxisfouten in onze bestanden zitten. We kunnen dit doen door te typen:
- sudo apache2ctl configtest
als alles succesvol is, krijg je een resultaat dat er zo uitziet:
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
de eerste regel is slechts een bericht dat de ServerName
richtlijn niet Globaal is ingesteld. Als u van dat bericht af wilt, kunt u ServerName
instellen op de domeinnaam of het IP-adres van uw server in /etc/apache2/apache2.conf
. Dit is optioneel omdat het bericht Geen kwaad kan.
als uw uitvoer Syntax OK
bevat, bevat uw configuratiebestand geen syntaxfouten. We kunnen Apache veilig herstarten om onze wijzigingen door te voeren:
- sudo systemctl restart apache2
Stap 5: Test encryptie
nu zijn we klaar om onze SSL-server te testen.
Open uw webbrowser en typ https://
gevolgd door de domeinnaam of IP van uw server in de adresbalk:
https://server_domain_or_IP
omdat het certificaat dat we hebben gemaakt niet is ondertekend door een van de vertrouwde certificaatautoriteiten van uw browser, ziet u waarschijnlijk een eng uitziende waarschuwing zoals hieronder:
dit wordt verwacht en normaal. We zijn alleen geïnteresseerd in de encryptie aspect van ons certificaat, niet de derde partij validatie van de authenticiteit van onze host. Klik op “Geavanceerd” en dan de link om verder te gaan naar uw host anyways:
u moet naar uw site worden gebracht. Als u in de adresbalk van de browser kijkt, ziet u een slot met een “x” erop. In dit geval betekent dit gewoon dat het certificaat niet kan worden gevalideerd. Het is nog steeds het versleutelen van uw verbinding.
Als u Apache hebt geconfigureerd om HTTP om te leiden naar HTTPS, kunt u ook controleren of de omleiding correct werkt:
http://server_domain_or_IP
als dit resulteert in hetzelfde pictogram, betekent dit dat uw redirect correct werkte.
Stap 6: Verander naar een permanente omleiding
als uw omleiding correct werkte en u zeker weet dat u alleen versleuteld verkeer wilt toestaan, dient u de niet-versleutelde Apache virtuele Host opnieuw aan te passen om de omleiding permanent te maken.
Open het configuratiebestand voor serverblokken opnieuw:
- sudo nano /etc/apache2/sites-available/000-default.conf
Zoek de Redirect
regel die we eerder hebben toegevoegd. Voeg permanent
toe aan die regel, die de omleiding verandert van een 302 tijdelijke omleiding naar een 301 permanente omleiding:
<VirtualHost *:80> . . . Redirect permanent "/" "https://your_domain_or_IP/" . . .</VirtualHost>
het bestand opslaan en sluiten.
Controleer uw configuratie op syntaxfouten:
- sudo apache2ctl configtest
als je klaar bent, herstart Apache om de redirect permanent te maken:
- sudo systemctl restart apache2
conclusie
u hebt uw Apache-server geconfigureerd om sterke versleuteling te gebruiken voor clientverbindingen. Dit zal u toelaten om verzoeken veilig te dienen, en zal voorkomen dat externe partijen van het lezen van uw verkeer.