Der steinige Weg zu SSL Zertifikaten

Schon seit einiger Zeit ist die Absicherung von Internetverbindungen für Google ein Rankingfaktor bei Webseiten und Blogs. Somit ergab sich für mich auch die Notwendigkeit meine Portale entsprechend mit SSL Zertifikaten auszustatten. Ein langer, steiniger und teurer Weg der mit Hilfe von Let’s Encrypt etwas entspannter ist.

SSL Zertifikat kaufen vs. Let’s Encrypt

Grundsätzlich gibt es mehrere Stufen von SSL Zertifikaten. Die einfachte Stufe ist die eigene Generierung eines Zertifikats und dessen Bereitstellung (Self-signed Zertifikate). Nachteilig bei dieser Methode ist eindeutig die große rote Fehlermeldung des Browsers, dass dies kein vertrauenswürdiges Zertifikat ist. Die Methode ist somit für alles außer Testsysteme ungeeignet.

Die nächste Stufe ist ein Domain SSL Zertifikat. Dies wird über eine autorisierte Stelle ausgegeben und beinhaltet eine Prüfung ob der Antragsteller auch der Besitzer der Domain ist. Das reicht für eine normale Webseite bereits aus. Für besseren Schutz lassen sich auch der Inhaber (Organization SSL Zertifikat) und der Zertifikatsinhaber (Extended SSL Zertifikat) validieren. Letzteres ist für alle Unternehmen relevant die eine grüne Adressleiste (Name des Unternehmens im Browser) benötigen, also beispielsweise Banken oder Versicherungen.

Die Zertifikate reichen dabei je nach Anbieter zwischen 2€ pro Monat bis zu einigen hunderte Euro pro Jahr UND Domain! Bei vielen Domains kommen dabei recht hohe Summen zustande. SSL Zertifikate können daher gebündelt werden (Multidomain SSL Zertifikate), dies spart ein paar Euro. Bei vielen Subdomains besteht ebenfalls die Möglichkeit ein Wildcard SSL Zertifikat zu erstellen, dies beinhaltet dann alle Domain in der Form *.SPech.de.

Ein Zusammenschluss von vielen Unternehmen hat das Projekt Let’s Encrypt gestartet. Das hochgesteckte Ziel ist die Bereitstellung einer Zertifizierungsstelle mit vollständig kostenlosen und sicheren Zertifikaten und deren automatisierte Generierung. Bei den Zertifikaten handelt es sich um Domain und Multidomain SSL Zertifikaten!

Die Einrichtung

Grundsätzlich ist der Ablauf für die Beschaffung eines Zertifikats sehr übersichtlich. Zur Bestellung wird ein privater Schlüssel und ein Certificate Signing Request (CSR) erstellt. Der CSR beinhaltet neben einigen formalen Informationen auch die Domainnamen. Der Request ist dann an die Zertifizierungsstelle zu schicken. Nach der Validierung kommt dann ein Zertifikat (CRT) zurück welches zusammen mit dem privaten Schlüssel für den Webserver nutzbar ist.

Bei virtuellen oder root Servern mit SSH Zugriff und eigener Administration ist der Prozess eher trivial. Let’s Encrypt stellt dazu alle notwendigen Dokumente und Skripte zur Verfügung. Bei gehosteten Webseiten ist die Hürde hier deutlich höher. Eine Anleitung für meinen Provider Hosteurope hat mir sehr geholfen. Da sich das Verfahren hier bei jedem Anbieter (1&1, Strato, GoDaddy, …) unterscheidet gehe ich hier nur auf meine gefundenen Probleme und Hürden ein.

Die Validierung: Entweder lassen sich Domains über DNS Einträge oder (HTML) Dateien validieren. Im ersten Versuch hatte ich die DNS Variante probiert. Leider dauert die Replikation dieser TXT Einträge analog zu A-Records auch 24-48 Stunden. So lange wollte ich dann doch nicht warten. Bei der HTML Variante muss für JEDE! Domain eine eigene Datei in einem Unterverzeichnis abgelegt werden. Dies dauert extrem lange. Zusätzlich hatte ich einige Subdomains die nicht öffentlich zugänglich sind (.htaccess). Für diese Seiten musste ich also die Konfigurationen ebenfalls anpassen damit SSL dort auch funktioniert.

