HTTPS: certifikát od Letsencrypt na Openshift zadarmo

To, čo robí Letsencrypt považujem za počin roku. Doteraz sa dali certifikáty len kúpiť, aj keď souki začal minulý rok cez simpliu ponúkať certifikáty za 99kč na rok, letsencrypt bude “vytvárať” dôveryhodné certifikáty pre hocijakú doménu zdarma (okrem tých na google spam liste). Michal Špaček s jeho prednáškami a ananásom už dlho straší, aké jednoduché je odpočúvať nezabezpečený traffic. Nedávno vyšla beta a tak som chcel nasadenie certifikátu vyskúšať. Aj keď si platím server na vpsfree.cz, rád používam na Django projekty Openshift. Jeden taký web ukladá finančné dáta užívateľov a preto je vhodné použiť https. Aj som zvedavý, aké zložité bude nasadenie.

Tak budem podporovať https na doméne digrin.com. Aj keď ku dnu tohto článku je letsencrypt v beta verzii, ssl certifikát by mal byť plne funkčný. V prvom rade treba registrovať doménu u letsencrypt a požiadať o zapojenie do beta programu. Po pár dňoch mi prišiel celkom dlhý email s návodom. Inšlatácia na linuxe celkom v pohode(stačí sťiahnuť letsencrypt):

git clone https://github.com/letsencrypt/letsencrypt

Pre apache by sa spúšťal zhruba takýto kód, ktorý by mal certifikáty nastaviť a aj automaticky obnovoval.

./letsencrypt-auto --apache

Bohužiaľ na Openshifte nemám práva root a tak potrebujem vytvoriť certifikáty na localhoste v notebooku a potom ich uploadnuť na Openshift server.

./letsencrypt-auto certonly --manual -d digrin.com -d www.digrin.com

pripadne:

./letsencrypt-auto certonly --manual --email [email protected] --agree-tos --manual-public-ip-logging-ok -d www.digrin.com -d digrin.com --expand

Po spustení príkazu mi nabehne nasledovná správa:

Make sure your web server displays the following content at
http://www.digrin.com/.well-known/acme-challenge/fqTGI3nUiYnelmtyKgEvnS before continuing:

fqTGI3nUiYnelmtyKgEvnSJXyV

Content-Type header MUST be set to text/plain.

Z čoho logicky chápem, že je to nejaká verifikácia vlastníctva domény. Pridávam teda do django app nasledovný kód:
urls.py

url(r'^.well-known/acme-challenge/.*', views.https_confirmation, name="https_confirmation"),

A vo views.py definujem metódu https_confirmation ako:

def https_confirmation(request):
    if request.META['HTTP_HOST'] == 'www.digrin.com':
        return HttpResponse("fqTGI3nUiYnelm...", content_type="text/plain")
    else: #naked domain digrin.com
        return HttpResponse("HASH pre digrin.com", content_type="text/plain")

Je potrebné túto stránku nastaviť kým ešte beží príkaz letsencrypt-auto, pretože vyššie spomínané hashe sa pri každom spustení generujú nové. Po kontrole, či sa adresa na digrin.com naozaj nachádza, potvrdzujem enterom (pre každú subdoménu treba resetovať web na openshift aby sa zobrazoval spravny kód). Vyberám Easy mode a certifikáty sú vytvorené:

[email protected]:/etc/letsencrypt/live/www.digrin.com# ls
cert.pem  chain.pem  fullchain.pem  privkey.pem

Na Openshifte sa ku každej doméne dajú pridať certifikáty. Stránka vyzerá nasledovne:

openshift--https

To by bolo k certifikátom všetko. Doména digrin.com nefunguje na https, používam ju len na redirect na www.digrin.com. To je chyba, ale nechám na neskôr jej nastavenie (subreg nepodporuje naked domain redirect). Hodnotenie na https://www.ssllabs.com/ssltest/ je A.

Django settings pre https

Táto časť je celkom jednoduchá, má len tri kroky:

  1. Nastaviť ssl pre cookies (v súbore settings.py):
    if not DEBUG:
        SESSION_COOKIE_SECURE = True
        CSRF_COOKIE_SECURE = True
  2. Povoliť HTTPS (vytvoriť súbor wsgi/.htaccess) a v ňom:
    RewriteEngine on
    
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
  3. Povoliť HTTPS pre WSGI (pridať do súboru wsgi/application ):
    # make django aware that SSL is turned on
    os.environ['HTTPS'] = "on"

Ako sa zobrazí zelené okienko pri adrese sa už môžete pozrieť aj sami. Certifikát treba každých 90 dní obnovovať. O automatickú aktualizáciu certifikátov sa vám pod apache2 postará sám klient letsencrypt a čoskoro by mal pribudnúť aj nginx. Bohužiaľ ja na Openshift nemôžem nainštalovať letsencrypt a tak  to bude musieť obnovovat manuálne.


Leave a Reply

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