You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
307 lines
18 KiB
307 lines
18 KiB
{% extends "base.html" %} {% block content %}
|
|
|
|
<h1>Certificaten</h1>
|
|
|
|
<p>Bij dit onderdeel gaan we aan de slag met certificaten. De tool die we daarvoor gaan gebruiken is OpenSSL. Dit is een veelgebruikt
|
|
programma waar je vele cryptografische dingen mee kunt doen.</p>
|
|
|
|
<p>Op Linux en Mac OS X is deze tool al geïnstalleerd, Windows gebruikers moeten deze nog installeren. Als je
|
|
<a href="http://google.nl/?q=openssl+windows+install" target="_blank">zoekt op het internet</a> vindt je verschillende mogelijkheden om dat te doen. Bijvoorbeeld de v.1.1.0f Light versie op
|
|
<a href="http://slproweb.com/products/Win32OpenSSL.html" target="_blank">deze website</a>. Let op dat je dan op de Windows command line het hele pad moet gebruiken in plaats van alleen 'openssl'.
|
|
Bijvoorbeeld:
|
|
<span class="argument">C:\OpenSSL-Win32\bin\openssl.exe</span>
|
|
</p>
|
|
|
|
<p>Als je bij het gebruik van OpenSSL errors krijgt, probeer dan eerst je command prompt als Administrator te openen. En als
|
|
dat ook niet werkt om het volgende commando uit te voeren:</p>
|
|
|
|
<code class="terminal">SET OPENSSL_CONF=[pad naar bestand]\openssl.cfg</code>
|
|
|
|
<hr>
|
|
|
|
<blockquote>Wie ben jij? En waarom zou ik jou vertrouwen dat je bent wie je zegt dat je bent?</blockquote>
|
|
|
|
<p>Dat zijn vragen die webbrowsers elke dag moeten beantwoorden. Een site kan wel vinden dat het www.rabobank.nl is, maar daarmee
|
|
weet een browser nog niet zeker dat het ook daadwerkelijk de webserver van de Rabobank is. Misschien zit je eigenlijk te
|
|
communiceren met een server ergens in Rusland van een persoon die maar al te graag je inlogcodes wil weten.</p>
|
|
|
|
<p>Om dit probleem op te lossen zijn er certificaten bedacht en vastgelegd in de
|
|
<a href="http://en.wikipedia.org/wiki/X.509">X.509</a> standaard. Certificaten zijn kleine bestandjes waarin een identiteit staat beschreven. Dit is bijvoorbeeld een
|
|
certificaat van Paul Wagener:</p>
|
|
|
|
<img src="/static/img/certificaat.png" class="center-block" style="border: 1px solid black">
|
|
|
|
<p>Nu wil jij natuurlijk meteen een eigen certificaat voor jezelf hebben, en dat kan! Met dit alles-in-1 commando maak je een
|
|
certificaat dat helemaal van jou is:</p>
|
|
|
|
<code class="terminal">openssl req -x509 -nodes -newkey rsa:2048 -keyout sleutel.key -out certificaat.crt</code>
|
|
|
|
<p>Dit commando doet een paar dingen tegelijk waar we later op terugkomen. Nadat je de gevraagde informatie hebt ingevuld staat
|
|
er in het bestand certificaat.crt jouw certificaat. Met dit commando kan je je nieuwe certificaat bewonderen:</p>
|
|
|
|
<code class="terminal">openssl x509 -text -in certificaat.crt</code>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Maak een certificaat met je eigen gegevens</span>
|
|
</div>
|
|
|
|
<p>Een certificaat heeft ook altijd een
|
|
<em>verstrekker</em> (issuer). Dit is de persoon of bedrijf die het certificaat heeft gemaakt en daarmee garant staat dat de
|
|
identiteit die op het certificaat staat ook klopt. In jouw certificaat staat dat je over jezelf hebt gezegd dat je bent
|
|
wie je zegt dat je bent. Niet echt betrouwbare informatie dus... Iedereen zou precies datzelfde certificaat kunnen maken.</p>
|
|
|
|
<p>Het wordt pas interessant en betrouwbaar als andere partijen het certificaat verstrekken en zo kunnen zeggen dat ze de gegevens
|
|
van het certificaat gecontroleerd hebben. Als jij die verstrekker vertrouwt dat hij zijn werk goed doet met de correctheid
|
|
van certificaten controleren. Dan vertrouw je ook indirect de gegevens op het certificaat. Zo hoef je maar een handjevol
|
|
verstrekkers te vertrouwen om bijna alle websites op het internet te kunnen vertrouwen.</p>
|
|
|
|
<p>Elke besturingssysteem heeft een lijst van basis verstrekkers die ze impliciet vertrouwen, deze lijst kan je bekijken en
|
|
veranderen door in je geavanceerde browserinstellingen op zoek te gaan naar een knop 'Beheer certificaten' (te vinden in
|
|
het Advanced -> Certificates tabblad in Firefox).</p>
|
|
|
|
<p>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Hoeveel basis verstrekkers vertrouwt jouw systeem?</span>
|
|
</div>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Bekijk het certificaat van
|
|
<a href="https://facebook.com/" target="_blank">Facebook</a>, welk bedrijf heeft dit certificaat verstrekt?</span>
|
|
</div>
|
|
|
|
<p class="hint">Hint: Het certificaat kan je in de meeste browsers bekijken door op het slot-ikoontje te klikken. In Chrome moet je de
|
|
Developer Tools openen en kijken in het mapje 'Security'.</p>
|
|
|
|
<h2>Mag ik uw handtekening?</h2>
|
|
|
|
<p>Zo'n certificaat wat je aan jezelf hebt verstrekt vertrouwd natuurlijk niemand. We moeten eerst iemand vinden die jouw
|
|
certificaat wil ondertekenen.</p>
|
|
|
|
<p>Er is een speciaal bestandsformaat om aan een verstrekker te vragen of hij jouw certificaat wil ondertekenen:
|
|
<b>.csr</b>. Dat staat voor Certificate Signing Request. Een soort van bedelbrief die je rond kan sturen met je certificaat
|
|
waar nog een verstrekker bij moet.</p>
|
|
|
|
<p>Je kan onderstaand commando gebruiken om je eigen gemaakte certificaat als basis te gebruiken voor zo'n Certificate Signing
|
|
Request:
|
|
</p>
|
|
|
|
<code class="terminal">openssl x509 -x509toreq -in certificaat.crt -signkey sleutel.key -out certificaat_verzoek.csr</code>
|
|
|
|
<p>Zo'n verzoekje kan je vervolgens bij een certificaat autoriteit zoals Thawte of VeriSign inleveren. Voor een paar honderd
|
|
euro zijn ze dan bereid om hun handtekening eronder te zetten.</p>
|
|
|
|
<p>Om deze cursus relatief goedkoop te houden heeft deze site ook een certificaat autoriteit waar je certificaten kan laten
|
|
ondertekenen:
|
|
<a href="/sign" target="signen">Certificaat Autoriteit</a>. Gebruik deze site om jouw certificaat te laten ondertekenen</p>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Bekijk het certificaat wat je hebt teruggekregen. Welke persoon heeft dit certificaat aan jou verstrekt?</span>
|
|
</div>
|
|
|
|
<h2>Zelf verstrekken</h2>
|
|
|
|
<blockquote>Sometimes, the only one you can trust is yourself.</blockquote>
|
|
|
|
<p>Om zelf verstrekker te spelen heb je helemaal geen speciale certificaten nodig. Je kan namelijk gewoon je eigen certificaat
|
|
en sleutel gebruiken die je aan het begin van de les hebt gemaakt.</p>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Vraag een medecursist om een Certificate Signing Request van zijn certificaat te geven en onderteken dat met je eigen
|
|
certificaat. Zoek op internet het commando op waarmee je dat kan doen.</span>
|
|
</div>
|
|
|
|
<p>Tip: zorg ervoor dat jouw certificaat standaard wordt geinstalleerd op alle besturingsystemen. Dan kan je goud geld verdienen
|
|
met het ondertekenen van andere certificaten ;)</p>
|
|
|
|
<!--
|
|
<h2>Websites beveiligen</h2>
|
|
|
|
<p>Leuk die certificaten, maar laten we niet vergeten dat we er ook nog wat nuttigs mee kunnen doen. Namelijk onze internetverbindingen
|
|
beveiligen. Om hiermee te oefenen moet je
|
|
<a href="/static/vm.zip">deze virtual machine</a> downloaden. Het wachtwoord van deze VM is
|
|
<b>
|
|
<i>sec2</i>
|
|
</b>. We hebben een aantal dingen gewijzigd hierin:</p>
|
|
|
|
<ul>
|
|
<li>Er is een default Apache installatie aanwezig.</li>
|
|
<li>www.security2.nl en websec.paulwagener.nl wijzen naar de geïnstalleerde Apache op localhost.</li>
|
|
<li>We hebben
|
|
<a href="/sign" target="signen">deze verstrekker</a> en het Let's Encrypt test certificaat als vertrouwd toegevoegd aan het systeem (dit kan je terugvinden
|
|
als je in je browser gaat kijken naar alle certificaten die zijn geïnstalleerd)</li>
|
|
</ul>
|
|
|
|
<p>Controleer eerst of de site http://www.security2.nl in jouw VM te bereiken is, en via http
|
|
<b>s</b>://www.security2.nl/ nog niet te bereiken is. Je gaat de site in de volgende opgaven beveiligen met SSL, om dat
|
|
te doen moeten we eerst SSL aanzetten in Apache met de volgende commando's:</p>
|
|
|
|
<code class="terminal">sudo a2enmod ssl<br>
|
|
sudo a2ensite default-ssl<br>
|
|
sudo service apache2 reload</code>
|
|
|
|
<p class="hint">Hint: Commando's vul je in in het programma 'Terminal'</p>
|
|
|
|
<p>De site is nu ook via https:// bereikbaar, maar Apache heeft een ongeldig dummy certificaat gebruikt om de site te beveiligen.
|
|
Om het werkend te krijgen moeten we eerst de volgende stappen uitvoeren:</p>
|
|
|
|
<ol>
|
|
<li>Maak een geheel nieuwe certificaat/sleutel combo aan met het commando bovenaan de pagina. Je mag alles invullen zoals
|
|
je wil, behalve de Common Name / Server FQDN. Die moet
|
|
<code>www.security2.nl</code> zijn.</li>
|
|
<li>Laat het certificaat
|
|
<a href="/sign" target="signen">hier</a> weer ondertekenen</li>
|
|
<li>Kopieer het sleutel bestand en het ondertekende certificaat naar de VM</li>
|
|
<li>Voer het volgende commando uit:
|
|
<code class="terminal">sudo gedit /etc/apache2/sites-available/default-ssl.conf</code> om de standaard SSL configuratie aan te passen.</li>
|
|
<li>Verander in dit bestand de
|
|
<code>SSLCertificateFile</code> en
|
|
<code>SSLCertificateKeyFile</code> zodat ze naar jouw certificaat en sleutel bestand wijzen</li>
|
|
<li>Maak je wijzigingen actief door de configuratie opnieuw in te laden:
|
|
<code class="terminal">sudo service apache2 reload</code>
|
|
</li>
|
|
</ol>
|
|
|
|
<p>Als je alles goed hebt gedaan is de site nu met SSL beveiligd! Controleer of je de site in de VM nu kan bereiken via https://www.security2.nl/
|
|
(Alleen Chrome werkt, certificaat is niet aan Firefox toegevoegd). Als je een groen slotje krijgt mag je de volgende
|
|
vraag beantwoorden:</p>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Plak de inhoud van het .crt bestand dat je hebt gebruikt om de website te beveiligen met een groen slotje. (inclusief
|
|
begin en einde
|
|
<code>-----BEGIN CERTIFICATE-----</code>)</span>
|
|
{% include "points.html" with points=answers.answer_openssl_ssl_cert.points max="10" %}
|
|
<textarea class="question-input" name="answer_openssl_ssl_cert">{{ answers.answer_openssl_ssl_cert.string }}</textarea>
|
|
</div>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Maak een screenshot van het groene slotje en de details van het certificaat en upload die naar
|
|
<a href="http://imgur.com" target="_blank">imgur</a>. Plak de URL naar die screenshot als antwoord.</span>
|
|
{% include "points.html" with points=answers.answer_openssl_screenshot.points max="10" %}
|
|
<input class="question-input" name="answer_openssl_screenshot" type="url" value="{{ answers.answer_openssl_screenshot.string }}">
|
|
</div>
|
|
|
|
<img src="/static/img/slotje_certificaat_vm.png" class="center-block screenshot" style="width: 60%">
|
|
|
|
<h2>Let's Encrypt</h2>
|
|
|
|
<img src="/static/img/letsencrypt_logo.png" class="center-block">
|
|
|
|
<p>
|
|
<b>
|
|
</b>
|
|
</p>
|
|
|
|
<p>Sinds 2015 is er
|
|
<a href="https://letsencrypt.org/">een nieuwe speler</a> op de markt die gratis certificaten verstrekt, mits je kan bewijzen dat jouw website van jouw is
|
|
natuurlijk. Dit gaat met behulp van de command-line
|
|
<code>letsencrypt</code> tool die automatisch certificaten maakt en ondertekend voor jouw website. Deze tool hebben we al voor je geinstalleerd
|
|
in de VM.</p>
|
|
|
|
<p>We gaan nu websec.paulwagener.nl beveiligen, niet deze website die je nu aan het bekijken bent, maar weer de localhost
|
|
die in de VM draait. Maar nu gaan we hem met behulp van Let's Encrypt beveiligen.</p>
|
|
|
|
<p>
|
|
<i>Tip:</i>Je mag voor deze opdracht ook een eigen domein dat je hebt beveiligen! Let even op dat de commando's dan niet
|
|
overal exact hetzelfde zijn. Zeker als je geen Apache gebruikt.</p>
|
|
|
|
<p>Controleer eerst dat
|
|
<b>https</b>://websec.paulwagener.nl// in de VM een fout geeft, dat komt omdat het certificaat van de vorige opdracht nog
|
|
steeds van www.security2.nl is (als je de vorige opdracht goed hebt gedaan, anders krijg je misschien een andere fout).
|
|
De browser ziet dat dat niet hetzelfde domein is en geeft terecht een error.</p>
|
|
|
|
<p>We gaan beginnen met het aanvragen van een certificaat. Dit doen we met het volgende commando:
|
|
|
|
<code class="terminal">sudo letsencrypt certonly --manual --staging</code>
|
|
|
|
<p>Even een korte uitleg van dit commando:</p>
|
|
|
|
<ul>
|
|
<li>
|
|
<b>sudo</b>: letsencrypt heeft root rechten nodig, we moeten letsencrypt dus altijd met root rechten uitvoeren</li>
|
|
<li>
|
|
<b>letsencrypt</b>: de naam van het scriptje zelf. Als je dit op je eigen server wil doen moet je deze eerst installeren
|
|
(instructies vind je op de
|
|
<a href="https://letsencrypt.org/getting-started/">Let's Encrypt website</a> zelf). Afhankelijk van hoe letsencrypt is geinstalleerd kan het commando ook
|
|
<code>letsencrypt-auto</code>,
|
|
<code>certbot</code> of
|
|
<code>certbot-auto</code> zijn.</li>
|
|
<li>
|
|
<b>certonly</b>: Standaard wil Let's Encrypt volledig automatisch Apache voor je herconfigureren, maar dat gaat bij
|
|
ons niet werken omdat de VM niet
|
|
<i>echt</i> websec.paulwagener.nl is. Met de certonly optie geven we aan dat we alleen geinteresseerd zijn in het maken
|
|
van nieuwe certificaten.</li>
|
|
<li>
|
|
<b>--manual</b>: De Let's Encrypt servers geven niet zomaar certificaten weg, ze willen altijd zeker weten dat het domein
|
|
waar je een certificaat van aanvraagt ook echt van jou is. Er zijn verschillende manieren om dat te doen, maar ze
|
|
komen er allemaal op neer dat je een specifiek bestandje moet hosten op je website. Met de manual optie moeten we
|
|
onze webserver zelf goed configureren dat het bestandje te bereiken is via het domein. De andere opties (
|
|
<code>--webroot</code>,
|
|
<code>--apache</code>) proberen het bestandje automatisch te plaatsen en de webserver te configureren. Dat gaat voor deze opdracht niet
|
|
werken omdat de echte websec.paulwagener.nl veilig ergens draait en van buiten niet te configureren is.</li>
|
|
<li>
|
|
<b>--staging</b>: Deze optie zorgt ervoor dat je een certificaat krijgt van de test server in plaats van de echte server.
|
|
Deze hebben we nodig omdat de echte server een limiet heeft van 5 certificaataanvragen per week per domein. En dat
|
|
is voor dit vak niet handig. Nadeel van de testserver is dat de certificaten een ongeldige fake verstrekker hebben
|
|
(in de VM hebben we die fake verstrekker toegevoegd als vertrouwd, zodat je alsnog een groen slotje krijgt.)</li>
|
|
</ul>
|
|
|
|
<p>Als je dit commando voor de eerste keer uitvoert wordt er gevraagd naar je e-mailadres, daar kan je invullen wat je wil.
|
|
Voor het domein gaan we websec.paulwagener.nl invullen. Als je je eigen domein wil beveiligen vul je hier uiteraard
|
|
je eigen domein in.</p>
|
|
|
|
<img src="/static/img/letsencrypt_domain.png" class="center-block screenshot" style="width: 80%">
|
|
|
|
<p>Let's Encrypt vraagt daarna om een bestandje op de server te zetten in een hele specifieke map (.well-known/acme-challenge)
|
|
op de echte websec.paulwagener.nl server. Normaliter zou dit een probleem zijn, want dat kan alleen als je toegang
|
|
hebt tot de server. Maar speciaal voor jullie is er
|
|
<a href="/letsencrypt">een pagina</a> waar je de code kan kopieren en er voor zorgen dat het bestandje 10 minuten lang op onze server wordt
|
|
gehost!
|
|
</p>
|
|
|
|
<img src="/static/img/letsencrypt_challenge.png" class="center-block screenshot" style="width: 80%">
|
|
|
|
<p>Nadat de challenge is geslaagd zal Let's Encrypt nog een melding geven over dat de self-verification failed (in de VM
|
|
wijst websec.paulwagener.nl immers naar de localhost, en niet naar het bestandje op de echte server). Maar dat kan
|
|
je negeren, als het goed is gegaan staan de certificaten nu in de map
|
|
<code>/etc/letsencrypt/live/websec.paulwagener.nl</code>!.
|
|
|
|
<img src="/static/img/letsencrypt_congrats.png" class="center-block screenshot" style="width: 80%">
|
|
|
|
<p>Met dit commando kan je je nieuwe certificaat bekijken:</p>
|
|
|
|
<code class="terminal">sudo gedit /etc/letsencrypt/live/websec.paulwagener.nl/fullchain.pem</code>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Plak de inhoud van het
|
|
<code>fullchain.pem</code> certificaat voor websec.paulwagener.nl. (inclusief alle begin en einde
|
|
<code>-----BEGIN CERTIFICATE-----</code>)</span>
|
|
{% include "points.html" with points=answers.answer_openssl_letsencrypt_fullchain.points max="0" %}
|
|
<textarea class="question-input" name="answer_openssl_letsencrypt_fullchain">{{ answers.answer_openssl_letsencrypt_fullchain.string }}</textarea>
|
|
</div>
|
|
|
|
<p>Stel het default-ssl.conf configuratie bestand van Apache nu zo in dat het de certificaten van Let's Encrypt gebruikt:</p>
|
|
|
|
<img src="/static/img/letsencrypt_conf.png" class="center-block screenshot">
|
|
|
|
<p>Sla het bestand op, reload Apache en als het goed is heb je nu een beveiligde https://websec.paulwagener.nl/, helemaal
|
|
gratis en voor niets!</p>
|
|
|
|
<img src="/static/img/letsencrypt_chrome.png" class="center-block screenshot" style="width: 90%">
|
|
|
|
<p>Het zal je misschien opvallen dat de verstrekker Fake is, dat komt omdat we de
|
|
<code>--staging</code> optie hebben gebruikt. In de VM is deze toegevoegd als iets dat we kunnen vertrouwen (en dus een groen slotje oplevert),
|
|
maar in de echte wereld is dat niet zo. Zorg er dus bij je eigen website zo dat je niet de --staging optie gebruikt
|
|
als je voor de echie certificaten aan het maken bent</p>
|
|
|
|
|
|
|
|
<div class="question">
|
|
<span class="question-string">Maak een screenshot van het groene slotje en de details van het certificaat (zoals hierboven, maar natuurlijk niet
|
|
letterlijk dat plaatje, dat hebben we door) en upload die naar
|
|
<a href="http://imgur.com" target="_blank">imgur</a>. Plak de URL naar die screenshot als antwoord.</span>
|
|
{% include "points.html" with points=answers.answer_openssl_letsencrypt_screenshot.points max="0" %}
|
|
<input class="question-input" name="answer_openssl_letsencrypt_screenshot" type="url" value="{{ answers.answer_openssl_letsencrypt_screenshot.string }}">
|
|
</div>
|
|
-->
|
|
{% endblock %} |