Selbstsigniertes Zertifikat erstellen und bei Nginx einbinden

Für verschlüsselte HTTP Verbindungen benötigt man ein Zertifikat. Dieses kann man sich von einer Zertifizierungsstelle (Certificate Authority, CA) ausstellen lassen. Der Haken an der Sache ist das dies Geld kostet (CACert und StartCom mal außen vor gelassen). Eine Alternative hierzu wäre es das Zertifikat selbst zu erstellen. Bei Diensten die man nur für einen kleinen Nutzerkreis z.B. für die Familie hostet, ist es auch vertretbar die Zertifikatswarnung im Browser über sich ergehen zu lassen. Für die Zertifikate wird ein Ordner erstellt und in diesen gewechselt:

mkdir /etc/nginx/ssl
cd /etc/nginx/ssl

Nun werden das Zertifikat und der Certificate Signing Request erstellt:

openssl genrsa -out example.key 2048
openssl req -new -key example.key -out example.csr

Bei der Erstellung des Certificate Signing Request müssen einige Daten angegeben werden:

Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Mecklenburg-Vorpommern
Locality Name (eg, city) []:Neubrandenburg 
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Inc
Organizational Unit Name (eg, section) []:Skunk works
Common Name (e.g. server FQDN or YOUR name) []:example.org
Email Address []:webmaster@example.org

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Nun muss das Zertifikat noch signiert werden, bevor wir es verwenden können:

openssl x509 -req -days 730 -in example.csr -signkey example.key -out example.crt

In diesem Fall ist das Zertifikat 730 Tage, also zwei Jahre gültig. Da die Signierung nun abgeschlossen ist, kann das Zertifikat in Nginx eingebunden werden. Dazu öffnen wir die Datei „/etc/nginx/sites-available/example“, wobei „example“ hier natürlich für die entsprechende Konfigurationsdatei steht. Dort sollte die SSL Konfiguration vorgenommen werden:

server {
        listen 443 ssl;

        root /var/www/example/root;
        index index.html index.htm;
 
        server_name .example.org;

        ssl_certificate /etc/nginx/ssl/example.crt;
        ssl_certificate_key /etc/nginx/ssl/example.key;
}

Nach dem Aktualisieren der Konfiguration mittels:

service nginx restart

ist die verschlüsselte Verbindung für die eingerichtete Seite aktiv und kann genutzt werden.

Weitere Informationen gibt es unter:
http://nginx.org/en/docs/http/configuring_https_servers.html

ownCloud und der iOS Sync

Eine eigene ownCloud ist nur die halbe Lösung, wenn man damit Dienste wie Google Mail und Co. ablösen möchte. Was auch gewünscht ist, sind Dinge wie die Synchronisation der Kalender und Kontakte mit dem Mobilgerät. In diesem Fall soll es dabei um iOS gehen, welches in Verbindung mit ownCloud einige Besonderheiten aufweist. Das gleiche gilt auch in Verbindung mit Mac OS X. Bei den Kontakten wird mittels CardDAV synchronisiert. Dies geschieht normalerweise über die URL:

https://example.org/owncloud/remote.php/carddav/addressbooks/seeseekey/contacts

Bei OS X und iOS sieht die URL aber so aus:

example.org/owncloud/remote.php/carddav/principals/seeseekey/

Wichtig ist hierbei das HTTPS oder HTTP weggelasen wird, da dies sonst zu Problemen führt. Der Nutzername „seeseekey“ muss dabei durch den eigenen Nutzernamen ersetzt werden. Bei meinem iOS Gerät habe ich die ganze URL nochmal abgewandelt um auf Nummer sicher zu gehen:

example.org:443/owncloud/remote.php/carddav/principals/seeseekey/

Das zeigt dem Gerät welchen Port er für die SSL-Verschlüsselung benutzen soll. Für CalDAV wäre folgende URL zu benutzen:

example.org:443/owncloud/remote.php/caldav/principals/seeseekey/

Unter iOS 7 scheint das ganze in der aktuellen Betaversion noch nicht rund zu laufen, allerdings dauert es bis zur finalen Version noch ein paar Monate, so das man hier Besserung erwarten darf.