• Let’s Encrypt is a new Certificate Authority that is automated and free to use. This makes it possible to obtain domain validated (DV) certificates for your domain names as no cost!

    I registered for the closed beta, and got a few of my domain names authorised. This meant that I could now obtain certificates for them. The process was fairly simple. I chose to use the webroot authentication method, which means that the Let’s Encrypt client should be able to place files under my webroot to prove that I control the domain.

    Since my webroot is /var/www I created the /var/www/acme/.well-known/acme-challenge folders for the webroot plugin to use. My web server is Nginx so I placed the following code in the server blocks for the domains I want to obtain certificates for and reloaded the Nginx configuration.

    location ~ ^/\.well-known/acme-challenge {
      root /var/www/acme;
      default_type application/jose+json;
    }
    

    Now it was time to install and run the Let’s Encrypt client to obtain the certificates. When prompted I used /var/www/acme as the webroot path.

    git clone https://github.com/letsencrypt/letsencrypt
    cd letsencrypt
    ./letsencrypt-auto --agree-dev-preview --server https://acme-v01.api.letsencrypt.org/directory certonly
    

    So far so good. I now had my certificates under /etc/letsencrypt/live and could configure Nginx to use them. Great! For those who are curious this is my SSL configuration for Nginx:

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA";
    ssl_ecdh_curve secp384r1;
    ssl_dhparam /etc/ssl/dhparams.pem;
    add_header Strict-Transport-Security max-age=31536000;
    

    The certificates are valid for 90 days, so they need to be renewed fairly often. I wanted to automate this process, so I wrote the following script. Basically it checks all certificates under /etc/letsencrypt/live and if one is about to expire in less than 4 weeks it is automatically renewed. I named this script certrenew.

    #!/bin/bash
    
    if [ ! -d /etc/letsencrypt/live ]; then
      exit 1
    fi
    
    function issueCert {
      /root/.local/share/letsencrypt/bin/letsencrypt certonly --renew-by-default --agree-dev-preview --server https://acme-v01.api.letsencrypt.org/directory --authenticator webroot --webroot-path /var/www/acme $1
    }
    
    exitcode=1
    while IFS= read -r -d '' cert; do
      if ! openssl x509 -noout -checkend $((4*7*86400)) -in "${cert}"; then
        subject="$(openssl x509 -noout -subject -in "${cert}" | grep -o -E 'CN=[^ ,]+' | tr -d 'CN=')"
        subjectaltnames="$(openssl x509 -noout -text -in "${cert}" | sed -n '/X509v3 Subject Alternative Name/{n;p}' | sed 's/\s//g' | tr -d 'DNS:' | sed 's/,/ /g')"
        domains="-d ${subject}"
        for name in ${subjectaltnames}; do
          if [ "${name}" != "${subject}" ]; then
            domains="${domains} -d ${name}"
          fi
        done
        issueCert "${domains}"
        exitcode=0
      fi
    done < <(find /etc/letsencrypt/live -name cert.pem -print0)
    
    exit ${exitcode}
    

    The script can be downloaded here.

    To automate everything I run the following script via cron every day. It calls the certrenew script and if certificates are renewed it reloads the Nginx configuration after the renewal process. This will produce output so you will get an e-mail from the cron daemon when certificates are renewed. If you don't what that then just send the output of certrenew to /dev/null.

    #!/bin/bash
    
    if /usr/local/bin/certrenew; then
      /usr/sbin/nginx -t && systemctl reload nginx
    fi
    
    exit 0
    

    That's it. Fully automated renewal of Let's Encrypt certificates 🙂

  • Her er fortællingen om et hobbyprojekt der strakte sig over flere år. Nærmere bestemt fra december 2010 til marts 2013. Det lyder måske underligt når jeg nu siger at projektet i alt sin enkelthed gik ud på at lave en stor rød knap, der kunne mute fjernsynet når man trykkede på den. Hvorfor i alverden ville man lave sådan en? Jo, har du set NFL på TV3+ har du måske en idé. Her bliver man udsendelsen igennem bombarderet med reklamepauser, og for at undgå at blive sindssyg af at høre de samme 4 reklamer med overdrevet høj lydstyrke henover flere timer, så er man nødsaget til at mute hver gang der er reklamer. Desværre er fjernbetjeningen ofte gemt et eller andet sted under tæpper, puder eller bjerge af slik og chips, så derfor ville det være rart at have en stor knap på bordet som man bare kunne knalde hånden ned i hver gang der kom reklamer. Og ja, naturligvis skal den være rød 🙂

    Idéen opstod som sagt tilbage i 2010 da jeg tænkte “hvor svært kan det være at lave sådan en dims”. Min første udfordring var at finde ud af hvordan man kunne gemme en infrarød (IR) kommando fra en fjernbetjening og senere sende den igen. Da jeg ledte efter en løsning på det problem tilbage i december 2010, så faldt jeg over en chip der hed IRMimic der kunne lige netop dette (samt lidt mere jeg ikke havde brug for). Heldigvis solgte de også komplette sæt med alle komponenter man skulle bruge, samt instruktioner til hvordan de skulle samles, så jeg bestilte straks to af disse sæt (ønsker du at lave et lignende projekt i dag, så hedder chippen nu IRMimic2). Nedenfor kan du se alle de komponenter der følger med sådan et sæt. Lad mig sige med det samme: Jeg er ikke nogen haj med en loddekolbe.

    IRMimic komponenterne

    Jeg fandt også dengang et sted at købe store røde knapper, og dem bestilte jeg også to af. De blev købt hos Let Elektronik, men jeg tror ikke længere de forhandler dem. Jeg kan i hvert fald ikke finde dem på deres hjemmeside. De kan dog købes flere steder på nettet fx hos Sparkfun Electronics hvor de sælges under sloganet: “It’s the end of the world, and you need a button to press. This is it”.

    Stor rød knap

    Disse komponenter ankom i december 2010 og lå så ellers bare og samlede støv i min rodekasse frem til februar 2013 hvor jeg af uvisse årsager valgte at genoptage projektet. Måske var det fordi jeg for ikke så lang tid siden havde måttet se NFL slutspillet på TV3+, eller også var det fordi jeg tænkte på hobbyprojekter jeg ikke havde tid til efter at jeg var blevet far 🙂

    Uanset årsagen, så var det første jeg gjorde at finde dokumentation og tegninger frem for at finde ud af hvordan jeg skulle samle printet med IRMimic chippen. Jeg havde godt nok kigget på det da jeg modtog sættet, men det var nogle år siden, så den viden skulle lige genopfriskes. Efter et par minutters studier (der strakte sig over et par dage) af beskrivelser og diagrammer allierede jeg mig en aften med min loddekolbe og gik i gang.

    Første udfordring var at loddekolben har en spids der er ca. dobbelt så bred som afstanden mellem nogle af de komponenter der skulle loddes fast på printet. Allerede her burde jeg nok have givet op og anskaffet mig noget bedre udstyr, men i stedet loddede jeg løs og håbede på det bedste. Jeg kunne forsimple designet lidt da jeg kun skulle bruge en enkelt IR kommando som skulle forbindes til en bestemt knap, og efter ca. to timers lodning (fordelt på ca. en times lodning og en times fjernelse af loddetin der var havnet de forkerte steder) kom det spændende øjeblik hvor der skulle sættes strøm på. Chippen fungerer fra 3.7V til 5.5V, hvorimod alt højere end det ville brænde den af. Der var mulighed for at sætte en lille strømforsyning på der kunne regulere spændingen, men den undlod jeg og gav i stedet det hele strøm fra 3 x AA batterier, hvilket skulle være omkring 4.5V -- naturligvis checket med et voltmeter inden jeg satte strøm på.

    IRMimic printet set forfra IRMimic printet set bagfra

    Jeg satte strøm på, og til min overraskelse kom der ingen røg, men i stedet kortvarigt lys fra den røde lysdiode ganske som der skulle. Ved at trykke på “learn” knappen (som i mangel af knap bestod i at kortslutte to ledninger i bedste “jeg stjæler lige en bil”-Hollywood stil) skulle man nu kunne lære den en bestemt IR kommando fra en fjernbetjening, og her valgte jeg selvfølgelig mute. Jeg tændte fjernsynet, trykkede på den store knap og krydsede fingre… Succes!  Forstærkeren blev tavs! Et tryk mere og lyden kom tilbage.

    Første samlede sæt

    Således så det samlede sæt ud, men jeg var jo ikke færdig. Blandt andet manglede jeg jo at bygge det hele ind i en kasse som kunne klare at stå på bordet foran en flok mennesker der var allergiske overfor lyden af reklamer. Hvis noget er værd at gøre, så er det værd at overdrive så jeg besøgte straks Elektronik-Lavpris‘ hjemmeside og lavede en liste over diverse dimser jeg skulle bruge, hvilket primært var et par knapper. Jeg bestilte også en kasse til tre AAA batterier samt nogle AAA lithium batterier, da de skulle kunne holde en mere konstant spænding, samt at jeg ikke vidste hvor let det ville blive at skifte batterier i den når kassen var bygget færdigt.

    Den store røde knap havde en lille glødepære inden i så den kunne lyse. Den krævede dog 12V og brugte også mere strøm end jeg havde lyst til. Derfor skulle den skiftes ud med en lysdiode. Det krævede blot lidt lodning af en lille modstand på lysdioden (for ikke at brænde den af når jeg fodrede den med 4.5V i stedet for de ca. 2V den gerne vil have) og så lodde det hele fast på det sted hvor den oprindelige lampe havde siddet. Det er ikke lige til at se på billedet, men modstanden gemmer sig nede under dioden.

    Med glødepære Med LED

    Ved nærmere eftertanke skulle jeg nok have valgt en hvid LED, da knappen jo i forvejen er rød, men pyt. Det giver den bare et mere afdæmpet lys i en mørk TV stue 🙂

    Så kom næste store udfordring: Kassen. Jeg kiggede efter nogle plastickasser der kunne bruges, men fandt ingen der var velegnede, så det blev mere og mere tydeligt at jeg blev nødt til at designe min egen. Jeg har vist engang tilbage i sidste årtusind rodet lidt med 3D Studio 5 (til DOS) så hvor svært kunne det være at designe sådan en kasse (svar: sværere end jeg lige umiddelbart havde regnet med). Efter lidt søgen på nettet fandt jeg ud af at SketchUp vist var programmet man skulle bruge som glad 3D amatør. Jeg gik i gang og efter en uges tid med at finde ud af hvordan man brugte programmet, hvordan kassen skulle se ud og hvordan man gjorde sin model klar til 3D print, så endte jeg med nedestående design.

    Den færdige 3D model 3D modellen indefra

    Den store røde knap skal hvile i hullet og i kassen er der lavet huller til den infrarøde lysdiode,  en tænd/sluk knap samt en ekstra knap til at tænde det røde lys. Inde i kassen er der plads til “learn” knappen og batterierne. Det er dog meget svært at montere komponenter på en tegning, så nu skulle den fra computeren og ud i den fysiske verden.

    Der er en del steder der tilbyder at printe dine modeller i 3D og fælles for dem alle er at de er rasende dyre. Jeg kunne nok finde nogen i Kina der kunne gøre det billigt hvis jeg skulle bruge et par hundrede stykker, men lige nu skulle jeg bare bruge en enkelt (masseproduktion kommer senere 🙂 ) Efter at have kontaktet flere forskellige firmaer og prøvet et par online tjenester, så endte det med at blive i.materialise der skulle bringe min 3D model til verden. Billigt var det ikke, men dog stadig en faktor 2-10x billigere end nogle af de andre steder jeg havde forhørt mig. Jeg er sikker på at om 1-2 år når 3D printere er meget mere udbredte, så falder den slags voldsomt i pris, men så længe gad jeg ikke vente, så afsted med bestillingen. Jeg fik en mail om at min model kunne printes og at jeg skulle forvente at modtage den ca. tre uger senere. Derfor kunne jeg ikke rigtigt gøre andet nu end at vente og håbe at jeg havde designet den efter de korrekte mål!

    Her hopper jeg omkring to uger frem i tiden, for her ankom der, næsten en uge tidligere end lovet, en pakke fra i.materialise. Den blev straks pakket op, og nu stod jeg med en fysisk repræsentation af min 3D tegning, og ved første øjekast så den ganske fin ud. Alle målene passede sådan nogenlunde, men der er måske en grund til at den model jeg valgte hos i.materialise var noget billigere end de andre jeg fandt på nettet. Den er lavet af en slags hvid plastic, men den sorte farve er et underligt filtagtigt materiale der tiltrækker støv som en magnet. Derudover var der stadig nogle rester fra produktionen i nogle hjørner inde i kassen. De rester kunne dog heldigvis kradses af, men det gik udover farven da den blev hvid der hvor man kradsene. Det er heldigvis indvendigt, så det ser man ikke.

    Jeg havde lavet nogle små rammer inde i den til at holde batterierne og “learn”-knappen, men disse blev desværre en mm eller to mindre end jeg havde bedt om, så især batteripakken kunne ikke helt være der. Den kan dog mases godt nok ned til at den alligevel sidder fast, så det er ikke noget større problem.

    Den nøgne model lige fra 3D printeren

    Heldigvis passede den store røde knap fint i hullet, og det samme gjorde de andre knapper og IR dioden, så det var bare at gå i gang med at samle den. Nedenfor ses først hvordan IRMimic printet passer fint i kassen (det blev herefter fastgjort med en lille skrue) og hefter ses et øjebliksbillede af mit arbejdsbord. Der er mange ledninger der skal forbindes på ikke ret meget plads, men det gik fint omend lidt langsomt. Jeg mangler stadig en god (og mindre rodet) måde at isolere nogle ledninger på, men indtil videre blev det bare gjort med noget isoleringstape. Ledningerne skulle være lange nok til at man kunne få komponenterne ud af kassen igen, men heller ikke så lange at de skabte mere rod nede i kassen end højst nødvendigt.

    IRMimic boardet er monteret Der rodes og arbejdes

    Efter ca. 1½ times arbejde var den ved at være færdig. Nedenfor ses først de to knapper til at tænde for IRMimic og lyset i den store knap, og derefter hvordan det hele så ud lige inden den store knap blev monteret. Inden det skete testede jeg dog lige at den stadig kunne lære IR kommandoer, og fik til sidst lige lært den “mute” kommandoen på min forstærker, inden jeg lukkede kassen.

    Nærbillede af tænd/sluk knapperne Alt forbundet. Nu skal den bare lukkes

    Sidst, men ikke mindst: Det færdige resultat. Og ja, den virker! 🙂

    Det færdige resultat

    Et spændende projekt som jeg er glad for endelig er (næsten) afsluttet! Tilbage er at klistre noget gummi under den så den ikke glider rundt på (og ridser) bordet, og måske også klistre noget tyndt gummi på kanten hvor den røde knap hviler, da den godt kan rasle en lille smule. Det er dog småting.

    Jeg har dog allerede identificeret enkelte ting der kunne forbedres. For det første ville det nok være lettere at have “learn”-knappen på ydersiden så man ikke skulle åbne den hver gang man ville lære den en ny IR kommando. På den anden side er det jo ikke noget man gør ret tit, så det går nok. En anden forbedring ville være at placere IR dioden højere oppe på kassen. Lige nu ligger den tæt på bordet, og det gør at hvis kassen står langt væk fra fjernsynet på et bredt bord, så kan den muligvis ikke ramme fjernsyn eller forstærker hvis de er lavt placeret. IR dioden er desværre noget retningsfølsom. Til sidst skulle rammerne til at holde nogle af de interne komponenter være lidt større, eller der skulle være en batterilåge i bunden af den. Det er dog ganske fint for en version 1.0 🙂

  • DanID har langt om længe lanceret NemID på Hardware, hvilket betyder at man nu kan få sin hemmelige nøgle på et smartcard i stedet for at have den liggende på DanID’s servere. Det skulle prøves, så jeg bestilte det eneste hardware de understøtter, nemlig en Gemalto IDPrime .Net som faktisk er to enheder: En USB smartcardlæser og et smartcard der fastmonteres i den.

    Jeg bruger også Windows på nogle computere, og aktiverede faktisk kortet under Windows  jfr. DanID’s vejledning, men tænkte at det kunne være interessant også at få det til at virke under Linux. Denne vejledning til hvordan man får NemID på Hardware til at virke under Linux, er baseret på min favoritdistribution Arch Linux (64-bit), men det burde være forholdsvis trivielt at modificere den til at virke på en vilkårlig Linux distribution. Den er baseret på den officielle vejledning fra DanID.

    1. Installer først den nødvendige software for at snakke med smartcards og et library der skal bruges til at kompilere driveren i skridt 3:
      sudo pacman -S pcsclite pcsc-tools pcsc-perl ccid boost boost-libs
      
    2. Hent PKCS#12 driveren til smartcardlæseren. Gemalto siger at man kan skrive til dem for at få koden udleveret, men DanID har den også liggende på deres side.
    3. Pak koden ud, konfigurer dit build og byg driveren (hvis du får en fejl ved kompilering et sted i boost, så check dette commit):
      tar xfz libgtop11dotnet_2.2.0.12.tar.gz
      cd libgtop11dotnet-2.2.0.12
      ./configure --enable-system-boost --disable-static
      make -j2
      
    4. Installer driveren i /usr/local/lib/pkcs11:
      sudo mkdir -p /usr/local/lib/pkcs11
      cd .libs
      sudo cp -P libgtop11dotnet* /usr/local/lib/pkcs11
      sudo strip /usr/local/lib/pkcs11/libgtop11dotnet.so.0.0.0
      
    5. Sørg for at systemet kan finde driveren:
      echo "echo /usr/local/lib/pkcs11 | tee /etc/ld.so.conf.d/gemalto.conf" | sudo bash
      sudo ldconfig -v
      
    6. Start pcscd og sæt den til at starte ved hver opstart af systemet:
      sudo systemctl enable pcscd.socket
      sudo systemctl stop pcscd.socket
      sudo systemctl start pcscd.socket
      
    7. Indsæt din USB token og check om den virker med følgende kommando:
      pcsc_scan
      

      Hvis det virker skulle du gerne se output i stil med dette:pcscd

    Det var det. Tilbage er blot at prøve at logge på med din nye digitale signatur. Prøv fx på Sundhed.dk eller på Borger.dk, eller prøv at aktivere den hvis du endnu ikke har gjort det.

    nemlogin

    Bemærk at nogle udbydere benytter NemLog-In, mens andre benytter NemAdgang. Under NemAdgang skal du vælge at logge på med digital signatur, mens du under NemLog-In skal vælge at logge ind med nøglefil.

  • Update: I quit using Endomondo some time ago and no longer maintain this script. If it still works, great! If it doesn’t and you can make it work for you, great! If you want to take it and maintain it, feel free to do so.

    Update 2: Stephen Casey has modified this script so it should work again. Please check out his website for a description and a link to the updated script.

    As many people around the world I like to do some exercise now and then, and when that exercise is running I save all my workouts to Endomondo. I have been doing this for over two years now, and have accumulated more than 300 workouts. Recently Endomondo decided to limit the amount of features available for free, and move them to a subscription part of the website. While I have no problems with paying for what I use, I consider it a bad move to start charging for features that used to be free. It doesn’t really affect me that much though, since I never used those features anyway. However, it got me thinking that should Endomondo decide to do something similar in the future, I won’t have the option to switch platform since they hold all my workout data. There is a possibility to export one workout at a time, but Endomondo clearly stated that a mass export function will not be available. I was not satisfied by this so I wrote a script to export all my workouts from Endomondo, and I am posting it here in case some of you want to get all your data back from Endomondo too. After all it’s YOUR data. The script is written in PHP and runs from the command line. For Windows I have put everything needed into a single file. For Linux  and OSX you need to install PHP yourself. Also, in order for the script to work you need to login in one of the following ways:

    1. Put your username and password in a file called secret.txt where the first line is the username and the second line is the password. This does not work with Facebook logins and also requires OpenSSL support in your PHP installation.
    2. Get the cookie used to authenticate you and put the cookie  (everything after “Cookie: ” or the entire line, it doesn’t matter) in a file called cookie.txt. You can get the cookie in several ways: With Wireshark, using Chrome: (F12, reload page in Endomondo, Network, click on one of the resources under headers) or with some extension like TamperData for Firefox.

    If both files exist, username and password authentication takes priority. The script will first download a list of all your workouts, then download the actual workouts. It will remember the the latest workout that was downloaded, so if you run it again at a later point in time, you will only get new workouts. You can modify the function generateFileName to change the filenames of the saved workouts. Disclaimer: This script worked for me. Endomondo can easily change something on their website so this script does not work anymore, so I offer no guarantee that it will work for you. Use this script at your own risk. You can download the script for Linux and OSX or you can download everything needed to run it under Windows. If you’re using Windows you should extract the Endomondo directory from the ZIP file and execute the file run.cmd. For any other OS you should just execute php getworkouts.php.

  • Computer, English Kommentarer lukket til Port Checker: Check if a TCP port is open

    Have you had this problem before? You have started a service listening on some TCP port, and you want to know if it is reachable from the Internet, or if some firewall along the way are blocking the packets. Maybe you’re running the service yourself and testing it from your local network doesn’t tell you anything about reachability from the Internet?

    Whatever the reason is for testing whether or not a TCP port is open from the Internet, here’s a service that can help you do just that: https://portchecker.bytopia.dk/

    It’s really simple to use. Just enter an IP address (IPv4 or IPv6) and a TCP port number and click Check, and the service will tell you if the port is open or closed when accessing it from the Internet.

  • This blog entry is about a small utility I made, which I call VerifiedQR. So read on if you want to know what VerifiedQR is about.

    The short version

    It allows one to store data in a QR code together with a digital signature, so the data can be authenticated by verifying the signature when reading the QR code.

    The longer version

    QR codes are often used for ticketing, especially self-print tickets. To verify the validity of such a ticket, one will normally use one of the following two solutions: Either give the QR reader online access to a database of valid ticket IDs, or preload the reader with all valid ticket IDs. However, both solutions have their disadvantages. Online access is not always (reliably) available, and preloading all valid ticket IDs on the reader prevents you from verifying tickets issued after the preloading has been done.

    The solution which VerifiedQR uses, is to store a digital signature in the QR code together with the data. Hence all readers equipped with the public key can verify that the data in the QR code is correct. Clearly this is nothing new and has been possible for a long time (although I haven’t yet seen it done for data in QR codes). However, for typical signature schemes such as RSA, the size of the signature will be prohibitively large for storage inside a QR code, which can only hold a very limited amount of data and still be easy to read. Another cryptographic solution is to use symmetric key authentication such as HMAC or CBC-MAC, but now anyone with access to a reader can potentially extract the key and forge tickets.

    VerifiedQR uses a type of public key cryptography (BLS signatures based on pairings) to keep the signature size as small as possible while still using public key cryptography. Furthermore, the data is compressed to reduce its size as much as possible. VerifiedQR is a set of Java libraries that allows one to easily generate a QR code storing a list of data items, as well as easily recover and verify data from a QR code.

    Here are some code snippets that demonstrate how it is used. First one must initialise the BLS signature scheme and generate keys. In this example we store them as well:

    BLS bls = new BLS("curve.properties");
    bls.keygen();
    bls.storePublicKey("key.public");
    bls.storeSecretKey("key.secret");
    

    One can (of course) also load keys existing keys. The curve parameters must be the same as when the keys were generated:

    bls = new BLS("curve.properties");
    bls.loadPublicKey("key.public");
    bls.loadSecretKey("key.secret");
    

    The data to be stored in the QR code are simply stored as strings in a Vector:

    Vector vec = new Vector();
    vec.add("John Doe");
    vec.add("2012-11-12");
    vec.add("192-562-3945");
    

    It is very simple to generate a 200×200 pixel qr.png file containing the QR code:

    VerifiedQR qr = new VerifiedQR();
    String strData = qr.encodeAndSign(bls, vec);
    qr.generate("qr.png", strData, 200, 200);
    

    To verify the data, first get the Vector from the QR code data stored in strData:

    Vector vec = qr.decodeAndVerify(bls, strData);
    

    If verification fails, decodeAndVerify will throw a SignatureException. Also note that for verification one does not have to call bls.loadSecretKey(). In fact verifiers should not have access to the secret key at all.

    VerifiedQR includes a small test program similar to the code above that demonstrates the functionality. Simply compile it with

    make

    and run it with

    make run

    This will generate key material, output a qr.png file, and verify the generated data.

    If you don’t have the make command on your system, just take a look at the Makefile to see what commands should be used.

    The program needs some curve parameters for an elliptic curve to use. Some examples are found in the curves/ directory, but depending on your exact needs (performance and security) you might need to generate other curves.

    License and libraries

    This program is distributed under the GNU GPL v3 and makes use of the following libraries:

    If you want to license the code under a different license, want me to help building an application around this, or just want to chat, feel free to contact me.

    Download

    Here is the link to download VerifiedQR.

  • Computer Kommentarer lukket til Cloud.dk

    Serveren der kører denne blog, samt lidt andre sites og noget e-mail, har længe kørt på en VPS hos Hetzner i Tyskland. Jeg har intet ondt at sige om Hetzner. De er super billige, og serveren har kørt stabilt og med acceptabel hastighed i lang tid, og har man brug for det tilbyder de også dedikerede servere til meget billige priser. Det sagt, så har jeg i et stykke tid haft lidt performanceproblemer med maskinen dernede. I starten troede jeg at det var netværket, men nåede til sidst til konklusionen at den fysiske maskine der kørte VPS’en nok var overbelastet. Da der er mange der tilbyder VPS hosting, så ledte jeg efter en ny udbyder.

    Der er flere forskellige i USA, og jeg har tidligere brugt ARP Networks som dengang leverede en super service. Desværre er latency til USA ofte lidt i overkanten til at en SSH forbindelse bliver en fornøjelse at arbejde med, så jeg ledte efter en udbyder der geografisk var lidt tættere på. Det endte med at jeg kiggede på om der var nogle gode og billige udbydere i Danmark, og her faldt jeg bl.a. over Cloud.dk. Okay, de er ikke helt så billige som Hetzner, men det er der vist ikke meget der er. De var dog meget mere end blot en VPS udbyder, men snarere en sky hvor man kan oprette sine egne netværk og maskiner som man har lyst til, og så betaler man kun for den tid maskinen kører, samt den plads og trafik man har brug for. Det så ganske lovende ud, så jeg oprettede straks en konto. Der var ingen bindingsperiode, så man kunne jo altid bare smutte igen hvis det ikke fungerede som forventet.

    Her et par dage senere kører denne blog, noget mail og de andre websites nu på Cloud.dk, og her er mine erfaringer indtil videre. Prisen er acceptabel, ydelsen på maskinen er super og det samme er netforbindelsen. Jeg håber performance bliver ved med at være i top selvom der med tiden skulle komme flere kunder til. Den ene gang jeg havde brug for kontakt til support blev der svaret indenfor en time, og selvom problemet ikke er løst endnu, siger de at de kigger på det, og jeg har fundet en workaround indtil videre. Jeg er også imponeret over de muligheder man har i deres kontrolpanel hvor man kan oprette netværk, maskiner og firewall regler på en meget intuitiv måde (okay, måske bortset fra firewallen, men der har de et dokument der forklarer hvordan den virker). Alle maskiner får desuden tildelt både en IPv4 og IPv6 adresse som standard.

    Så mangler du et sted at hoste en VPS eller har du brug for nogle maskiner at eksperimentere med, så prøv Cloud.dk. Det koster kun noget når maskinen kører. Indvil videre har jeg kun denne ene maskine, men jeg kommer nok ret sikkert til at oprette flere i fremtiden når jeg skal have testet et eller andet. Eneste kritikpunkt jeg lige kan komme på, er deres løse omgang med begrebet 100% oppetid på deres hjemmeside. Alle der arbejder med IT drift ved at det stort set er umuligt at garantere, og studerer man deres hjemmeside lidt mere ser man at den garanti ikke nødvendigvis betyder at dine servere er tilgængelige 100% af tiden, men at du bliver kompenseret for den nedetid der er. En ringe trøst afhængigt af hvad man har kørende på maskinen.

    Kender du mig, og mangler du et sted at smide en blog eller et fotoalbum så kontakt mig bare. Der er plads til flere på denne server 🙂

  • Lad mig sige dette med det samme: Jeg har aldrig haft ret høje tanker om diverse certificeringer indenfor IT verdenen. For mig har de primært været til for at de folk der afholder dem kan tjene penge, og endda i visse tilfælde tjene på at folk skal betale jævnligt for at beholde deres certificering. CISSP -- jeg tænker bl.a på dig. Derudover har jeg aldrig ment at multiple choice eksaminer demonstrerer et godt kendskab til sit emne, men snarere at man er god til at lære udenad. Det udelukker naturligvis ikke at dygtige folk har certificeringer, men de fleste certificeringer er IMO til for at HR afdelinger har et filter at sortere folk på, fremfor at være til for at uddanne de mest kvalificerede folk.

    Nå, nok om min rant mod certificeringer generelt. Det er ikke hvad dette indlæg skal handle om. Det skal derimod handle om at jeg rent faktisk selv har taget en certificering 🙂

    Jeg havde kigge på nogle af de forskellige certificeringer indenfor IT sikkerhed, men de fleste ramte lige præcist de kriterier ovenfor som jeg ikke bryder mig om. Under min søgen faldt jeg dog over certificeringer fra Offensive Security som jeg fandt ret interessante. Det vigtigste for mig er at man ikke bliver holdt i hånden hele vejen igennem, men derimod på egen hånd skal finde frem til løsningerne bl.a. ud fra den baggrundsviden man tilegner sig gennem kurset. Derudover er selve certificeringen 100% hands on. Ingen multiple choice spørgsmål, men 24 timer til at demonstrere at man har de evner der skal til for at bestå.

    De har flere certificeringer, men man skal jo starte et sted så jeg havde primært kigget på deres certificering som Offensive Security Certified Professional (OSCP). For at tage denne certificering skal man først følge et kursusforløb som de kalder Penetration Testing With BackTrack (PWB) hvilket er et introduktionskursus til penetration testing. Dem der kender mig ved at jeg har beskæftiget mig en del med IT sikkerhed både på det praktiske og det mere teoretiske plan, og jeg har da også haft en god idé om hvordan man angreb IT systemer og fandt sårbarheder i dem, men det har aldrig været mit primære område. Det havde jeg tænkt mig at lave lidt om på nu, så for også at få den vinkel på IT sikkerhed, tilmeldte jeg mig PWB kurset, som min arbejdsgiver heldigvis indvilligede i at betale for.

    Selve kurset foregår online. Man får en stak videoer (ca. 7 timer i alt) og en PDF fil på ca. 350 sider der supplerer videoerne (eller er det omvendt?) og så får man adgang via en VPN forbindelse til et netværk af maksiner, der alle har diverse sårbarheder i den installerede software. I løbet af kurset skal man så hacke sig ind på så mange af maskinerne som muligt, og fra nogle af dem kan man få adgang til flere netværk med endnu flere maskiner. Af hensyn til andre der måske skal tage kurset kan jeg ikke sige ret meget om hvad man udsættes for, men det er en blanding af alle mulige styresystemer og forskellige sårbarheder man skal udnytte som fx Buffer Overflows, SQL Injection, XSS attacks, LFI/RFI, og mange flere.

    Selve kurset var udfordrende. Især fordi man i materialet mest lærer de grundlæggende ting og hvordan man skal tænke for at finde den slags sårbarheder og udnytte dem. Det betyder så at man efter at have gennemgået alt materialet tror at man ved en del, men når man så kaster sig over netværket, så går man meget hurtigt i stå. Og her adskiller kurset sig fra mange andre, for nu skal man til at tænke ud af boksen og selv finde løsninger der ikke er gennemgået i kurset. Der er både en IRC kanal og et forum hvor man kan få hjælp, men spørger man om hjælp får man blot svaret “Try Harder”, så det holdt jeg mig fra. At dømme efter indlæggene på forummet er det ikke alle der kan lide denne form for undervisning, og mange ser ud til at droppe kurset undervejs. Det skyldes sikkert også til dels at man skal betale for den tid man bruger på deres netværk (30, 60 eller 90 dage med mulighed for at købe forlængelse af perioden derefter), og da kurset for stort set alle er meget mere tidskrævende end man havde forestillet sig, så bliver nogen nødt til at stoppe af økonomiske grunde… gætter jeg i hvert fald på. Dertil kommer at de underdriver forudsætningerne for kurset. Ja, man kan måske klare sig uden programmeringserfaring og kun med basalt kendskab til Linux og netværk, men så skal man bruge en del tid under kurset på at sætte sig ind i det.

    Jeg startede med 90 dage, men med et fuldtidsarbejde og andre fritidsinteresser havde jeg klart undervurderet den tid der skulle bruges på det. Da de 90 dage var gået var jeg igennem kursusmaterialet, havde hacket en ca. 10 maskiner og følte at jeg var gået helt i stå. Jeg havde prøvet alt jeg kunne komme i tanke om, og kom ingen vegne. Heldigvis fik jeg lov at købe 60 dage mere som jeg nu dedikerede til at sætte mig grundigt ind i området ved at søge på internettet, se videoer, læse artikler, etc. Og så begyndte det hele at give mening. Ens tankegang blev sporet hen på den rette måde at angribe den slags problemer på, og en efter en faldt de næste ca. 40 maskiner på netværket. Da der var to uger tilbage af min tid, valgte jeg at droppe øvelserne og i stedet begynde på den rapport man skulle lave, og det var en god idé, for den endte på ca. 320 sider.

    Nu var kurset slut og kun certificeringen tilbage. Jeg bookede tid til den på deres hjemmeside og fik at vide at jeg ville få tilsendt mine loginoplysninger til et helt nyt netværk på det tidspunkt eksamen startede. Fra det tidspunkt havde jeg 24 timer til at angribe en række maskiner og opnå points nok til at bestå certificeringen.

    Jeg kan desværre ikke sige ret meget om selve eksamen, men efter ca. 6 timer ud af de 24 havde jeg points nok til at bestå. Herefter prøvede jeg lidt ekstra og så gik jeg i seng. Dagen efter hackede jeg lidt videre indtil jeg begyndte at skrive den rapport man skulle aflevere for at dokumentere ens angreb. Den tog et par timer at lave, men faktisk havde man 24 timer ekstra til den efter at ens eksamenstid var slut. Jeg ville dog hellere holde weekend, så jeg fik skrevet den ret hurtigt 🙂 Derefter indsendte jeg rapporten fra kurset og fra eksamen og ventede…

    Et døgns tid efter fik jeg en mail om at jeg havde bestået!

    Et meget lærerigt (og hårdt) kursus som jeg godt kan anbefale til folk der gerne vil vide noget om offensive security. Vær dog forberedt på at bruge en del tid på det 🙂

« Ældre indlæg   

Seneste kommentarer

  • Du har misforstået det hvis du tror det handler om at man b...
  • > En sjælden gang imellem er der dog nogen man skal hold...
  • Currently I'm using Garmin Connect. I need a way to tra...
  • What are you using now? Before the last update I used to lo...
  • This script is obsolete. Use the renew feature of certbot in...