jak vytvořit Self-Signed SSL certifikát pro Apache v Ubuntu 16.04
Úvod
TLS, nebo transport layer security, a jeho předchůdce SSL, což je zkratka pro secure sockets layer, jsou webové protokoly používané k zabalení normálního provozu do chráněného šifrovaného obalu.
pomocí této technologie mohou servery bezpečně odesílat provoz mezi serverem a klienty bez možnosti zachycení zpráv externími stranami. Systém certifikátů také pomáhá uživatelům při ověřování totožnosti webů, se kterými se připojují.
v této příručce vám ukážeme, jak nastavit certifikát SSL s vlastním podpisem pro použití s webovým serverem Apache na serveru Ubuntu 16.04.
Poznámka: self-signed certifikát bude šifrovat komunikaci mezi serverem a klienty. Protože však není podepsán žádným z důvěryhodných certifikačních autorit zahrnutých do webových prohlížečů, uživatelé nemohou certifikát použít k automatickému ověření identity vašeho serveru.
certifikát s vlastním podpisem může být vhodný, pokud nemáte doménové jméno přidružené k vašemu serveru a pro případy, kdy šifrované webové rozhraní není orientováno na uživatele. Pokud máte název domény,v mnoha případech je lepší použít certifikát podepsaný CA. Zde se dozvíte, jak nastavit bezplatný důvěryhodný certifikát s projektem Let ‚ s Encrypt.
předpoklady
než začnete, měli byste mít uživatele, který není root, nakonfigurován s oprávněními sudo
. Můžete se dozvědět, jak nastavit takový uživatelský účet podle našeho počátečního nastavení serveru pro Ubuntu 16.04.
budete také muset mít nainstalovaný webový server Apache. Pokud chcete na svůj server nainstalovat celý zásobník LAMP (Linux, Apache, MySQL, PHP), můžete postupovat podle našeho průvodce nastavením LAMP na Ubuntu 16.04. Pokud chcete pouze webový server Apache, přeskočte kroky týkající se PHP a MySQL v průvodci.
po dokončení předpokladů pokračujte níže.
Krok 1: Vytvořte certifikát SSL
TLS / SSL funguje pomocí kombinace veřejného certifikátu a soukromého klíče. Klíč SSL je na serveru utajen. Používá se k šifrování obsahu odeslaného klientům. Certifikát SSL je veřejně sdílen s kýmkoli, kdo o obsah požádá. Může být použit k dešifrování obsahu podepsaného přidruženým klíčem SSL.
pomocí OpenSSL můžeme vytvořit pár klíčů a certifikátů s vlastním podpisem v jediném příkazu:
- sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
budete požádáni o řadu otázek. Než to přejdeme, podívejme se na to, co se děje v příkazu, který vydáváme:
- openssl: Toto je základní nástroj příkazového řádku pro vytváření a správu certifikátů, klíčů a dalších souborů OpenSSL.
- req: tento dílčí příkaz určuje, že chceme použít správu požadavků na podpis certifikátu x.509 (CSR). „X. 509“ je standard infrastruktury veřejných klíčů, který SSL a TLS dodržují pro správu klíčů a certifikátů. Chceme vytvořit nový x. 509 cert, takže používáme tento dílčí příkaz.
- – x509: To dále upravuje předchozí dílčí příkaz tím, že sdělí obslužnému programu, že chceme vytvořit certifikát s vlastním podpisem namísto generování požadavku na podpis certifikátu, jak by se obvykle stalo.
- -uzly: to říká OpenSSL přeskočit možnost zabezpečit náš certifikát pomocí přístupového hesla. Potřebujeme, aby Apache byl schopen číst soubor bez zásahu uživatele, když se server spustí. Přístupová fráze by tomu zabránila, protože bychom ji museli zadat po každém restartu.
- – dny 365: Tato volba nastavuje dobu, po kterou bude certifikát považován za platný. Stanovili jsme to na jeden rok.
- – newkey rsa: 2048: to určuje, že chceme vygenerovat nový certifikát a nový klíč současně. V předchozím kroku jsme nevytvořili klíč, který je nutný k podpisu certifikátu, takže jej musíme vytvořit spolu s certifikátem. Část
rsa:2048
říká, že vytvoří klíč RSA, který je dlouhý 2048 bitů. - – keyout: tento řádek říká OpenSSL, kam umístit vygenerovaný soubor soukromého klíče, který vytváříme.
- – ven: To řekne OpenSSL, kam umístit certifikát, který vytváříme.
jak jsme uvedli výše, tyto možnosti vytvoří jak soubor klíče, tak certifikát. Budeme požádáni o několik otázek týkajících se našeho serveru, abychom správně vložili informace do certifikátu.
vyplňte výzvy odpovídajícím způsobem. Nejdůležitější řádek je ten, který požaduje Common Name (e.g. server FQDN or YOUR name)
. Musíte zadat název domény přidružený k vašemu serveru nebo spíše veřejnou IP adresu vašeho serveru.
celá výzva bude vypadat takto:
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
oba soubory, které jste vytvořili, budou umístěny do příslušných podadresářů adresáře /etc/ssl
.
zatímco používáme OpenSSL, měli bychom také vytvořit silnou skupinu Diffie-Hellman, která se používá při vyjednávání dokonalého dopředného tajemství s klienty.
můžeme to udělat zadáním:
- sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
může to trvat několik minut, ale až bude hotovo, budete mít silnou skupinu DH na /etc/ssl/certs/dhparam.pem
, kterou můžeme použít v naší konfiguraci.
Krok 2: nakonfigurujte Apache tak, aby používal SSL
vytvořili jsme naše soubory klíčů a certifikátů v adresáři /etc/ssl
. Nyní stačí upravit naši konfiguraci Apache, abychom je mohli využít.
provedeme několik úprav naší konfigurace:
- vytvoříme fragment konfigurace, abychom určili silné výchozí nastavení SSL.
- upravíme přiložený virtuální hostitelský soubor SSL Apache tak, aby ukazoval na naše generované certifikáty SSL.
- (doporučeno) upravíme nešifrovaný soubor virtuálního hostitele tak, aby automaticky přesměrovával požadavky na šifrovaného virtuálního hostitele.
až skončíme, měli bychom mít zabezpečenou konfiguraci SSL.
Vytvořte úryvek konfigurace Apache se silným nastavením šifrování
nejprve vytvoříme úryvek konfigurace Apache, abychom definovali některá nastavení SSL. To nastaví Apache se silnou šifrovací sadou SSL a povolí některé pokročilé funkce, které pomohou udržet náš server v bezpečí. Parametry, které nastavíme, mohou být použity libovolnými virtuálními hostiteli umožňujícími SSL.
vytvořte nový úryvek v adresáři /etc/apache2/conf-available
. Pojmenujeme soubor ssl-params.conf
, abychom objasnili jeho účel:
- sudo nano /etc/apache2/conf-available/ssl-params.conf
Chcete-li nastavit Apache SSL bezpečně, budeme používat doporučení Remy van Elst na Cipherli.st místo. Tato stránka je navržena tak, aby poskytovala snadno použitelná nastavení šifrování pro populární software. Více o jeho rozhodnutích týkajících se voleb Apache si můžete přečíst zde.
navrhovaná nastavení na výše uvedeném webu nabízejí silnou bezpečnost. Někdy, to přichází za cenu větší kompatibility s klienty. Pokud potřebujete podporovat starší klienty, existuje alternativní seznam, ke kterému se dostanete kliknutím na odkaz na stránce označené „Ano, dej mi ciphersuite, který pracuje se starším / starým softwarem.“Tento seznam lze nahradit níže zkopírovanými položkami.
výběr konfigurace, kterou používáte, bude do značné míry záviset na tom, co potřebujete podporovat. Oba budou poskytovat velkou bezpečnost.
pro naše účely můžeme zkopírovat poskytnutá nastavení v plném rozsahu. Uděláme jen dvě malé změny.
nastavte direktivu SSLOpenSSLConfCmd DHParameters
tak, aby ukazovala na soubor Diffie-Hellman, který jsme vygenerovali dříve. Taky, chvíli si přečtěte na HTTP Strict Transport Security, nebo HSTS, a konkrétně o funkčnosti“ předpětí“. Předběžné načítání HSTS poskytuje zvýšenou bezpečnost, ale může mít dalekosáhlé důsledky, pokud je omylem povoleno nebo povoleno nesprávně. V této příručce nebudeme předinstalovat nastavení, ale můžete to upravit, pokud jste si jisti, že rozumíte důsledkům:
# 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"
Uložte a zavřete soubor po dokončení.
upravte výchozí soubor virtuálního hostitele Apache SSL
dále upravme /etc/apache2/sites-available/default-ssl.conf
, výchozí soubor virtuálního hostitele Apache SSL. Pokud používáte jiný soubor bloku serveru, nahraďte jeho název v níže uvedených příkazech.
než půjdeme dál, pojďme zálohovat původní virtuální hostitelský soubor SSL:
- sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak
nyní otevřete soubor virtuálního hostitele SSL a proveďte úpravy:
- sudo nano /etc/apache2/sites-available/default-ssl.conf
uvnitř, s odstraněním většiny komentářů, by měl soubor virtuálního hostitele vypadat ve výchozím nastavení takto:
<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>
provedeme drobné úpravy souboru. Nastavíme normální věci, které bychom chtěli upravit ve virtuálním hostitelském souboru (ServerAdmin e-mailová adresa, název serveru atd.), upravte směrnice SSL tak, aby ukazovaly na naše soubory certifikátů a klíčů, a odkomentujte jednu část, která poskytuje kompatibilitu pro starší prohlížeče.
po provedení těchto změn by měl váš blok serveru vypadat podobně:
<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>
Uložte a zavřete soubor po dokončení.
(doporučeno) upravte nešifrovaný soubor virtuálního hostitele tak, aby byl přesměrován na HTTPS
v současné době bude server poskytovat jak nešifrovaný HTTP, tak šifrovaný HTTPS provoz. Pro lepší zabezpečení se ve většině případů doporučuje přesměrovat HTTP na HTTPS automaticky. Pokud tuto funkci nechcete nebo potřebujete, můžete tuto sekci bezpečně přeskočit.
Chcete-li upravit nešifrovaný soubor virtuálního hostitele tak, aby přesměroval veškerý provoz tak, aby byl šifrován SSL, můžeme otevřít soubor /etc/apache2/sites-available/000-default.conf
:
- sudo nano /etc/apache2/sites-available/000-default.conf
uvnitř, v rámci konfiguračních bloků VirtualHost
, stačí přidat direktivu Redirect
, směřující veškerý provoz na verzi webu SSL:
<VirtualHost *:80> . . . Redirect "/" "https://your_domain_or_IP/" . . .</VirtualHost>
Uložte a zavřete soubor po dokončení.
Krok 3: Upravte bránu Firewall
pokud máte povolenou bránu firewall ufw
, jak doporučuje průvodce předpokladem, může být nutné upravit nastavení tak, aby umožňovalo provoz SSL. Naštěstí Apache registruje několik profilů s ufw
po instalaci.
dostupné profily můžeme vidět zadáním:
- sudo ufw app list
měli byste vidět seznam, jako je tento:
OutputAvailable applications: Apache Apache Full Apache Secure OpenSSH
aktuální nastavení můžete vidět zadáním:
- sudo ufw status
pokud jste dříve povolili pouze pravidelný provoz HTTP, váš výstup může vypadat takto:
OutputStatus: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Apache (v6) ALLOW Anywhere (v6)
Chcete-li dodatečně povolit provoz HTTPS, můžeme povolit profil „Apache Full“ a poté odstranit redundantní příspěvek profilu “ Apache:
- sudo ufw allow 'Apache Full'
- sudo ufw delete allow 'Apache'
váš stav by nyní měl vypadat takto:
- sudo ufw status
OutputStatus: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache Full ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Apache Full (v6) ALLOW Anywhere (v6)
Krok 4: Povolte změny v Apache
Nyní, když jsme provedli změny a upravili náš firewall, můžeme povolit moduly SSL a záhlaví v Apache, povolit našeho virtuálního hostitele připraveného na SSL a restartovat Apache.
pomocí příkazu a2enmod
můžeme povolit mod_ssl
, modul Apache SSL a mod_headers
, které potřebují některá nastavení v našem úryvku SSL:
- sudo a2enmod ssl
- sudo a2enmod headers
dále můžeme povolit našeho virtuálního hostitele SSL příkazem a2ensite
:
- sudo a2ensite default-ssl
budeme také muset povolit náš soubor ssl-params.conf
, abychom si mohli přečíst hodnoty, které jsme nastavili:
- sudo a2enconf ssl-params
v tomto okamžiku jsou naše stránky a potřebné moduly povoleny. Měli bychom zkontrolovat, zda v našich souborech nejsou žádné chyby syntaxe. Můžeme to udělat zadáním:
- sudo apache2ctl configtest
pokud je vše úspěšné, získáte výsledek, který vypadá takto:
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
první řádek je pouze zpráva oznamující, že direktiva ServerName
není nastavena globálně. Pokud se chcete této zprávy zbavit, můžete nastavit ServerName
na název domény nebo IP adresu vašeho serveru v /etc/apache2/apache2.conf
. To je volitelné, protože zpráva nepoškodí.
pokud má váš výstup Syntax OK
, konfigurační soubor nemá žádné chyby syntaxe. Můžeme bezpečně restartovat Apache a implementovat naše změny:
- sudo systemctl restart apache2
Krok 5: Test šifrování
nyní jsme připraveni otestovat náš SSL server.
otevřete webový prohlížeč a do adresního řádku zadejte https://
a poté název domény nebo IP vašeho serveru:
https://server_domain_or_IP
protože certifikát, který jsme vytvořili, není podepsán jedním z důvěryhodných certifikačních autorit vašeho prohlížeče, pravděpodobně uvidíte děsivě vypadající varování, jako je následující:
to se očekává a normální. Zajímá nás pouze aspekt šifrování našeho certifikátu, nikoli ověření pravosti hostitele třetí stranou. Klikněte na „Upřesnit“ a poté na odkaz, který chcete stejně přejít k hostiteli:
měli byste být přesměrováni na svůj web. Pokud se podíváte do adresního řádku prohlížeče, uvidíte zámek s „x“ nad ním. V tomto případě to znamená, že certifikát nelze ověřit. Stále šifruje vaše připojení.
pokud jste nakonfigurovali Apache pro přesměrování HTTP na HTTPS, můžete také zkontrolovat, zda přesměrování funguje správně:
http://server_domain_or_IP
pokud to má za následek stejnou ikonu, znamená to, že vaše přesměrování fungovalo správně.
Krok 6: Změna na trvalé přesměrování
pokud vaše přesměrování fungovalo správně a jste si jisti, že chcete povolit pouze šifrovaný provoz, měli byste znovu upravit nešifrovaný virtuální hostitel Apache, aby bylo přesměrování trvalé.
znovu otevřete konfigurační soubor bloku serveru:
- sudo nano /etc/apache2/sites-available/000-default.conf
najděte řádek Redirect
, který jsme přidali dříve. Přidejte permanent
na tento řádek, který změní přesměrování z dočasného přesměrování 302 na trvalé přesměrování 301:
<VirtualHost *:80> . . . Redirect permanent "/" "https://your_domain_or_IP/" . . .</VirtualHost>
Uložte a zavřete soubor.
zkontrolujte, zda v konfiguraci nejsou chyby syntaxe:
- sudo apache2ctl configtest
až budete připraveni, restartujte Apache, aby bylo přesměrování trvalé:
- sudo systemctl restart apache2
závěr
nakonfigurovali jste server Apache tak, aby používal silné šifrování pro připojení klientů. To vám umožní bezpečně doručovat požadavky a zabrání tomu, aby si externí strany přečetly váš provoz.