tiistai 19. helmikuuta 2019

SSL-sertifikaatti omalle koneelle

Web-tekniikat kuten Push-notifikaatiot, paikannus ja Bluetooth vaativat salattua Https-yhteyttä. Tämä voi aiheuttaa ylimääräistä vaivaa kehitettäessä palveluita omalla tietokoneella, jolla ei useinkaan ole kiinteää IP-osoitetta tai pysyvää verkkotunnusta. Alla olevilla ohjeilla luot tarvittavat sertifikaatit omalle tietokoneellesi, jotta voit käyttää Https-yhteyttä kehityksessä!

1. Luo ensin juuriavain salasanalla
openssl genrsa -des3 -out rootCA.key 2048

2. Luo juurisertifikaatti (root certificate) äsken luodulla avaimella
openssl req -x509 -new -nodes -key rootCA.key -days 1024 -out rootCA.crt

3. Luo palvelimen avain (ilman salasanaa, jotta Apache käynnistyy automaattisesti)
openssl genrsa -out localhost.key 2048

4. Luo asetustiedosto san.cfg
vim san.cfg

5. Kopioi asetustiedostoon rivit:
default_bits = 2048
distinguished_name = dn
x509_extensions = san
req_extensions = san
extensions = san
[dn]
countryName = Country Name (2 letter code)
stateOrProvinceName = State or Province Name (full name)
localityName = Locality Name (eg, city)
organizationName = Organization Name (eg, company)
commonName = Common Name (e.g. server FQDN or YOUR name)
[san]
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
DNS.2 = www.localhost

Muuta DNS.1 ja DNS.2 -rivit, jos haluat saada SSL-sertifikaatin aliverkkotunnukselle.

6. Luo varmennepyyntö palvelimelle (certificate request):
openssl req -new -key localhost.key -out localhost.csr -config san.cfg

7. Allekirjoita varmennepyyntö juuriavaimella ja -sertifikaatilla:
openssl x509 -req -in localhost.csr -CA rootCA.crt -CAkey rootCA.key \
-CAcreateserial -out localhost.crt -days 500 -extfile san.cfg

8. Muokkaa Apachen asetustiedostoa
sudo vim /etc/httpd/vhosts.d/000-default.conf

9. Lisää asetustiedostoon VirtualHost portille 443
<VirtualHost *:80>
    DocumentRoot "/home/teppo/public_html"
    ServerName localhost
</VirtualHost>

<VirtualHost *:443>
    DocumentRoot "/home/teppo/public_html"
    ServerName localhost
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/localhost.crt
    SSLCertificateKeyFile /etc/ssl/private/localhost.key

    # Enable forward secrecy
    SSLProtocol all -SSLv2 -SSLv3
    SSLHonorCipherOrder On
    SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"
</VirtualHost>

missä /home/teppo/public_html on hakemisto, jonka alta nettisivut löytyvät.

10. Kopioi palvelimen avain ja sertifikaatti talteen Apachea varten
sudo cp localhost.key /etc/ssl/private/localhost.key
sudo cp localhost.crt /etc/ssl/certs/localhost.crt

11. Asenna juurisertifikaatti käyttöjärjestelmään (arch)
sudo trust anchor rootCA.crt

12. Käynnistä Apache uudelleen
sudo systemctl restart httpd

13. Avaa nettiselain (esim Chrome tai Firefox) ja kirjoita osoiteriville https://localhost

Jos kaikki meni oikein, niin näet osoitepalkissa lukon kuvakkeen merkiksi siitä, että selain on hyväksynyt sertifikaatit.




Lähteet:
  1. turlucode.com
  2. serverfault.com

Lisäys 23.11.2022: Jamie Nguyenin blogista löytyy laajempi selvitys sertifikaattien perustamisesta. Jamien ohjeilla saat käyttöön myös keskitason varmenteet, joiden avulla voit hallinnoida usean palvelimen verkkoa.

maanantai 28. tammikuuta 2019

Drupal 8:n päivitys (nopea ja hauras tapa)