Mixed Contend: Meine Webseiten sind über viele Jahre gewachsen und teilweise aus älteren Systemen überführt worden. Oft schleichen sich dort feste Verweise in der Form http://www.spech.de/.../bild.jpg ein oder Links sind fix mit http erstellt. Dies führt im Browser zu einer Warnung, dass die Seite aufgrund unsicher eingebundener Elemente nicht den aktuellen Sicherheitsrichtlinien entspricht. Entsprechend müssen alle Verweise angepasst werden.

Umleitung: Am Schluss mussten alle Verweise auf die http Version mittels Weiterleitung auf die https Variante eingestellt werden. Neben automatischen Weiterleitungen im Webserver muss diese Einstellung auch in den Content Management Systemen erfolgen (WordPress, Drupal, …).

Lets’Encrypt Automatisierung für HostEurope

Es gibt für HostEurope mittlerweile einen etwas weniger steinigen Weg zusammen mit einem Raspberry Pi (oder anderen Linux Systemen).

Auf dem Raspberry Pi certbot installieren für jessie anhand der Anleitung. Danach die Skripte von hosteurope-letsencrypt konfigurieren und ausführen. Zum Abschluss die passenden Daten in KIS hochladen.

Seit gestern gibt es die developer preview (alpha v1) der Google Assistant API zur freien Verfügung. Auf der Developer Webseite sind neben der Ankündigung einige Samples veröffentlicht. Der in Python geschriebene Code steht auch für den Raspberry Pi zur Verfügung.

Google Assistant

Der Google Assistant ist ein persönlicher Assistent von Google für Android, Google Home und den Messenger Google Allo, der sowohl gesprochene als auch eingegebene natürliche Sprache empfängt und verarbeitet. Die Software ist der Nachfolger von Google Now. (Quelle: Wikipedia) In diversen Android Produkten von Smartphones bis zum Smart TV ist der Assistent im Einsatz. Jetzt können alle Entwickler von dem Dienst profitieren.

Google Assistant mit dem Raspberry Pi

Auf der Beispiele Webseite findet sich eine kleine Anleitung zur Einbindung des Dienstes in den Raspberry Pi. Die Komponenten sind schnell gekauft. Neben dem Pi selber wird nur ein Mikrofon und ein Lautsprecher benötigt. Nach der Einrichtung erfolgt die Erstellung eines Projektes und die Generierung von API Keys.

Das Sample selber steht über den Python Paketverwaltung zur Verfügung und lässt sich mit wenigen Zeilen Code installieren.

 

Raspberry Pi Gesichtserkennung mit Microsoft Cognitive Services

Microsoft stellt mit den Microsoft Cognitive Services eine Reihe von Services für Bilderkennungsverfahren zur Verfügung. Die Face API bildet eine gute Schnittstelle um dem Raspberry Pi die Gesichtserkennung zu ermöglichen. Mit Hilfe einer Webcam und etwas JavaScript und Node.js lassen sich Bilder aufnehmen und zur Analyse hochladen. Der Cloud-Dienst ist dabei bis zu einer gewissen Menge von Abfragen kostenlos nutzbar.

Pakete installieren

Project Oxford for Node.js ist eine einfach zu nutzende Bibliothek um die Schnittstelle nutzen zu können.

$ mkdir face
$ cd face
$ npm install project-oxford

Account erstellen und API Key generieren

Auf der Microsoft Cognitive Services Webseite ist ein Account zu erstellen. Nach einer kurzen E-Mail Verifikation kann dort ein API Key erstellt werden. Dazu den Punkt „Face Preview – 30,000 transactions per month, 20 per minute.“ anklicken und nach Bestätigung der Lizenz den Subscribe Button klicken. Der Key erscheint nun in der Übersicht.

