Hem >> Bloggar >> Teknikbloggen >> Aktivera https på apache med letsencrypt under Ubuntu

Aktivera https på apache med letsencrypt under Ubuntu

  • Posted on: 14 March 2016
  • By: Pontus

Dags att börja kryptera trafiken till din webbserver? Ett billigt och bra alternativ är att skaffa gratiscertifikat från letsencrypt. Den enda nackdelen som jag kan hitta är att gamla datorer med Windows XP och Internet Explorer 8 inte fungerar. Det betyder att besökare som fortfarande använder Internet Explorer 8 kommer att få en säkerhetsvarning om de besöker sidan och förmodligen bli livrädda och lämna sidan direkt. Fast om du inte bryr dig om de besökarna så är det bara att köra på. Ja det finns fortfarande användare som använder så gamla system. Det här kanske inte stämmer längre dock, jag vill minnas att de har löst det så att det ska fungerar med de flesta webbläsarna idag.

Let's Encrypt är också fortfarande i beta version med allt vad det innebär. Det finns med andra ord en del buggar kvar. Om du är nyfiken på buggarna så finns allt på sidan för Let's Encrypt på GitHub.

En annan sak att tänka på är att certifikaten bara är giltliga i 90 dagar. Det betyder att det måste förnyas rätt ofta, den processen går dock att automatisera. Hur man kan automatisera kommer jag att komplettera med här senare. 

Mer begränsningar är man kan max skapa 5 certifikat per 7 dagar per domän. Så har du mer subdomäner än fem så kan det ta lite tid att skapa alla. 

Först aktiverar vi modulen för SSL i apache. Skriv följande i en terminal på servern för att aktivera modulen och starta om apache.

$ sudo a2enmod ssl

$ sudo service apache2 restart

Alternativt kan vi med hjälp av puppet och puppetlabs modul apache lägger vi till följande till serverns manifest.

class { 'apache::mod::ssl': 

}

När puppet agenten körs nästa gång (normalt inom 30 minuter) så kommer modulen att aktiveras på webbservern.

Installera letsencrypt

 

Förr fanns inte något färdigt paket för att installera en bot därför finns en text längre ner som beskriver den processn kvar av som historik. Nu är det mycket enklare eftersom att det idag finns färdigt paket för Ubuntu. skriv bara följande kommanond i en terminal.

$ sudo apt-get update

 

$ sudo apt-get install software-properties-common

 

$ sudo add-apt-repository ppa:certbot/certbot

 

$ sudo apt-get update

 

$ sudo apt-get install python-certbot-apache

Därefter kan man antingen sköta allt per automatik.

sudo certbot --apache

Eller bara skapa certifikaten med:

sudo certbot --apache certonly

Kör man det automatiska läget så är det bara att följa instruktionerna.

Här nedanför finns den gamla metoden sparad som historik.

I dagsläget finns det inget färdigt paket för letsencrypt i Ubunut. Därför får vi hämta koden med git. Vi kommer att installera letsencrypt under /opt, vilket är där man rekommenderas att installera egna program. Det går självklart bra att installera det under /usr/local/ eller något liknande om man vill det.

Koden till letsencrypt hämtar vi från deras git arkiv med hjälp av git. Börja därför med att installera git på servern, om det inte redan är installerat.

$ sudo apt-get install git

Därefter kopierar vi koden till servern.

$ sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

Vi har nu allt kod för Let's Encrypt under /opt/letsencrypt. Med letscrypt-auto kan vi nu installera alla paket som behövs.

$ cd /opt/letsencrypt

$ ./letsencrypt-auto --help

Nödvändiga paket installeras och vi kan ta en kopp kaffe så länge.

En sak som jag fastnade på var att min domän var inlagd som en CNAME, det fungerar inte. Så se till att domänen som ska ha ett certifikat har en riktigt A adress i DNSen. Det går bra att ändra till CNAME när processen är klar.

