#!/bin/sh export DATE="24.4.2010";SCRIPT=${0#/rom} export TITLE="Verwaltung: OpenVPN RSA" . ${SCRIPT%/*}/cgi-bin-pre.sh cat<Verwaltung: OpenVPN RSA EOF key_encode() { local l= local o= for l in $(echo "$1"|sed 's/%/%25/g;s/ /%20/g;s/\//%2f/g;s/:/%3a/g;s/=/%3d/g;s/[[:cntrl:]]//g;a%0a');do o=$o$l done echo -n $o } client= ff_ovpn_tmp_crt_key= ff_ovpn_cli= if test -f /etc/init.d/S91openvpn;then ff_ovpn_cli=$(nvram get ff_ovpn_cli) fi case $REQUEST_METHOD in POST) read QUERY_STRING ;;esac case $QUERY_STRING in "") wan_hostname="$(nvram get wan_hostname)" ff_ovpn_clientremote="$(nvram get ff_ovpn_clientremote)" ff_ovpn_ca_crt="$(nvram get ff_ovpn_ca_crt)" ff_ovpn_ca_key="$(nvram get ff_ovpn_ca_key)" ff_ovpn_crt_key="$(nvram get ff_ovpn_crt_key)" ff_ovpn_dh="$(nvram get ff_ovpn_dh)" ;;*) IFS=\&;set $QUERY_STRING;unset IFS;eval $* client="$(unescape $client)" wan_hostname="$(unescape $wan_hostname)" ff_ovpn_clientremote="$(unescape $ff_ovpn_clientremote)" ff_ovpn_ca_crt="$(unescape $ff_ovpn_ca_crt)" ff_ovpn_ca_key="$(unescape $ff_ovpn_ca_key)" ff_ovpn_crt_key="$(unescape $ff_ovpn_crt_key)" ff_ovpn_dh="$(unescape $ff_ovpn_dh)" export KEY_CITY= export KEY_CN= export KEY_COUNTRY= export KEY_DIR=/tmp/keys export KEY_EMAIL= export KEY_EXPIRE=3650 export KEY_NAME= export KEY_ORG=Freifunk export KEY_OU= export KEY_PROVINCE= export KEY_SIZE=1024 test -d $KEY_DIR || mkdir $KEY_DIR test -f $KEY_DIR/serial || echo 01 > $KEY_DIR/serial test -f $KEY_DIR/index.txt || : > $KEY_DIR/index.txt case $post_build_ca in "");;*) unset QUERY_STRING echo '
'
export KEY_CN="${wan_hostname}_CA"
/usr/bin/openssl req \
-batch \
-days $KEY_EXPIRE \
-nodes \
-new \
-newkey rsa:$KEY_SIZE \
-sha1 \
-x509 \
-config /etc/openssl.cnf \
-keyout $KEY_DIR/ca.key \
-out $KEY_DIR/ca.crt
ff_ovpn_ca_crt=$(cat<'
;;esac
case $post_build_key_server in "");;*)
unset QUERY_STRING
echo '
'
echo "$ff_ovpn_ca_crt" > $KEY_DIR/ca.crt
echo "$ff_ovpn_ca_key" > $KEY_DIR/ca.key
export KEY_CN="${wan_hostname}_SERVER"
/usr/bin/openssl req \
-batch \
-days $KEY_EXPIRE \
-nodes \
-new \
-newkey rsa:$KEY_SIZE \
-extensions server \
-config /etc/openssl.cnf \
-keyout $KEY_DIR/server.key \
-out $KEY_DIR/server.csr
/usr/bin/openssl ca \
-batch \
-days $KEY_EXPIRE \
-md sha1 \
-extensions server \
-config /etc/openssl.cnf \
-out $KEY_DIR/server.crt \
-in $KEY_DIR/server.csr
unset LF
ff_ovpn_crt_key=$(cat<'
;;esac
case $post_build_key_client in "");;*)
unset QUERY_STRING
echo '
'
case $client in "")echo "Error: no client name set";;*)
echo "$ff_ovpn_ca_crt" > $KEY_DIR/ca.crt
echo "$ff_ovpn_ca_key" > $KEY_DIR/ca.key
export KEY_CN="${wan_hostname}_${client}"
/usr/bin/openssl req \
-batch \
-days 3650 \
-nodes \
-new \
-newkey rsa:1024 \
-config /etc/openssl.cnf \
-keyout $KEY_DIR/client.key \
-out $KEY_DIR/client.csr
/usr/bin/openssl ca \
-batch \
-days 3650 \
-md sha1 \
-config /etc/openssl.cnf \
-out $KEY_DIR/client.crt \
-in $KEY_DIR/client.csr
unset LF
ff_ovpn_tmp_crt_key=$(cat<'
;;esac
case $post_build_dh in "");;*)
unset QUERY_STRING
echo '
'
/usr/bin/openssl dhparam \
-out $KEY_DIR/dh${KEY_SIZE}.pem \
$KEY_SIZE
ff_ovpn_dh="$(cat $KEY_DIR/dh${KEY_SIZE}.pem)"
echo '
' ;;esac # Make sure we got all from nvram config rm -r $KEY_DIR ;;esac case $QUERY_STRING in "") cat< function hideWork() { var obj=document.getElementById('work'); if (null!=obj)obj.style.display='none'; } window.onload=function(){setTimeout("hideWork()",1500);}
Name des Klienten:  (Pflichtfeld zur Erzeugung) EOF case $ff_ovpn_cli in 0) cat<
Herunterladen: EOF case $ff_ovpn_tmp_crt_key in "") cat<";;esac cat<";;esac;;esac cat<
Klienten-Zertifikat (*.crt) &
Klienten-Schlüssel (*.key):

 