Foto generieren

Ein nützliches Programm für die Aufnahmen mit einer Webcam ist fswebcam. Es lässt sich einfach über die Kommandozeile zum Erstellen von Snapshots nutzen. Die Installation erfolgt direkt über das Paket.

$ sudo apt-get install fswebcam

Um mit dem Programm ein Screenshot ohne Zeitstempel im Bild aufzunehmen erfolgt der Aufruf mit der entsprechenden Option.

$ fswebcam --no-banner 001.jpg

Gesichter erkennen

Der folgende Code ist von der oben genannten project-oxford package Webseite übernommen. Es wurden aber Fehler behoben (faceAttributes anstelle von attributes) und der Code ist um die Anzeige mehrerer Gesichter ergänzt.

$ nano face.js
# oder vi ;-)
var oxford = require('project-oxford'),
    client = new oxford.Client('xxx KEY HIER EINTRAGEN xxx');

client.face.detect({
    path: '001.jpg',
    analyzesAge: true,
    analyzesGender: true
}).then(function (response) {
    for(var i = 0; i < response.length; i++) {
        console.log('Gesicht ' + i);
        console.log('  Alter: ' + response[i].faceAttributes.age);
        console.log('  Geschlecht: ' + response[i].faceAttributes.gender);
        console.log('  Position: Oben ' + response[i].faceRectangle.top + ' - Links ' + response[i].faceRectangle.left);
        console.log('  Position: Breite ' + response[i].faceRectangle.width + ' - Hoehe ' + response[i].faceRectangle.height);
    }
});

Aufnehmen und verschicken

Für die Einbindung von fswebcam bietet das node-webcam Paket einen Wrapper. Die Installation erfolgt wieder über npm.

$ npm install node-webcam

Das neue Paket binden wir nun in den Code mit ein. Da Dateiausgaben asynchron durchgeführt werden muss die Gesichtserkennung im Function Callback des node-webcam Codes stehen (oder als eigene Funktion). Trotz des Ausgabetyps jpeg endet der Dateiname in jpg!

var NodeWebcam = require('node-webcam');

var opts = {
    quality: 100,
    output: "jpeg",
    verbose: true
}

var oxford = require('project-oxford'),
    client = new oxford.Client('xxx KEY HIER EINTRAGEN xxx');

NodeWebcam.capture('001', opts, function(err, data) {
    if(!err) {
        console.log('Image created!');
    }

    client.face.detect({
        path: '001.jpg',
        analyzesAge: true,
        analyzesGender: true
    }).then(function (response) {
        for(var i = 0; i < response.length; i++) {
            console.log('Gesicht ' + i);
            console.log('  Alter: ' + response[i].faceAttributes.age);
            console.log('  Geschlecht: ' + response[i].faceAttributes.gender);
            console.log('  Position: Oben ' + response[i].faceRectangle.top + ' - Links ' + response[i].faceRectangle.left);
            console.log('  Position: Breite ' + response[i].faceRectangle.width + ' - Hoehe ' + response[i].faceRectangle.height);
        }
    });
});

Emotionen erkennen

Das Erkennen von Emotionen ist ebenfalls einfach umzusetzen. Allerdings weißt das Paket nicht auf die Notwendigkeit eines zweiten Clientobjektes und eines weiteren API Keys hin. Auf der Microsoft Webseite muss ebenfalls das API „Emotion – Preview – 30,000 transactions per month, 20 per minute.“ aktiviert werden. Der API Key ist dann an einen weiteren client (hier emoclient (Haha, super Name, ist mir aber erst später nach dem Schreiben aufgefallen)) zu übergeben.

var oxford = require('project-oxford'),
    emoclient = new oxford.Client('xxx ANDEREN KEY HIER EINTRAGEN xxx');

emoclient.emotion.analyzeEmotion({
    path: '001.jpg',
}).then(function (response) {
    console.log(response);
});
Parrot AR Drone 2.0 mit Raspberry Pi steuern

