Johdanto
Asensin tässä harjoituksessa kaupallisen ComodoSSL-sertifikaatin omille sivuilleni. Olin aiemmin jo testannut ilmaista Let’s Encrypt-sertifikaattia, jonka asentaminen oli CertBotilla todella nopeaa.
- Sertifikaatin tilasin NameCheapistä.
- Webpalvelinohjelmanani toimii Apache 2.4.18.
- Palvelin on Ubuntu 16.04 pohjainen virtuaalipalvelin, jonka olen vuokrannut DigitalOceanista.
CSR:n luominen palvelimella
Ensiksi piti luoda palvelinpäässä CSR (certificate signing request) eli allekirjoituspyyntö. Kyseessä on viesti, joka lähetetään SSL-varmenteita myöntävälle taholle taholle tarkistusta varten. CSR pitää myös sisällään julkisen avaimeni. Loin CSR:n uuteen kansioon nimeltä csr:
mkdir csr
Sitten hakemistosijainnissa /public_html/blog/csr ajoin seuraavan komennon:
openssl req -new -newkey rsa:2048 -nodes -keyout markuspyharanta.key -out markuspyharanta.csr
Tuo siis loi 2048 bittisen henkilökohtaisen avaimen ja aloitti allekirjoituspyynnön generoinnin.
Vastailin kysymyksiin:
Generating a 2048 bit RSA private key ............+++ ...................+++ writing new private key to 'markuspyharanta.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:FI State or Province Name (full name) [Some-State]:'kotikuntani' Locality Name (eg, city) []:'kotikaupunkini' Organization Name (eg, company) [Internet Widgits Pty Ltd]:Markus Pyhäranta Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:markuspyharanta.com Email Address []:''sähköpostiosoitteeni' Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:'salasanani' An optional company name []: markus@markuspyharanta:~/public_html/blog/csr$ ls markuspyharanta.csr markuspyharanta.key
SSL-sertifikaatin tilaaminen
Tilasin sertifikaattini samasta paikasta, josta olen domain nimenikin vuokrannut. NameCheap on ihan kätevä ja edullinen.
Itselleni riitti Comodon PositiveSSL hintaan 7,80€ vuodessa. Se sallii ainoastaan yhden domain-nimen.
Kun, tilaus oli tehty, aktivoin sertifikaatin NameCheapin hallintapaneelin kautta:
Seuraavaksi minulta pyydettiin sitä CSR-koodia, jonka loin aiemmin palvelimellani. Kopion sen sisällön sille tarkoitettuu ruutuun. Primary domain-kenttä täyttyi sitten itsestään, sillä olin määritellyt domainin CSR:ää luodessani.
Seuraavassa vaiheessa minun tuli valita webpalvelimeni konfiguraatio. Valitsin sen, jossa oli Apache.
Palvelinkonfiguraation määrittelemisen jälkeen, minun piti valita DCV metodi. Tämä on se tapa, jolla sertifikaatteja myöntävä auktoriteetti varmistaa, että olet oikeasti kyseisen domainin omistaja.
Vaihtoehtoja on kolme:
1. Sähköposti-vahvistus
2. DNS-pohjainen vahvistus
3. HTTP-pohjainen vahvistus
Sähköposti-vahvistuksessa sertifikaatin myöntäjä laittaa sinun palvelimesi admin-sähköpostiin viestiä, jonka kautta vahvistat olevasi domainin omistaja.
DNS-pohjaisessa vahvistuksessa pitää luoda domainisi DNS-sääntöihin erityinen CNAME record. Recordin tiedot saa sertifikaatin aktivoinnin jälkeen.
HTTP-pohjaisessa vahvistuksessa pitää ladata tietty .txt-tiedosto palvelimelle polkuun /.well-known/pki-validation/.
Itse käytin DNS-vahvistusta, vaikka se onkin hitaampi (sertifikaatin myöntämisessä voi mennä useampi tunti).
Viimeisessä vaiheessa määrittelelin sen sähköpostiosoitteen, johon haluan sertifikaattini sitten lähetettävän.
Lopuksi sain vielä yleisnäkymän valitsemistani asetuksista. Kaikki oli OK, joten painoin Submit.
Sertifikaatin aktivointi oli nyt aloitettu, ja se olit tilassa ALERT. Tämä johtui siitä, että varmenteita myöntävä taho ei ole vielä todentanut minua domainin omistajaksi. Jotta he pystyivät tekemään niin, minun piti ensin tehdä se CNAME record DNS-sääntöihini.
DNS-pohjainen vahvistus
Ennen kuin pystyin lisäämään CNAME recordin, tarvitsin ne tiedot sitä varten. Ne löytyivät seuraavasti:
Domain-nimien listasta valitsin PositiveSSL:n valikosta Manage.
Certificate versions alta See Details.
Edit Methods-valikosta painoin Get Record.
Aukeaa ikkuna, josta sain tarvittavat tiedot CNAME recordin luomiseksi:
Tärkeää on tietää, että Hostin kohdalla oma domain-nimi lisätään pisteen jälkeen automaattisesti. Sitä ei kuitenkaan tule laittaa siihen CNAME recordiin. Eli hostista laitetaan ainoastaan se domainia edeltävä merkkijono + piste!
Target-kenttä taas kopiodaan suoraan kokonaisuudessaan.
TTL-arvo laitetaan NameCheapin suosituksesta mahdollisimman pieneksi. Itse laitoin 1 min.
Navigoin siis NameCheapin hallintapaneelista domainini Advanced DNS-valikkoon, josta loin uuden recordin.
Valitsin tyypiksi CNAME ja täytin Host- ja Value-kentät sekä Time to liven arvon. Lopuksi tallensin kaikki muutokset.
Nyt vaan piti odottaa joitain tunteja, kunnes sertifikaatti myönnetään minulle.
Tuli kuitenkin ongelma, sillä yli kahdeksan tunnin odottelun jälkeen sertifikaattia ei vieläkään oltu myönnetty. Tarkistin CNAME recordin tiedot useampaan kertaan, mutta kaikki oli oikein.
Sitten huomasin, että olin ottanut Domainiini käyttöön WhoisGuard Protectionin. Kyseinen palvelu on kaikille NameCheapin kautta nimensä vuokranneille ilmainen ensimmäisen vuoden ajan. Palvelu on kätevä, sillä se peittää nimen omistajan todelliset henkilötiedot muilta netin käyttäjiltä. Jos palvelu ei olisi käytössäni, niin kuka tahansa voi domain-nimeni perusteella tarkistaa mm. kuka sen omistaa, missä hän asuu, sähköpostiosoite jne…
WhoisGuard aktivoituna tietoni sijasta muut näkevät vaan WhoisGuardin tiedot:
Palvelu on kuitenkin ongelmallinen sertifikaattia myönnettäessä, sillä varmenteen myöntävä auktoriteetti ei pysty tarkistamaan domain-nimen omistaman henkilön tietoja, joita se sitten vertaa siihen CSR allekirjoituspyyntöön, jonka täytin aiemmin palvelimellani. He eivät siis pysty todentamaan minua domainin omistajaksi, jos WhoisGuard on käytössä!
WhoisGuard Protection pitää ottaa pois päältä, kunnes sertifikaatti on myönnetty.
Muutaman tunnin odottelun jälkeen sertifikaattini tila oli muuttunut ALERT:ista tilaan ACTIVE.
Manage-napin kautta pääsin sivulle, jossa See Details-painikkeen alavalikosta sai sertifikaatin ladattua. Sertifikaatin statuksena näkyi täältä myös ISSUED.
Sertifikaatti latautui .zip-pakettina. Se tuli myös sähköpostiini, jos olisin halunnut ladata sen sitä kautta.
Purin paketin, ja se piti sisällään kolme tiedostoa. Noista kaksi ladataan palvelimelle, eli markuspyharanta_com.ca-bundle ja markuspyharanta_com.crt -suojausvarmenne.
Koska sertifikaatti oli jo myönnetty, niin kävin myös laittamassa WhoisGuardin takaisin päälle.
Sertifikaatin asennus palvelimelle
Sertifikaatit ladataan palvelimelle hakemistosijaintiin:
/etc/ssl/
Huomasin, että kyseinen hakemisto on kokonaan root-käyttäjän omistuksessa, jolloin en voinut omalta sudo-ryhmään kuuluvalta käyttäjältäni kirjoittaa sinne mitään.
Päätin, etten ala muuttaman hakemiston oikeuksia, vaan kirjaudun nyt poikkeuksellisesti sisään rootilla sertifikaatin asennuksen ajaksi. Koska olin aiemmin lukinnut koko root-käyttäjän ja estänyt sillä kirjautumiset SSH:n kautta, niin minun tuli ottaa kyseinen tunnus takaisin voimaan:
sudo usermod --unlock root
Sitten muokkasin /etc/ssh/sshd_config ja vaihdoin sieltä seuraavan rivin arvoksi “yes“.
PermitRootLogin yes
Root-käyttäjälle kirjautuminen onnistui nyt. Käytin WinSCP-ftp-clientia tiedostojen siirtoon palvelimelle Windows-tietokoneeltani.
Kansioon /etc/ssl/ siirsin markuspyharanta_com.ca-bundle ja markuspyharanta_com.crt -tiedostot.
root@markuspyharanta:/etc/ssl# ls certs markuspyharanta_com.ca-bundle markuspyharanta_com.crt openssl.cnf private
Minun henkilökohtainen avain markuspyharanta.key, jonka loin CSR:n yhteydessä, oli tallennettuna kotihakemistooni csr-kansioon. Siirsin sen sieltä hakemistoon /etc/ssl/private/
root@markuspyharanta:/etc/ssl/private# ls markuspyharanta.key ssl-cert-snakeoil.key
Sertifikaatti löytyi nyt sivulta, mutta vielä täytyi määritellä Apachelle, että mistä se löytyy. Muokkasin sivustoni konfiguraatiota sijainnissa /etc/apache2/sites-available/markus.conf
Lisäsin sinne seuraavat rivit:
SSLEngine on SSLCertificateFile /etc/ssl/markuspyharanta_com.crt SSLCertificateKeyFile /etc/ssl/private/markuspyharanta.key SSLCertificateChainFile /etc/ssl/markuspyharanta_com.ca-bundle
Lisäksi vaihdoin VirtualHostin portiksi 443:
<VirtualHost *:443>
Tuossa otin SSLEngine käyttöön ja määrittelin, mistä sijainnista sertifikaattini tiedostot löytyvät. Sitten, tallensin muutokset.
Kaikki oli nyt valmista https-yhteyttä varten. Testasin, että sertifikaatti toimi sivuillani:
Käyttäjän pakottaminen HTTPS-yhteyteen
Tuolla nykyisellä konfiguraatiolla käyttäjä olisi voinut käyttää joko http- tai https-yhteyttä. Halusin kuitenkin, että sivusto ladataan aina https-yhdeydellä, vaikka käyttäjä yrittäisikin suojaamatonta http-yhteyttä.
Ohjaus voidaan tehdä monella tapaa, mutta Apachen oma dokumentaatio suosittelee uudelleenohjauksen tekemistä sivuston Apache-konfiguraatioon ilman mod_rewrite -moduulia.
Sitä varten muokkasin sivuni Apache-konfiguraatiota. En kuitenkaan tehnyt muutoksia suoraan vanhaan konfiguraatiooni, vaan kopion sen eri nimellä:
cd /etc/apache2/sites-available/ sudo cp markus.conf markus-ssl.conf
Sitten muokkasin tuon uuden konfiguraation tällaiseksi:
<VirtualHost *:80> ServerName www.markuspyharanta.com Redirect permanent / http://markuspyharanta.com/ </VirtualHost> <VirtualHost *:80> ServerName markuspyharanta.com Redirect permanent / https://markuspyharanta.com/ </VirtualHost> <VirtualHost *:443> ServerName markuspyharanta.com ServerAlias www.markuspyharanta.com ServerAdmin webmaster@localhost DocumentRoot /home/markus/public_html/wordpress/ <Directory /home/markus/public_html/wordpress/> AllowOverride All Require all granted Options Indexes FollowSymLinks MultiViews </Directory> SSLEngine on SSLCertificateFile /etc/ssl/markuspyharanta_com.crt SSLCertificateKeyFile /etc/ssl/private/markuspyharanta.key SSLCertificateChainFile /etc/ssl/markuspyharanta_com.ca-bundle <FilesMatch \.php$> SetHandler "proxy:unix:/var/run/php/php7.0-fpm-markus.sock|fcgi://localhost/" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Ensimmäisessä VirtualHostissa uudelleenohjaan www.markuspyharanta.com -osoitteen markuspyharanta.com:iin. Sivussani ei ole www-ali-domainia, mutta jos käyttäjä laittaa sen, niin hänet ohjataan sivulle ilman sitä.
Toinen VirtualHost taas uudelleenohjaa markuspyharanta.com:n suojattuun yhteyteen https://markuspyharanta.com/ -osoitteeseen.
Kolmannessa VirtualHostissa on palvelimeni oikea konfiguraatio. Apachen dokumentaation mukaisesti uudelleenohjaukset laitetaan aina omien VirtualHost-tagien sisään.
Otin sivuston vanhan konfiguraation pois käytöstä ja uuden käyttöön:
sudo a2dissite markus.conf sudo a2ensite markus-ssl.conf sudo service apache2 reload
Testasin, että sivusto latautui oikein https-yhteyteen kaikilla mahdollisilla tavoilla:
http://markuspyharanta.com -> https://markuspyharanta.com http://www.markuspyharanta.com -> https://markuspyharanta.com https://www.markuspyharanta.com -> https://markuspyharanta.com
Kaikki toimi, joten sertifikaatti oli konfiguroitu oikein.