Nu ska vi testa att skapa ett certifikat för att se så att allt fungerar. Det finns en modul som kan sköta ändringarna på apache som behöver göras under verifieringen men det strulade för mig, vet inte om det kanske är för att jag administerar servern med puppet och det är det som ställer till det. Därför kör jag med den manuella metoden.

$ ./letsencrypt-auto --dry-run --manual -d www.example.com certonly

Ange din mailadress.

Ange mailadress

Godkänn villkoren.

Godkänn Let's Encrypts användarvillkor

När vi begär ett certifikat så loggas den förfrågan med vårat IP-nummer. För att komma vidare så väljer vi "yes" att det är ok.

OK att ip-numret sparas?

Därefter får vi lite instruktioner att vi måste skapa en fil på webbservern med ett visst innehåll. Därför skapar vi katalogen och filen på webbservern. Ersätt nedanstående kod med dina värden, du får öppna en ny terminal för att kunna skapa filen eftersom att den första är upptagen med Let's Encrypt programmet.

$ sudo mkdir -p /var/www/www.example.com/.well-known/acme-challenge
$ sudo cd /var/www/www.example.com/
$ sudo printf "%s" Massa-teckenochsiffro-123124 > .well-known/acme-challenge/andra-teckenochsiffror

Därefter går vi tillbaka till letsencrypt och trycker enter.

Nu försöker deras server ansluta till vår server för att se om filen finns, om allt fungerar så ska följande text komma.

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
  /etc/letsencrypt/live/www.example.com/fullchain.pem. Your cert will
  expire on 2016-03-14. To obtain a new version of the certificate in
  the future, simply run Let's Encrypt again.

Grattis vi har nu certifikatet. Fast det här är bara ett test-cert (observera att vi körde med --dry-run) för att kunna se så att det fungerar. När man skapar ett riktigt cert så finns det en begränsning på max 5 förfrågninar på 7 dagar. Nu när vi ser att det fungerar så kör vi om proceduren fast utan --dry-run.

$ ./letsencrypt-auto --verbose  --manual -d www.example.com certonly

Samma frågor kommer igen och i slutet kommer följande.

IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
  e-mails sent to info@example.com.
- Congratulations! Your certificate and chain have been saved at
  /etc/letsencrypt/live/www.example.com/fullchain.pem. Your cert will
  expire on 2016-04-14. To obtain a new version of the certificate in
  the future, simply run Let's Encrypt again.
- Your account credentials have been saved in your Let's Encrypt
  configuration directory at /etc/letsencrypt. You should make a
  secure backup of this folder now. This configuration directory will
  also contain certificates and private keys obtained by Let's
  Encrypt so making regular backups of this folder is ideal.
- If you like Let's Encrypt, please consider supporting our work by:

  Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
  Donating to EFF:                    https://eff.org/donate-le

Tada vi har vårat certifikat. Dags att säg åt apache att använde det.

Lägg till certifikatet i apache2

 

Använde du automatiska metoden till certbot så kan du hoppa över hela det här kapitlet. Det finns kvar för historiken.

Dags att konfigurera apache2 till att använda certifikaten och kryptera trafiken. Vi gör det genom att lägga till en ny virthost som lyssnar på port 443, på den aktiverar vi ssl krypteringen med nycklarna vi har skapat. När vi har testat att allt fungerar så lägger vi in en 301-redirect på den gamla v-host (som lyssnar på port 80) och slussar in alla besökare till den krypterade versionen. På det här sättet funderar den okrypterade traffiken tills vi har hunnit testa att allt fungerar. När vi vet att det fungerar så flyttas besökarna automatiskt över.

Manuella metoden

Om vi inte använder puppet för att administrera webbservern så lägger vi till en ny virthost på vilken vi ska köra med krypterad trafik. Enklaste sättet är att kopiera den befintliga och ändra lite.

Först ändrar vi porten som den lyssnar på till 443. 

<VirtualHost *:443>