Die Parrot AR.Drone 2.0 Power Edition ist schon etwas älter, aufgrund der hervorragenden Entwicklungsumgebungen eignet sich der Quadrocopter jedoch sehr gut für ein Projekt mit dem Raspberry Pi. Im Folgenden soll die Steuerung mit Hilfe von, auf Node.js aufbauenden, Skripten erfolgen. Für das Fliegen über den Minicomputer sind keine Vorerfahrungen notwendig. Der Copter stabilisiert sich eigenständig in der Luft und die Kommunikation erfolgt direkt über WLAN. Das Linux Betriebssystem des Quadrocopter ist in Teilen konfigurierbar. Außerdem verfügt das Gerät über zwei Kameras welche sich zur Gesichtserkennung oder für Videoaufnahmen eignen.

Alle Befehle der Parrot AR.Drone 2.0 sind im AR.Drone Developer Guide beschrieben. Das mehrere hundert Seiten umfassende Werk bietet sich aber eher zum Nachschlagen an. Unter dem Projekt NodeCopter hacking ist eine Node.js basierende Skript Bibliothek entstanden. Diese bildet die Grundlage für die folgende Implementierung. Die Idee der Gesichtserkennung basiert dabei auf dem Artikel How to build an autonomous, voice-controlled, face-recognizing drone for $200. In dem Artikel bilden die Microsoft Azure Cognitive Services die Grundlage. Für die Spracheingabe lässt sich auch IBM Watson nutzen.

Pakete installieren mit npm

Zuerst erfolgt das Anlegen eines Verzeichnisses in dem die Daten liegen. Die Initialisierung über npm (Node Package Manager) ist hierbei Optional. Das Tool generiert eine package.json in der später die Abhängigkeiten abgelegt werden, falls der Code beispielsweise auf github veröffentlicht werden soll.

$ mkdir ardrone
$ cd ardrone
#OPTIONAL
$ npm init
This utility will walk you through creating a package.json file.
name: (ardrone)
version: (1.0.0)
description: Parrot AR.Drone 2.0 Control
entry point: (index.js)
test command:
git repository:
keywords: Drone
author: Sebastian Pech
license: (ISC)
About to write to /home/pi/ardrone/package.json

Im Anschluss daran erfolgt die Installation der ar-drone Pakete.

$ npm install ar-drone
# ODER mit -save wenn die package.json über npm init erstellt wurde
$ npm install ar-drone -save

WLAN einrichten

Die Parrot AR.Drone stellt ein öffentliches und unverschlüsseltes WLAN zur Verfügung. Zum kontrollieren des Quadrocopter muss sich der Raspberry Pi mit diesem verbinden. Danach lassen sich die Steuerbefehle übermitteln.

$ sudo iwlist wlan0 scan

Nach dem Scan sollte in der Liste ein Eintrag mit _ESSID:“ardrone2123456″ oder ähnlichem erscheinen. Zu diesem soll nun die Verbindung hergestellt werden.

$ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
network={
        ssid="ardrone2_123456"
        key_mgmt=NONE
}
# Bei mehreren WLAN Einträgen können diese priorisiert sein
network={
        ssid="ardrone2_123456"
        key_mgmt=NONE
        priority=1
}

Die korrekte Verbindung lässt sich dann wie folgt ermitteln.

$ wpa_cli status

Weitere Informationen im Fehlerfall finden sich im Setting WiFi up via the command line Artikel. Mit einem weiteren WLAN Empfänger können auch zwei Netze genutzt werden.

Drone steuern mit dem Raspberry Pi

Nun kommt der spannendste Teil des ganzen Projektes. Der Quadrocopter soll sich magisch in die Luft erheben, etwas drehen und dann wieder landen. Dazu dient der folgende Code vom Node Copter Projekt in einer Datei namens ardrone.js.

$ nano ardrone.js
# oder vi ;-)
var arDrone = require('ar-drone');
var client = arDrone.createClient();