Nämä ohjeet toimivat ainakin Sigmaticin palvelimilla. Ohjeet voivat toimia myös muilla palvelimilla/virtuaalikoneilla, joilla on yli 1 gigatavu muistia ja joille on asennettu vaadittavat komentoriviohjelmat: PHP, MySQL, Git ja Drush.

Huomaa, että jos jotain menee vikaan, niin päivitys saattaa rikkoa tuotannossa olevan sivuston!

1. Ota varmuuskopio koodeista ja tietokannasta
cd /var/www
tar --gzip -cvf ~/backup/DIR-2019-01-28.tar.gz DIR
mysqldump -uUSER -pPASS DB | gzip > ~/backup/DIR-2019-01-28.sql.gz

missä /var/www on Apachen juurihakemisto, DIR on hakemistonimi Apachen juurihakemistossa, USER on tietokantakäyttäjän nimi, PASS on tietokannan salasana ja DB on tietokannan nimi.

2. Päivitä Drupal uusimpaan versioon:
cd DIR
php composer update --with-dependencies
drush updb
drush cr

missä DIR on composer.json-tiedoston sisältävä hakemisto. (Composer tulee olla asennettu Drupalin kylkeen nimellä 'composer', jotta tämä vaihe toimii.)

Drupal 8:n päivitys (hidas ja varma tapa)

Nämä ohjeet toimivat pienimmilläkin Amazonin virtuaalikoneilla ja jopa Nettihotelli.fi:n chrootatussa putkassa (kunhan SSH on avattu asiakaspalvelusta ja tietokantaa käsitellään hallintapaneelin kautta). Ohjeet voivat toimia myös muilla virtuaalikoneilla, joilla on alle 1 gigatavu muistia, rajoitetut verkkoyhteydet tai palvelimelta puuttuu tärkeitä ohjelmia kuten PHP komentotulkki, MySQL komentotulkki, Git, Drush tai Wget.

1. Aseta sivusto huoltotilaan

2. Kirjaudu sisään www-palvelimelle SSH:lla

3. Ota kopio sivustosta:
cd /var/www
tar --gzip -cvf ~/DIR-2019-01-28.tar.gz DIR

missä /var/www on Apachen juurihakemisto ja DIR on sivuston sisältävä hakemisto.

4. Ota kopio tietokannasta (Nettihotelli.fi:n palvelimilla käytä hallintapaneelia):
mysqldump -uUSER -pPASS DB | gzip > ~/DIR-2019-01-28.sql.gz

missä USER on tietokantakäyttäjän nimi, PASS on tietokantakäyttäjän salasana, DB on tietokannan nimi ja DIR on sivuston nimi kohdasta 3.

5. Avaa uusi konsoli paikallisesssa koneessa ja kopioi sivusto www-palvelimelta:
cd ~/projektit/omat
scp HOST:DIR-2019-01-28.tar.gz .
scp HOST:DIR-2019-01-28.sql.gz .

missä HOST on www-palvelimen nimi, ja DIR on kohdissa 3 ja 4 käyttämäsi sivuston/hakemiston nimi.

6. Pura sivuston koodi paikallisella koneella:
rm -fr DIR
gunzip -c DIR-2019-01-28.tar.gz | tar xvf -

missä DIR on kohdissa 3 ja 4 käyttämäsi sivuston nimi.

7. Pura tietokanta paikalliseen koneeseen:
gunzip -c DIR-2019-01-28.sql.gz | mysql -uUSER -pPASS DB

missä DIR on sivuston nimi, USER on tietokantakäyttäjän nimi, PASS on tietokantakäyttäjän salasana ja DB on tietokannan nimi. Ensimmäisellä kerralla luo tietokanta ja käyttäjätunnus samoilla tiedoilla kuin www-palvelimella, jotta voit purkaa tietokannan kopion helposti myöhemmin uudelleen samaan kantaan.

8. Korjaa tiedostojen oikeudet, jos käytät mod_php:tä omalla koneellasi:
cd DIR
chmod -R g+rw .
chgrp -R www-data web/sites/default/files
chgrp -R www-data web/sites/default/private
find web/sites/default/files -type d -exec chmod g+xs {} \;
find web/sites/default/private -type d -exec chmod g+xs {} \;
find web/sites/default/files -type d -exec setfacl -dm g::rwx {} \;
find web/sites/default/private -type d -exec setfacl -dm g::rwx {} \;