Därefter aktiverar vi SSL och anger sökvägarna till certifikaten genom att lägga till nedanstående rader, självklart måste du ändra till dina värden.

 SSLEngine on
 SSLCertificateFile      "/etc/letsencrypt/live/www.example.com/cert.pem"
 SSLCertificateKeyFile   "/etc/letsencrypt/live/www.example.com/privkey.pem"
 SSLCertificateChainFile "/etc/letsencrypt/live/www.example.com/fullchain.pem"
 SSLCACertificatePath    "/etc/ssl/certs"

Slutligen startar vi om apache

$ sudo apachectl configtest

Syntax OK

$ sudo service apache2 restart

Puppet metoden

 

Med apache modulen i puppet så skapar vi en ny virthost genom att kopiera den gamla och ge den ett nytt namn. Därefter ändrar vi porten.

port    => '443',

Så aktiverar vi SSL och lägger till sökvägarna, som vi ändrar till rätt sökvägar.

ssl => true,
ssl_cert => '/etc/letsencrypt/live/www.example.com/cert.pem',
ssl_chain => '/etc/letsencrypt/live/www.example.com/fullchain.pem',
ssl_key  => '/etc/letsencrypt/live/www.example.com/privkey.pem',

Spara och vänta tills det updpateras eller gör en manuell uppdatering på webbservern direkt.

$ sudo puppet agent --test

Testa om det fungerar

Det spännande ögonblicket när vi ska testa om det fungerar är nu. Öppna en webbläsare och gå in på sidan fast med https:// i början. Vi skriver alltså https://www.example.com i adressfältet.

Kolla om du har ett hänglås till vänster om adressen, klicka på hänglåset och se om allt ser ok ut och vi inte får några felmeddelanden.

Om allt fungerar så är det nu dags att redirecta all okrypterad trafik till den säkra sidan. Fungerar det inte? Kan du inte ansluta så kan det vara att du måste öppna port 443 i brandväggen.

Manuella metoden

Antingen kan vi använda oss av rewrite men den bästa metoden är med Redirect direktivet som är en del i mod_alias, den borde vara aktiverad men annars aktiverar du den med nedanstående. När vi lägger till redirecten så kommer besökarna att automatiskt skickas vidare till https sidan. 

$ sudo a2enmod alias

Därefter redigerar vi filen för vårt virthost och lägger till följande rader:

# Redirect all traffic to https
Redirect permanent / https://www.example.com/

Sen kollar vi så att vi har skrivit rätt och om allt är ok så säger vi åt apache att läsa in ändringarna.

$ sudo apachectl configtest

Syntax OK

$ sudo apachectl restart

 

Puppet metoden

Även här använder vi oss av Redirect direktivet. Lägg till följande i virthost för den okrypterade sidan.

redirect_status => 'permanent',
redirect_dest   => 'https://www.example.com/',

Om man vill så kan man ta bort path och docroot direktiven då de inte behövs. Men det gör inget om de är kvar.

Sedan väntar vi tills det har slagit igenom eller påtvingar en uppdatering av puppet.

$ sudo puppet agent --test

 

När allt är klart så testar vi att gå in på sidan med http:// i början, vi ska då automatiskt skickas vidare till https. 

Förnya certifikatet

Certfikitatet som vi har installerat är giltligt i 3 månader, så strax innan det har gått 3 månader behöver vi förnya det.

Om du installerade certbot så installerade den ett cronjob som körs varje månad och förnyar alla cert som det är dags för.

Vill du bara testa om processen fungerar så kan du skriva:

sudo certbot renew --dry-run

Även det är enkelt vi skriver följande.

/opt/letsencrypt/letsencrypt-auto --manual renew --manual-public-ip-logging-ok

letsencrypt kommer nu att gå igenom certfikaten som ligger i /etc/letsencrypt/renewal och förnya de som är på väg att bli för gamla.

Fast den varianten verkar inte fungera längre. Nu så kör jag med 

/opt/letsencrypt/letsencrypt-auto renew --apache

Man kan testa först med att lägga till --dry-run efter för att se så att det fungerar.

Det kan vara bra att lägga det här i en crontab som körs varje månad så behöver man inte glömma bort det.