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 %} |