parent
29eeac4e78
commit
30b8c224c1
@ -1 +1,4 @@ |
|||||||
.DS_Store |
.DS_Store |
||||||
|
__pycache__ |
||||||
|
/venv |
||||||
|
db.sqlite3 |
||||||
|
@ -0,0 +1,10 @@ |
|||||||
|
#!/usr/bin/env python |
||||||
|
import os |
||||||
|
import sys |
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "securityquiz.settings") |
||||||
|
|
||||||
|
from django.core.management import execute_from_command_line |
||||||
|
|
||||||
|
execute_from_command_line(sys.argv) |
@ -0,0 +1,23 @@ |
|||||||
|
# Generated by Django 2.0.2 on 2018-02-05 13:50 |
||||||
|
|
||||||
|
from django.db import migrations, models |
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration): |
||||||
|
|
||||||
|
initial = True |
||||||
|
|
||||||
|
dependencies = [ |
||||||
|
] |
||||||
|
|
||||||
|
operations = [ |
||||||
|
migrations.CreateModel( |
||||||
|
name='LetsEncryptChallenge', |
||||||
|
fields=[ |
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||||
|
('challenge', models.CharField(max_length=128)), |
||||||
|
('response', models.CharField(max_length=128)), |
||||||
|
('expiry_date', models.DateTimeField()), |
||||||
|
], |
||||||
|
), |
||||||
|
] |
@ -0,0 +1,7 @@ |
|||||||
|
from django.db import models |
||||||
|
|
||||||
|
|
||||||
|
class LetsEncryptChallenge(models.Model): |
||||||
|
challenge = models.CharField(max_length=128) |
||||||
|
response = models.CharField(max_length=128) |
||||||
|
expiry_date = models.DateTimeField() |
@ -0,0 +1,3 @@ |
|||||||
|
django |
||||||
|
django-oauth-toolkit |
||||||
|
django-cors-headers |
@ -0,0 +1,116 @@ |
|||||||
|
""" |
||||||
|
Django settings for securityquiz project. |
||||||
|
|
||||||
|
For more information on this file, see |
||||||
|
https://docs.djangoproject.com/en/1.6/topics/settings/ |
||||||
|
|
||||||
|
For the full list of settings and their values, see |
||||||
|
https://docs.djangoproject.com/en/1.6/ref/settings/ |
||||||
|
""" |
||||||
|
|
||||||
|
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) |
||||||
|
import os, sys |
||||||
|
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) |
||||||
|
|
||||||
|
CLOSED = False |
||||||
|
|
||||||
|
# Quick-start development settings - unsuitable for production |
||||||
|
# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/ |
||||||
|
|
||||||
|
# SECURITY WARNING: keep the secret key used in production secret! |
||||||
|
SECRET_KEY = 'jk3nd2kj3nd2i30do23dn9283nd' |
||||||
|
|
||||||
|
# SECURITY WARNING: don't run with debug turned on in production! |
||||||
|
DEBUG = False |
||||||
|
|
||||||
|
if 'runserver' in sys.argv: |
||||||
|
DEBUG = True |
||||||
|
|
||||||
|
ALLOWED_HOSTS = ['websec.paulwagener.nl'] |
||||||
|
|
||||||
|
|
||||||
|
# Application definition |
||||||
|
|
||||||
|
INSTALLED_APPS = ( |
||||||
|
'django.contrib.admin', |
||||||
|
'django.contrib.auth', |
||||||
|
'django.contrib.contenttypes', |
||||||
|
'django.contrib.sessions', |
||||||
|
'django.contrib.messages', |
||||||
|
'django.contrib.staticfiles', |
||||||
|
'quiz', |
||||||
|
'oauth2_provider', |
||||||
|
'corsheaders', |
||||||
|
) |
||||||
|
|
||||||
|
MIDDLEWARE_CLASSES = ( |
||||||
|
'django.contrib.sessions.middleware.SessionMiddleware', |
||||||
|
'django.middleware.common.CommonMiddleware', |
||||||
|
'django.middleware.csrf.CsrfViewMiddleware', |
||||||
|
'django.contrib.auth.middleware.AuthenticationMiddleware', |
||||||
|
'django.contrib.messages.middleware.MessageMiddleware', |
||||||
|
'django.middleware.clickjacking.XFrameOptionsMiddleware', |
||||||
|
'corsheaders.middleware.CorsMiddleware', |
||||||
|
) |
||||||
|
|
||||||
|
CORS_ORIGIN_ALLOW_ALL = True |
||||||
|
|
||||||
|
ROOT_URLCONF = 'securityquiz.urls' |
||||||
|
|
||||||
|
WSGI_APPLICATION = 'securityquiz.wsgi.application' |
||||||
|
|
||||||
|
# Database |
||||||
|
# https://docs.djangoproject.com/en/1.6/ref/settings/#databases |
||||||
|
|
||||||
|
DATABASES = { |
||||||
|
'default': { |
||||||
|
'ENGINE': 'django.db.backends.sqlite3', |
||||||
|
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
# Internationalization |
||||||
|
# https://docs.djangoproject.com/en/1.6/topics/i18n/ |
||||||
|
|
||||||
|
LANGUAGE_CODE = 'en-us' |
||||||
|
|
||||||
|
TIME_ZONE = 'UTC' |
||||||
|
|
||||||
|
USE_I18N = True |
||||||
|
|
||||||
|
USE_L10N = True |
||||||
|
|
||||||
|
USE_TZ = True |
||||||
|
|
||||||
|
|
||||||
|
# Static files (CSS, JavaScript, Images) |
||||||
|
# https://docs.djangoproject.com/en/1.6/howto/static-files/ |
||||||
|
|
||||||
|
STATIC_URL = '/static/' |
||||||
|
|
||||||
|
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__)) + '/..' |
||||||
|
MEDIA_ROOT = PROJECT_PATH + '/media/' |
||||||
|
|
||||||
|
TEMPLATES = [ |
||||||
|
{ |
||||||
|
'BACKEND': 'django.template.backends.django.DjangoTemplates', |
||||||
|
'DIRS': [PROJECT_PATH + '/templates'], |
||||||
|
'APP_DIRS': True, |
||||||
|
'OPTIONS': { |
||||||
|
'context_processors': [ |
||||||
|
'django.template.context_processors.debug', |
||||||
|
'django.template.context_processors.request', |
||||||
|
'django.contrib.auth.context_processors.auth', |
||||||
|
'securityquiz.settings.closed', |
||||||
|
'django.contrib.messages.context_processors.messages', |
||||||
|
], |
||||||
|
}, |
||||||
|
}, |
||||||
|
] |
||||||
|
|
||||||
|
STATICFILES_DIRS = ( |
||||||
|
PROJECT_PATH + '/static', |
||||||
|
) |
||||||
|
|
||||||
|
def closed(request): |
||||||
|
return {'CLOSED': CLOSED} |
@ -0,0 +1,15 @@ |
|||||||
|
from django.conf.urls import include, url |
||||||
|
from django.contrib import admin |
||||||
|
import views |
||||||
|
|
||||||
|
admin.autodiscover() |
||||||
|
|
||||||
|
urlpatterns = [ |
||||||
|
# Examples: |
||||||
|
url(r'^o/', include('oauth2_provider.urls', namespace='oauth2_provider')), |
||||||
|
url(r'^api/hello', views.SecurityApi.as_view()), |
||||||
|
url(r'^sign$', views.sign), |
||||||
|
url(r'^letsencrypt$', views.letsencrypt), |
||||||
|
url(r'^\.well-known/acme-challenge/(.+)', views.letsencrypt_challenge), |
||||||
|
url(r'^(.*)$', views.home, name='home'), |
||||||
|
] |
@ -0,0 +1,20 @@ |
|||||||
|
""" |
||||||
|
WSGI config for securityquiz project. |
||||||
|
|
||||||
|
It exposes the WSGI callable as a module-level variable named ``application``. |
||||||
|
|
||||||
|
For more information on this file, see |
||||||
|
https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/ |
||||||
|
""" |
||||||
|
|
||||||
|
import os, sys |
||||||
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "securityquiz.settings") |
||||||
|
|
||||||
|
path = '/var/www/security.aardappelschilmesje.nl' |
||||||
|
if path not in sys.path: |
||||||
|
sys.path.append(path) |
||||||
|
|
||||||
|
from django.core.wsgi import get_wsgi_application |
||||||
|
application = get_wsgi_application() |
||||||
|
|
||||||
|
|
@ -0,0 +1,60 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html> |
||||||
|
|
||||||
|
<head> |
||||||
|
<title>Security 1</title> |
||||||
|
<link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css"> |
||||||
|
<link href="/static/css/bootstrap-responsive.min.css" rel="stylesheet" type="text/css"> |
||||||
|
<link href="/static/css/style.css" rel="stylesheet" type="text/css"> |
||||||
|
<script type="text/javascript" src="/static/js/jquery-2.1.0.min.js"></script> |
||||||
|
<script type="text/javascript" src="/static/js/jquery.base64.min.js"></script> |
||||||
|
<script type="text/javascript" src="/static/js/quiz.js"></script> |
||||||
|
</head> |
||||||
|
|
||||||
|
<body> |
||||||
|
<form method="POST" id="form-quiz"> |
||||||
|
{% csrf_token %} |
||||||
|
|
||||||
|
<div class="row-fluid"> |
||||||
|
<div class="well span3" id="menu"> |
||||||
|
|
||||||
|
<h5>Security 1</h5> |
||||||
|
<ul> |
||||||
|
<li> |
||||||
|
<a href="/sql">SQL Injection</a> |
||||||
|
</li> |
||||||
|
<li> |
||||||
|
<a href="/xss">Cross-site Scripting</a> |
||||||
|
</li> |
||||||
|
<li> |
||||||
|
<a href="/wachtwoorden">Wachtwoorden</a> |
||||||
|
</li> |
||||||
|
<li> |
||||||
|
<a href="/oauth">OAuth</a> |
||||||
|
</li> |
||||||
|
<li> |
||||||
|
<a href="/certificaten">Certificaten</a> |
||||||
|
</li> |
||||||
|
<li> |
||||||
|
<a href="/encryptie">Encryptie</a> |
||||||
|
</li> |
||||||
|
</ul> |
||||||
|
|
||||||
|
Moeilijkheidsgraad: |
||||||
|
<select id="difficulty"> |
||||||
|
<option value="easy">Makkelijk (hints zichtbaar)</option> |
||||||
|
<option value="normal">Normaal (hints optioneel)</option> |
||||||
|
<option value="hard">Moeilijk (geen hints)</option> |
||||||
|
</select> |
||||||
|
|
||||||
|
</div> |
||||||
|
|
||||||
|
<div id="quiz"> |
||||||
|
|
||||||
|
{% block content %}{% endblock %} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</form> |
||||||
|
</body> |
||||||
|
|
||||||
|
</html> |
@ -0,0 +1,324 @@ |
|||||||
|
{% 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">Kopieer/plak de inhoud van certificaat.crt (inclusief begin en einde |
||||||
|
<code>-----BEGIN CERTIFICATE-----</code>)</span> |
||||||
|
{% include "points.html" with points=answers.answer_openssl_selfsigned_certificate.points max="10" %} |
||||||
|
<textarea class="question-input" name="answer_openssl_selfsigned_certificate">{{ answers.answer_openssl_selfsigned_certificate.string }}</textarea> |
||||||
|
</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? (je mag ook ongeveer een antwoord geven als het lastig tellen is)</span> |
||||||
|
{% include "points.html" with points=answers.answer_openssl_number_of_issuers.points max="5" %} |
||||||
|
<input class="question-input" name="answer_openssl_number_of_issuers" value="{{ answers.answer_openssl_number_of_issuers.string }}"> |
||||||
|
</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> |
||||||
|
{% include "points.html" with points=answers.answer_openssl_facebook_issuer.points max="5" %} |
||||||
|
<input class="question-input" name="answer_openssl_facebook_issuer" value="{{ answers.answer_openssl_facebook_issuer.string }}"> |
||||||
|
</div> |
||||||
|
|
||||||
|
<p class="hint">Hint: Het certificaat kan je in alle browsers bekijken door op het slot-ikoontje te klikken</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 les 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> |
||||||
|
{% include "points.html" with points=answers.answer_openssl_site_issuer.points max="5" %} |
||||||
|
<input class="question-input" name="answer_openssl_site_issuer" value="{{ answers.answer_openssl_site_issuer.string }}"> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="question"> |
||||||
|
<span class="question-string">Plak jouw ondertekende certificaat in onderstaand tekstveld (inclusief begin en einde |
||||||
|
<code>-----BEGIN CERTIFICATE-----</code>)</span> |
||||||
|
{% include "points.html" with points=answers.answer_openssl_signed_cert.points max="10" %} |
||||||
|
<textarea class="question-input" name="answer_openssl_signed_cert">{{ answers.answer_openssl_signed_cert.string }}</textarea> |
||||||
|
</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. Vraag een medestudent 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.</p> |
||||||
|
|
||||||
|
<div class="question"> |
||||||
|
<span class="question-string">Plak de inhoud van het certificaat van een medestudent, waar je zelf verstrekker van bent. (inclusief begin en einde |
||||||
|
<code>-----BEGIN CERTIFICATE-----</code>)</span> |
||||||
|
{% include "points.html" with points=answers.answer_openssl_sign_other.points max="10" %} |
||||||
|
<textarea class="question-input" name="answer_openssl_sign_other">{{ answers.answer_openssl_sign_other.string }}</textarea> |
||||||
|
</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 %} |
@ -0,0 +1,196 @@ |
|||||||
|
from django.shortcuts import render |
||||||
|
from django.http import HttpResponse |
||||||
|
from django.http import HttpResponseNotFound |
||||||
|
from django.db import connection |
||||||
|
from quiz.models import LetsEncryptChallenge |
||||||
|
from oauth2_provider.views.generic import ProtectedResourceView |
||||||
|
import datetime |
||||||
|
import pytz |
||||||
|
|
||||||
|
|
||||||
|
def home(request, url): |
||||||
|
if url == 'sql' or url == '': |
||||||
|
template = 'sql.html' |
||||||
|
elif url == 'xss': |
||||||
|
template = 'xss.html' |
||||||
|
elif url == 'path': |
||||||
|
template = 'path.html' |
||||||
|
elif url == 'wachtwoorden': |
||||||
|
template = 'wachtwoorden.html' |
||||||
|
elif url == 'certificaten': |
||||||
|
template = 'certificaten.html' |
||||||
|
elif url == 'encryptie': |
||||||
|
template = 'encryptie.html' |
||||||
|
elif url == 'bonus': |
||||||
|
template = 'bonus.html' |
||||||
|
elif url == 'oauth': |
||||||
|
template = 'oauth.html' |
||||||
|
else: |
||||||
|
return HttpResponseNotFound('404') |
||||||
|
|
||||||
|
return render(request, template) |
||||||
|
|
||||||
|
|
||||||
|
class SecurityApi(ProtectedResourceView): |
||||||
|
def get(self, request, *args, **kwargs): |
||||||
|
return HttpResponse("Geheime code: abguvatgbfrrurerzbirnybat") |
||||||
|
|
||||||
|
|
||||||
|
def letsencrypt(request): |
||||||
|
template_vars = {} |
||||||
|
if request.method == 'POST': |
||||||
|
try: |
||||||
|
challengeresponse = request.POST['challenge-response'] |
||||||
|
|
||||||
|
if challengeresponse.strip() == '': |
||||||
|
raise Exception('Geen data opgegeven') |
||||||
|
|
||||||
|
if '.' not in challengeresponse: |
||||||
|
raise Exception( |
||||||
|
'Verkeerde code opgegeven. De code die je moet opgeven is met een puntje er in.') |
||||||
|
print(challengeresponse.split('.')) |
||||||
|
if len(challengeresponse.split('.')) != 2: |
||||||
|
raise Exception('De code moet maar 1 puntje bevatten') |
||||||
|
|
||||||
|
challenge, response = challengeresponse.split('.') |
||||||
|
|
||||||
|
if len(challenge) < 40 or len(response) < 40: |
||||||
|
raise Exception('De code is te kort') |
||||||
|
|
||||||
|
expiry_date = pytz.utc.localize( |
||||||
|
datetime.datetime.utcnow() + datetime.timedelta(minutes=10)) |
||||||
|
challengeresponse, created = LetsEncryptChallenge.objects.get_or_create(challenge=challenge, defaults={ |
||||||
|
'response': response, |
||||||
|
'expiry_date': expiry_date |
||||||
|
}) |
||||||
|
|
||||||
|
challengeresponse.response = response |
||||||
|
challengeresponse.expiry_date = expiry_date |
||||||
|
challengeresponse.save() |
||||||
|
|
||||||
|
template_vars['challenge'] = challenge |
||||||
|
template_vars['response'] = response |
||||||
|
except str as e: |
||||||
|
template_vars['error'] = e.message |
||||||
|
raise e |
||||||
|
|
||||||
|
return render(request, 'letsencrypt.html', template_vars) |
||||||
|
|
||||||
|
|
||||||
|
def letsencrypt_challenge(request, challenge): |
||||||
|
try: |
||||||
|
# Delete old challenges |
||||||
|
LetsEncryptChallenge.objects.filter( |
||||||
|
expiry_date__lte=datetime.datetime.utcnow()).delete() |
||||||
|
|
||||||
|
challengeresponse = LetsEncryptChallenge.objects.get( |
||||||
|
challenge=challenge) |
||||||
|
|
||||||
|
response = HttpResponse( |
||||||
|
challengeresponse.challenge + "." + challengeresponse.response) |
||||||
|
response['Content-Type'] = 'text/plain' |
||||||
|
return response |
||||||
|
except LetsEncryptChallenge.DoesNotExist: |
||||||
|
return HttpResponseNotFound('404') |
||||||
|
|
||||||
|
|
||||||
|
def sign(request): |
||||||
|
if request.method == 'POST': |
||||||
|
from OpenSSL import crypto |
||||||
|
|
||||||
|
ca_cert_file = """-----BEGIN CERTIFICATE----- |
||||||
|
MIIEjzCCA3egAwIBAgIJAIyZIB4fbN2mMA0GCSqGSIb3DQEBCwUAMIGLMQswCQYD |
||||||
|
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEUMBIGA1UEBxMLTG9zIEFuZ2Vs |
||||||
|
ZXMxDzANBgNVBAoTBlNwYWNlWDEMMAoGA1UECxMDQ0VPMRIwEAYDVQQDEwlFbG9u |
||||||
|
IE11c2sxHjAcBgkqhkiG9w0BCQEWD2Vsb25Ac3BhY2V4LmNvbTAeFw0xNTA1Mjgx |
||||||
|
NjEyMjFaFw0yNTA1MjUxNjEyMjFaMIGLMQswCQYDVQQGEwJVUzETMBEGA1UECBMK |
||||||
|
Q2FsaWZvcm5pYTEUMBIGA1UEBxMLTG9zIEFuZ2VsZXMxDzANBgNVBAoTBlNwYWNl |
||||||
|
WDEMMAoGA1UECxMDQ0VPMRIwEAYDVQQDEwlFbG9uIE11c2sxHjAcBgkqhkiG9w0B |
||||||
|
CQEWD2Vsb25Ac3BhY2V4LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC |
||||||
|
ggEBAMWr64mMZDfWUuYmROz+FszmwjGZvFz0CGxiExHEAFfzZfF60Rts2Qm+o7cc |
||||||
|
bZ/UtAaIgIve5WiWhQ5mqDoyECfuVOTcddWCrskLgLafoP6nPVdTDIXsPtsjtRuV |
||||||
|
D1ptsduDVCeQkcKFUcfLd6QXJaOAYU20gb7FJ8KFUmJXn4HXg6BsZvu8grJgh51O |
||||||
|
29JRw83I0FxzBZw4JSvETW968NexO+aliR/inK4GQQqk4joxuT6MSVsd+17ss6wn |
||||||
|
WO1nUNxhSW3MQePrfphkQbNZn/l1T1MfN6XAs4P9boqgENHZ2WskGIeZ5g1I4MVE |
||||||
|
WPFTZ8HwprCvybM8mneqVp/P+FcCAwEAAaOB8zCB8DAdBgNVHQ4EFgQUHvGJ8tZM |
||||||
|
owfGFNeyuhsYq8JN/o8wgcAGA1UdIwSBuDCBtYAUHvGJ8tZMowfGFNeyuhsYq8JN |
||||||
|
/o+hgZGkgY4wgYsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRQw |
||||||
|
EgYDVQQHEwtMb3MgQW5nZWxlczEPMA0GA1UEChMGU3BhY2VYMQwwCgYDVQQLEwND |
||||||
|
RU8xEjAQBgNVBAMTCUVsb24gTXVzazEeMBwGCSqGSIb3DQEJARYPZWxvbkBzcGFj |
||||||
|
ZXguY29tggkAjJkgHh9s3aYwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC |
||||||
|
AQEAfe9TXLrrwA/3xf85HB+i7CxaFNTmWZvsN2Ico9Ks1/Dt7eAB61ghHFIxCqHz |
||||||
|
LQGa77wFAI5kgzv3TembXV1kHz4pGigPC6EkNEh0Kc2O3fwz6CryK7/OrjkElKEn |
||||||
|
ti/9loLr8+rhQKF0c2NS3qiAoYsR/kkdBZ+niT+yXCIekpQNybfDT8WqDm4Rv2s+ |
||||||
|
u/6pZa7zZLLlORpxnuFfjjo+n/06b4+xHn+xvyGWijMcOqZdyhU0UjZ7OAW/ZEQp |
||||||
|
3uvp8fso+Esov+Abl0Lxtr/Gk7utH/h0AD6vWJJwDlS65uqKBeuIOUoCAHy3oPH5 |
||||||
|
p+BxtuhS2Lv5g2jHRgIxVt22rg== |
||||||
|
-----END CERTIFICATE----- |
||||||
|
""" |
||||||
|
ca_key_file = """-----BEGIN RSA PRIVATE KEY----- |
||||||
|
MIIEogIBAAKCAQEAxavriYxkN9ZS5iZE7P4WzObCMZm8XPQIbGITEcQAV/Nl8XrR |
||||||
|
G2zZCb6jtxxtn9S0BoiAi97laJaFDmaoOjIQJ+5U5Nx11YKuyQuAtp+g/qc9V1MM |
||||||
|
hew+2yO1G5UPWm2x24NUJ5CRwoVRx8t3pBclo4BhTbSBvsUnwoVSYlefgdeDoGxm |
||||||
|
+7yCsmCHnU7b0lHDzcjQXHMFnDglK8RNb3rw17E75qWJH+KcrgZBCqTiOjG5PoxJ |
||||||
|
Wx37XuyzrCdY7WdQ3GFJbcxB4+t+mGRBs1mf+XVPUx83pcCzg/1uiqAQ0dnZayQY |
||||||
|
h5nmDUjgxURY8VNnwfCmsK/Jszyad6pWn8/4VwIDAQABAoIBAHkzyOA17N0v1PS5 |
||||||
|
UlneEizg8QFouk5kcyXBnN+vxmYnH8LJA55FR27qLYgBLlZqHVhEKk2ZBiDy6fLC |
||||||
|
jzPfrnhNclBBvR6FWpZ7LxjLF/QMp1f73BnhmUjUxB99bkSMLhnilJ8NzdHv3Q0c |
||||||
|
fOdoKfPuq7rxivxl9tMW3ETgZTU+0dSeJH8ZkkcQblckNpqP//oWFpXYrgftgyR3 |
||||||
|
kM+uZya2kwaZ15XC2O1IXbvFVjppw4z/z8KMBc6azGrSFJ6xGkve+1KKBuVQ1Vpg |
||||||
|
sFXBaKHoVG5NpGiwiBkbERkn1Jp+lgJkstDyzGtIVmhzT7g5+YIvXE5uWU/NVRDp |
||||||
|
0n8n6UECgYEA/hgkUfJ/uVlORhkIyW+thG9VPO1k35BdOjw5f7xDN6DSyYNSRubi |
||||||
|
q6F3KWW807fEubGYzXaTh5QCB9z+gUuVAtjo9Mb0RPBEyWwXFi0ynxLzNQxA692U |
||||||
|
Id67JHVPK4gsgP7jZi8+pAbN3xSfRG1BXdsp+RUJdWNiaLeWOsHI+bMCgYEAxydy |
||||||
|
enmg+dzz8qz6my9G9uH0dqoG8BHlwPp7h/vmSbhWAD4+BIGCHbGt2zk/Zh7w6PsQ |
||||||
|
9nMrWSwAkStdpW0WLz/oNIijVN8dInlFnB3qq6o1t0Jrz2K4ngUN1PAA19Ft1s+r |
||||||
|
VZpSM+uKViKKuthORNeVM0D3D3gfrisdAZAV7M0CgYBguef5mgqtECYP4S/LHsw7 |
||||||
|
Afa8vtILmPUkWhC5Y31jC8GyHF+Rxgq7szeddrEvF2G4HrdAX8dBcUJko+fuaEtN |
||||||
|
Ti1AIQyTwbMtygvv0TzX+WrD4upD35GoYxVyh4Wf2LK4WE9QcuOxpTVxmnQWpFCh |
||||||
|
3fBYdX2oRjEME/cIXwSWqQKBgEpc0WMn/VKvDSvlKSI+8fmHf3e7nyGPHUIEhZHO |
||||||
|
HjwSp5Ipq5CVJxedW7SK2MBx9zSXYssTT/FY+9E45xu48tqruzG6f3pWYROZQsO7 |
||||||
|
a/+za6FFHOpwC019x59mCnqLib73BhvNproaTipBdZm04OzVrrFXpajSCspG8Oq/ |
||||||
|
eWBVAoGACI+4ROdYWCprQRgH2Qr5nKnRkN1mZzBl4hgodSGCZa3TWnBVHtXacluF |
||||||
|
KJ8dp3ZgjiQ9aQujFD5oPnmSJ8wvJijF8ngEFw60+axRrWnUmejWkrexA1Hlv0Er |
||||||
|
tq9DcELddZK2gJXaXpL1wOL+Ex5RzzRmjqKmmkkn1//ikn+nrZU= |
||||||
|
-----END RSA PRIVATE KEY----- |
||||||
|
""" |
||||||
|
csr = crypto.load_certificate_request( |
||||||
|
crypto.FILETYPE_PEM, request.FILES['csr'].read()) |
||||||
|
ca_cert = crypto.load_certificate(crypto.FILETYPE_PEM, ca_cert_file) |
||||||
|
ca_key = crypto.load_privatekey(crypto.FILETYPE_PEM, ca_key_file) |
||||||
|
|
||||||
|
signed_cert = crypto.X509() |
||||||
|
signed_cert.set_serial_number(1) |
||||||
|
signed_cert.gmtime_adj_notBefore(0) |
||||||
|
signed_cert.gmtime_adj_notAfter(60 * 60 * 24 * 365 * 5) |
||||||
|
signed_cert.set_issuer(ca_cert.get_subject()) |
||||||
|
signed_cert.set_subject(csr.get_subject()) |
||||||
|
signed_cert.set_pubkey(csr.get_pubkey()) |
||||||
|
signed_cert.sign(ca_key, 'sha256') |
||||||
|
|
||||||
|
response = HttpResponse(crypto.dump_certificate( |
||||||
|
crypto.FILETYPE_PEM, signed_cert), content_type='application/zip') |
||||||
|
response['Content-Disposition'] = 'attachment; filename=signed-certificaat.crt' |
||||||
|
return response |
||||||
|
|
||||||
|
return render(request, 'sign.html') |
||||||
|
|
||||||
|
|
||||||
|
def graderhelper(request): |
||||||
|
cursor = connection.cursor() |
||||||
|
if request.GET['mode'] == 'oauth_app': |
||||||
|
cursor.execute("SELECT COUNT(id) FROM oauth2_provider_application WHERE client_id = %s", [ |
||||||
|
request.GET['answer']]) |
||||||
|
return HttpResponse(cursor.fetchone()) |
||||||
|
|
||||||
|
elif request.GET['mode'] == 'access_token': |
||||||
|
cursor.execute("SELECT COUNT(id) FROM oauth2_provider_accesstoken WHERE token = %s", [ |
||||||
|
request.GET['answer']]) |
||||||
|
return HttpResponse(cursor.fetchone()) |
||||||
|
|
||||||
|
elif request.GET['mode'] == 'auth_code': |
||||||
|
cursor.execute("SELECT COUNT(id) FROM oauth2_provider_grant WHERE code = %s", [ |
||||||
|
request.GET['answer']]) |
||||||
|
return HttpResponse(cursor.fetchone()) |
||||||
|
|
||||||
|
return HttpResponse('404') |
@ -0,0 +1,12 @@ |
|||||||
|
import os |
||||||
|
import sys |
||||||
|
from django.core.wsgi import get_wsgi_application |
||||||
|
|
||||||
|
path = os.path.dirname(os.path.abspath(__file__)) |
||||||
|
if path not in sys.path: |
||||||
|
sys.path.append(path) |
||||||
|
|
||||||
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "securityquiz.settings") |
||||||
|
|
||||||
|
|
||||||
|
application = get_wsgi_application() |
Loading…
Reference in new issue