EOF case $ff_ovpn_cli in 0) cat< (Für Klienten-Konfigurations-Tar s.o.)
EOF ;;esac cat<  (Präfix für alle CN)
CA-Zertifikat (ca.crt):
CA-Schlüssel (ca.key):
 
Server-Zertifikat (server.crt) &
Server-Schlüssel (server.key):
 
Diffie-Hellman-Parameter:
 
      

Tipp: Diese Seite veraltet nur die erste Konfiguration, wenn mehrere OpenVPN-Konfigurationen vorhanden sind. Für einen zweiten OpenVPN-Server (z.B. mit TCP auf einem anderen Port) müssen daher die entsprechenden Eingabefelder manuell von der ersten auf die zweite Konfigurationsseite kopiert werden.

Hinweise zur Schlüsselverwaltung

  • Ein Schlüssel dient zum Verschlüsseln bzw. zum Entschlüsseln eines Datenstroms. Ein Zertifikat bestätigt die Echtheit eines Schlüssels. Alle hier erzeugten Schlüssel und Zertifikate bleiben 10 Jahre gültig.
  • Die CA ("Certificate Authority") wird benötigt, um die Echtheit aller erzeugten Schlüssel und Zertifikate bestätigen zu können. Auf jedem Server erzeugt man dazu zunächst einen CA-Schlüssel. Dieser Schlüssel bleibt geheim, wird also niemals herausgegeben.
  • Mit Hilfe des CA-Schlüssels wird zugleich ein CA-Zertifikat erstellt. Verteile das CA-Zertifikat an alle angeschlossenen Klienten. Hinweis: Jedermann kann solche, selbst-bestätigenden Zertifikate erzeugen. Teuer wird es nur, wenn man Dritte zur Bestätigung der Echtheit einbinden will, z.B. eine Regierung oder eine Firma. Deren Prüfungskompetenz und Ehrlichkeit vertrauen z.B. viele Web-Browser. Aus diesem Grund haben Web-Browser vorinstallierte CA-Zertifikate denen sie blind vertrauen. Trägt man ein CA-Zertifikat von Rechner zu Rechner, sollte man aufpassen dass der Datenträger nicht unterwegs von fiesen Finsterlingen ausgetauscht wird.
  • In einem zweiten Schritt erzeugt man ein Paar aus Schlüssel und Zertifikat für den Server. Dieses Paar verbleibt auf dem Server.
  • In weiteren Schritten erzeugt man Paare aus Schlüsseln und Zertifikaten für jeden Klienten. Diese Paare transportiert man auf sicherem Wege zu den Klienten. Wiederhole nun diese Schritte für jeden Klienten:
    1. Eingabefeld Name des Klienten ausfüllen.
    2. Schaltfläche Klienten-Paar erzeugen drücken.
    3. Den Inhalt des Feldes Klienten-Zertifikat & Klienten-Schlüssel über die Zwischenablage z.B. in eine Textdatei einfügen.
    4. Textdatei zum Klienten transportieren und Inhalt dort in das Eingabefeld Zertifikat & Schlüssel eingeben.

    Tipp: Zunächst den OpenVPN-Server wie gewünscht einrichten. Dabei die erste OpenVPN-Konfiguration verwenden, falls mehrere Konfigurationen vorhanden sind. Dann nach der Erzeugung eines Klienten-Schlüssels den Link Klienten-Konfiguration (Tar) anklicken. Die heruntergeladene Archiv-Datei kann z.B. für die Windows-OpenVPN-GUI verwendet werden: den Archiv-Inhalt nach C:\Programme\OpenVPN\config auspacken.

    Hinweis: Der Speicherplatz auf diesem Router ist begrenzt. Daher werden erzeugte Schlüssel und Zertifikate für Klienten nicht gespeichert. Um später einzelne Schlüssel zurückzuziehen zu können, können herausgegebene Schlüssel an einem anderen Ort gespeichert werden. Eine CRL (Certificate Revocation List) wird mit dieser Oberfläche nicht verwaltet.

  • Der Server benötigt die "Diffie-Hellman" Parameter zur Optimierung der Datenverbindung durch eine schnellere symmetrische Verschlüsselung. Kopiere diese Parameter von einem deiner anderen Server oder erzeuge neue Parameter. Die Parameter sind geheim, also nicht verteilen. Achtung: dieser Vorgang dauert auf einem Router bis zu 15 Minuten.
  • Zum Schluss das Speichern der Einstellungen mit der Schaltfläche Übernehmen nicht vergessen!
EOF ;;*) DIRTY= case $post_ovpn in "");;*) keys="wan_hostname ff_ovpn_ca_crt ff_ovpn_ca_key ff_ovpn_crt_key ff_ovpn_dh" case $ff_ovpn_cli in 0)keys="$keys ff_ovpn_clientremote";;esac for V in $keys; do eval C=\"\$$V\" case "$(nvram get $V)" in "$C");;*) DIRTY=1 nvram set $V="$C" ;;esac done ;;esac case $DIRTY in "") cat<Es wurden keine Einstellungen geändert. EOF ;;1) nvram commit>&- 2>&- cat< Die geänderten Einstellungen wurden übernommen. Die Einstellungen sind erst beim nächsten Neustart aktiv. EOF ;;esac ;;esac . ${SCRIPT%/*}/cgi-bin-post.sh