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é:
root@alfonz:/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:
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:
- 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]
- 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ť](https://letsencrypt.org/2015/11/09/why-90-days.html). 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.
- - - - - -