missä DIR on sivuston nimi ja www-data on Apachen ryhmä, jolla on kirjoitusoikeus tiedostoihin.

9. Lisää sivusto Apacheen (tarvitsee tehdä vain ensimmäisen kerran) avaamalla tiedosto /etc/httpd/conf/extra/httpd-vhosts.conf (Arch linux) ja lisäämällä sinne rivit:
<Directory "/home/teppo">
    AllowOverride all
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Require method GET POST OPTIONS
</Directory>

<VirtualHost *:80>
    DocumentRoot "/home/teppo/DIR/web"
    ServerName DIR.localhost
</VirtualHost>

missä /home/teppo on kotihakemistosi ja DIR on kohdassa 6 luomasi hakemiston nimi.

10. Avaa nettiselain ja mene osoitteeseen http://DIR.localhost, missä DIR on aiemmin asettamasi sivuston nimi. Jos edelliset vaiheet menivät oikein, niin sinulla on nyt toimiva kopio sivustosta.

11. Päivitä Drupal uusimpaan versioon:
php composer update --with-dependencies
drush updb
drush cr

Composer tulee olla asennettu Drupalin kylkeen nimellä 'composer', jotta tämä vaihe toimii.

12. Avaa nettiselain ja mene osoitteeseen http://DIR.localhost, missä DIR on aiemmin asettamasi sivuston nimi. Kirjaudu sisään Drupaliin ja tarkista saatavilla olevat päivitykset. Jos kaikki meni oikein, niin varoitus tietoturvapäivityksestä on kadonnut.

13. Ota kopio päivitetystä versiosta ja tietokannasta:
cd ..
tar --gzip -cvf uusi-2019-01-28.tar.gz DIR
mysqldump -uUSER -pPASS DB | gzip > ~/uusi-2019-01-28.sql.gz

missä DIR on sivuston nimi, USER on tietokantakäyttäjän nimi, PASS on tietokannan salasana ja DB on tietokannan nimi.

14. Siirrä päivitetty sivusto ja tietokanta www-palvelimelle:
scp uusi-2019-01-28.tar.gz uusi-2019-01-28.sql.gz HOST:

missä HOST on www-palvelimen nimi.

15. Kirjaudu www-palvelimelle SSH:lla

16. Pura tietokantakopio www-palvelimella (Nettihotelli.fi:n palvelimilla käytä hallintapaneelia):
gunzip -c uusi-2019-01-28.sql.gz | mysql -uUSER -pPASS DB

missä USER on tietokantakäyttäjän nimi, PASS on tietokantakäyttäjän salasana, DB on tietokannan nimi.

17. Pura koodit www-palvelimella
cd /var/www
rm -fr DIR
gunzip -c ~/uusi-2019-01-28.tar.gz | tar xvf -

missä /var/www on Apachen juurihakemisto ja DIR on hakemistonimi palvelimella.

18. Korjaa tiedostojen oikeudet, jos www-palvelimella käytetään mod_php:tä:
cd DIR
chmod -R g+rw .
chgrp -R www-data web/sites/default/files
chgrp -R www-data web/sites/default/private
find web/sites/default/files -type d -exec chmod g+xs {} \;
find web/sites/default/private -type d -exec chmod g+xs {} \;
find web/sites/default/files -type d -exec setfacl -dm g::rwx {} \;
find web/sites/default/private -type d -exec setfacl -dm g::rwx {} \;
chmod 444 web/sites/default/files/.htaccess

missä DIR on kohdassa 17 luotu hakemisto palvelimella ja www-data on Apachen ryhmä, jolla on kirjoitusoikeus tiedostoihin.

19. Kirjaudu sisään Drupaliin www-palvelimella ja tarkista, että kaikki toimii

20. Lopuksi ota huoltotila pois päältä ja poista tarpeettomat gz tiedostot