client.takeoff();

client
  .after(5000, function() {
    this.clockwise(0.5);
  })
  .after(1000, function() {
    this.stop();
    this.land();
  });

Checkliste vor dem Ausführen:

  • Smartphone nicht verbunden (oder Pooling aktiviert)
  • Raspberry Pi mit der Drone verbunden
  • Akku voll
  • Indoor-Gehäuse angebracht
  • Kinder, Tiere, Glas, Papierblätter, … außer Reichweite gebracht
  • Keinen Mut angetrunken (Nüchtern! ;-))

Dann kann nicht mehr viel schief gehen (außer einige Crashes, usw.) … Viel Glück!

$ node ardrone.js

Sicherheit

Das WLAN der AR.Drone ist unverschlüsselt, ein Zugriff ist also jederzeit von jedem Gerät möglich! Das Anlegen eines WPA Schlüssels kann hier Abhilfe schaffen.

Grundsätzlich gelten alle Sicherheitsbestimmungen der Anleitung. Ich rate dazu, die Drone drinnen nur mit dem Indoor-Gehäuse zu fliegen. Die Bewegung der Quadrocopter ist dadurch etwas träger und schwammiger aber die Einrichtung wird es einem danken.

Um das Unsanfte Fallen der Drone ein bisschen zu verbessern kann ein Landegestell aus Kabelbindern helfen.

Probleme mit dem Video

Die Beispiele png-stream.js und tcp-video-stream.js setzen das veraltete FFmpeg voraus. Die Installation ist leider nicht ganz trivial. Dennoch gibt es ein paar gute Anleitungen für experimentierfreudige Bastler. How to compile ffmpeg on a Raspberry Pi und Compiling software from source code on the raspberry pi – the ffmpeg suite.

# Wenn mstorsjo-fdk-aac und faac-1.28 installiert sind:
$ git clone http://source.ffmpeg.org/git/ffmpeg.git
$ cd ffmpeg
$ ./configure --prefix=/usr/local --enable-gpl --enable-nonfree --enable-libass 
  --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus 
  --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid
$ make && sudo make install
$ ffmpeg
iBeacon Scanner mit Raspberry Pi

In der Vergangenheit hatte ich bereits über iBeacons für die Haussteruerung berichtet. Der Raspberry Pi 3 und der brandneue Raspberry Pi Zero W verbauen standardmäßig Bluetooth Chips. Beide Geräte sind dazu geeignet einen iBeacon in der Nähe zu scannen. Findet der Pi dann eine Gerät in der Nähe kann man mittels Skript auf die Präsenz reagieren.

Prüfen und scannen

Im ersten Schritt ermitteln wir den Bluetooth Status des Gerätes und scannen dann nach Bluetooth Low Energy (BLE) Geräten. Idealerweise taucht hier dann der erste iBeacon auf.

$ systemctl status bluetooth
$ sudo hcitool lescan --duplicates
20:CD:XX:XX:XX:XX (unknown)
20:CD:XX:XX:XX:XX (unknown)

Für eine weitere Analyse lassen sich die Daten mitschneiden.

$ sudo apt-get install bluez-hcidump
$ sudo hcidump --raw

Ausgabe optimieren

Die Ausgabe von hcidump ist nicht sehr leserlich. Mit einem Skript von radiusnetworks oder einem geklonten Skript auf Github.com lässt sich die Ausgabe optimieren.

$ wget http://developer.radiusnetworks.com/ibeacon/idk/ibeacon_scan
$ chmod u+x ibeacon_scan
$ sudo ./ibeacon_scan

Fehlerbehebung

Die Fehlermeldung „Set scan parameters failed: Input/output error“ weißt auf ein belegtes/gesperrtes Bluetooth Gerät hin (bsp. durch den Kill eines hci* Prozesses). Die folgende Lösung schafft Abhilfe.

$ sudo killall hcitool
$ sudo killall ibeacon_scan
$ hciconfig hci0 down
$ hciconfig hci0 up