Kaupallisen SSL-sertifikaatin lisääminen palvelimelle – NameCheap & Apache

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.


TÄTÄ DOKUMENTTIA SAA KOPIOIDA JA MUOKATA GNU GENERAL PUBLIC LICENSE (VERSIO 3 TAI UUDEMPI) MUKAISESTI. HTTP://WWW.GNU.ORG/LICENSES/GPL.HTML
MARKUS PYHÄRANTA

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top