Der französische Anbieter gooze bietet die kostengünstigen und Open Source kompatiblen Smartcard Systeme des chinesischen Herstellers Feitian an. Die Smartcards und Tokens sind vergleichsweise preiswert und enthalten nicht die üblichen Abos, NDAs und andere Hürden, die einem bei anderen Anbietern für einen einfachen Einsatz im Weg stehen.
Darüberhinaus ist die Lieferung relativ schnell, wenn die Smartcards nicht irritierenderweise beim Zoll festsitzen oder die Lieferung aus China sich verspätet.
Das Token ePass2003 ist ein USB-Stick mit integrierter Smartcard und Kartenleser. Die Einrichtung des Tokens für die Verwendung mit opnevpn unter Mint 14 LMDE ist wird im Folgenden beschrieben.
Die aktuellen Debian Distributionen enthalten nicht die aktuellsten OpenSC Treiber. Auch wenn der Sicherheitsimpact abgewägt werden muss habe ich mich entscheiden das Repository von Gooze zu verwenden um passende und geprüfte OpenSC Pakete zu bekommen.
Um dies zu erreichen muss das Repository von Gooze der sources.list hinzugefügt werden. Da Mint 14 im Wesentlichen auf debian Wheezy basiert, wird das Wheezy Repo der sources.list hinzugefügt.
Als erstes müssen diese zwei Zeilen der Datei /etc/apt/sources.list hinzugefügt werden:
deb http://apt.gooze.eu/debian/ wheezy main
deb-src http://apt.gooze.eu/debian/ wheezy main
Mit:
# wget -q "http://apt.gooze.eu/257FF7B2.asc" -O- | sudo apt-key add -
wird der Schlüssel für die Gooze Packages dem Keyring hinzugefügt.
Im Ordner /etc/apt/preferences.d/ die Datei gooze mit folgendem Inhalt anlegen:
Package: *
Pin: origin o=apt.gooze.eu
Pin-Priority: 1001
Nach der Ausführung von apt-get update können alle notwendigen Pakete mit der Anweisung:
# apt-get install pcscd pcsc-tools libccid libpcsclite1 openvpn opensc/staging
installiert werden.
Das ePass2003 ist im Auslieferungszustand für die Feitian Windows-Treiber vorbereitet. Das verhindert die korrekte Erkennung unter Linux. Um das Token unter Linux "sichtbar" zu machen muss das Token neu initialisiert werden.
Während der Initialisierung werden die PIN und die PUK (SuperPIN) vereinbart, sowie ein Label, das verschiedene Programme bei der Nachfrage nach der PIN als Text verwenden.
$ pkcs15-init -E
$ pkcs15-init --create-pkcs15 --profile pkcs15+onepin \
--use-default-transport-key --pin 123456 \
--puk 7891011 --label "Peter
Mustermann"
Ist die Initialisierung erfolgreich sollte die Anweisung:
$ pkcs15-tool --dump
ungefähr die folgende Ausgabe liefern.
PKCS#15 Card [Peter Mustermann]:
Version : 0
Serial number : 1234567890091101
Manufacturer ID: EnterSafe
Last update : 20120630083313Z
Flags : EID compliant
PIN [User PIN]
Object Flags : [0x3], private, modifiable
ID : 01
Flags : [0x32], local, initialized, needs-padding
Length : min_len:4, max_len:16, stored_len:16
Pad char : 0x00
Reference : 1 (0x01)
Type : ascii-numeric
Path : 3f005015
...
Damit ist das Token betriebsbereit und kann mit Schlüsseln und Zertifikaten bespielt werden.
Wie man sich einen Schlüssel und ein Zertifikat für SSL erstellt ist erschöpfend im Netz beschrieben, weswegen ich diesen Punkt überspringe und davon ausgehe, das sich der Leser im Besitz einer gültigen PKCS#12 (.p12) Datei befindet.
Mit den Anweisungen:
$ openssl pkcs12 -in cert.p12 -clcerts -nokeys -out petercert.pem
$ openssl pkcs12 -in cert.p12 -cacerts -nokeys -out root.pem
$ openssl pkcs12 -in cert.p12 -nocerts -out peterkey.pem
werden die notwendigen Dateien aus der PKCS#12 Datei extrahiert.
Mit:
$ pkcs15-init --store-private-key peterkey.pem --auth-id 01 --pin 123456
wird der Schlüssel auf dem Token gespeichert. Während dieser Prozedur wird dem Schlüssel eine ID zugewiesen die ausgelesen werden muss, um das Zertifikat mit diesem Schlüssel zu assoziieren.
$ pkcs15-tool --list-keys
Listet alle Schlüssel des Tokens mit deren Ids:
Using reader with a card: Feitian ePass2003 00 00
Private RSA Key [Certificate]
Object Flags : [0x3], private, modifiable
Usage : [0x4], sign
Access Flags : [0xD], sensitive, alwaysSensitive, neverExtrac
ModLength : 2048
Key ref : 0 (0x0)
Native : yes
Path : 3f0050152900
Auth ID : 01
ID : 012347050ef750567872b7e7aa80539110b0e921
GUID : {0abc494d-2712-32dc-b64d-be218b23ce90}
Die ID muss beim Speichern des Zertifikates angegeben werde:
# pkcs15-init --store-certificate petercert.pem --auth-id 01 \
--id 012347050ef750567872b7e7aa80539110b0e921 --format pem
Das Token ist jetzt vollständig eingerichtet.
Um das Token für openvpn nutzbar zu machen muss eine Client Konfiguration im Ordner /etc/openvpn angelegt werden. Openvpn erzeugt seine eigenen IDs mit denen es Schlüssel auf dem Token identifiziert. Diese ID wird mit:
# openvpn --show-pkcs11-ids /usr/lib/opensc-pkcs11.so
ausgelesen und sieht ungefähr so aus:
The following objects are available for use.
Each object shown below may be used as parameter to
--pkcs11-id option please remember to use single quote mark.
Certificate
DN: /C=DE/ST=Berlin/L=Berlin/O=Foobar GmbH/OU=FooSecurity/CN=Peter Mustermann
Serial: 09
Serialized id: EnterSafe/PKCS\x2315/6257011116091101/Peter\x20Mustermann\x20\x28User\x20PIN\x29/0012347050ef750567872b7e7aa80539110b0e9211
Der gelb markierte Hinweis ist unbedingt zu beachten, da ansonsten die \ Zeichen falsch interpretiert und das Zeritifkat nicht mehr zugeordnet werden kann.
Eine minimale /etc/openvpn/client.conf könnte dann so aussehen, wobei hierzu unbedingt die Dokumentation der OpenVPN Website konsultiert werden sollte.
Außerdem hängt der Inhalt der Datei von den Einstellungen ab, die auf der Serverseite durchgeführt worden sind. Für einen einfachen minimalen Test reicht das angegebene Beispiel in jedoch aus.
client
dev tun
proto udp
remote vpn.foobar.com
nobind
persist-key
persist-tun
ca /etc/openvpn/certs/foobar-ca.cert
pkcs11-providers /usr/lib/opensc-pkcs11.so
pkcs11-id 'EnterSafe/PKCS\x2315/6257011116091101/Peter\x20Mustermann\x20\x28User\x20PIN\x29/0012347050ef750567872b7e7aa80539110b0e9211'
comp-lzo
Mit der Anweisung:
# openvpn --config /etc/openvpn/vpn.sourcepark.biz --verb 2
beginnt der Aufbau der Tunnelverbindung. Sobald der Server kontaktiert wurde und der SSL Handshake begonnen hat wird die PIN abgefragt. Nach Eingabe der korrekten PIN wird die Tunnelverbindung etabliert und kann verwendet werden.
Das Erstellen der Zertifikate und die korrekte Verwendung verlangen etwas Übung. Sollte das Token nicht wie gewünscht arbeiten, kann man den Tunnel testweise nur mit den Zertifikaten aufbauen, und anschlie0end die geprüften Zertifkate auf das Token übertragen.
Eine OpenVPN Client Konfiguration, die mit der Zertifkats- und Schlüsseldatei arbeitet würde so aussehen:
client
dev tun
proto udp
remote vpn.foobar.com
nobind
persist-key
persist-tun
ca /etc/openvpn/certs/foobar-ca.cert
cert /etc/openvpn/certs/petercert.pem
key /etc/openvpn/private/peterkey.pem
comp-lzo
Kann mit dieser Konfiguration kein Tunnel etabliert werden liegt es an den Zertifikaten. Lässt sich mit der Angegebenen Konfiguration ein Tunnel aufbauen, arbeitet der Treiber oder das Token nicht korrekt.
Hallo,
AntwortenLöschenvielen Dank für das Einstellen diese blogs.
Leider bekomme ich die Verbindung mit dem ePass2003 trotz der guten Bescheibung nicht hin. Ich erhalte folgende openvpn-Fehlermeldung:
...
2016-10-27 18:10:28 us=867904 Cannot load certificate "EnterSafe/PKCS\x2315/202618F100030022/IMMToken1\x20\x28User\x20PIN\x29/78a63f42e74bd19070e1c3ef3629acde7d2e767b" using PKCS#11 interface
2016-10-27 18:10:28 us=868109 MANAGEMENT: Client disconnected
2016-10-27 18:10:28 us=868236 Error: private key password verification failed
2016-10-27 18:10:28 us=868386 Exiting due to fatal error
...
Offensichtlich kann openvpn das Zertificat nicht laden, obwohl auf dem Token alles richtig erscheint. Ein pkcs15 --dump listet Folgendes:
$ pkcs15-tool --dump
Using reader with a card: Feitian ePass2003
PKCS#15 Card [IMMToken1]:
Version : 0
Serial number : 202618F100030022
Manufacturer ID: EnterSafe
Last update : 20161027152453Z
Flags : EID compliant
PIN [User PIN]
Object Flags : [0x3], private, modifiable
ID : 01
Flags : [0x32], local, initialized, needs-padding
Length : min_len:4, max_len:16, stored_len:16
Pad char : 0x00
Reference : 1 (0x01)
Type : ascii-numeric
Path : 3f005015
Private RSA Key [Certificate]
Object Flags : [0x3], private, modifiable
Usage : [0x4], sign
Access Flags : [0xD], sensitive, alwaysSensitive, neverExtract
ModLength : 2048
Key ref : 0 (0x0)
Native : yes
Path : 3f0050152900
Auth ID : 01
ID : 78a63f42e74bd19070e1c3ef3629acde7d2e767b
MD:guid : ac758693-43e0-84f0-d00a-e6c1c7b73be8
Public RSA Key [Public Key]
Object Flags : [0x2], modifiable
Usage : [0x40], verify
Access Flags : [0x0]
ModLength : 2048
Key ref : 0 (0x0)
Native : no
Path : 3f0050153000
ID : 78a63f42e74bd19070e1c3ef3629acde7d2e767b
X.509 Certificate [Certificate]
Object Flags : [0x2], modifiable
Authority : no
Path : 3f0050153100
ID : 78a63f42e74bd19070e1c3ef3629acde7d2e767b
Encoded serial : 02 01 22
MacPeter:Token1_test peterdombrowski$
Ein Verbindungstest mit den einzelnen Datein, wie im blog beschrieben funktioniert. By the way: Da habe ich mich gefragt, wo die Datei "ca /etc/openvpn/certs/foobar-ca.cert" herkommt, da habe ich dann die mit openssl erstellte root.pem verwendet und dann hat das funktioniert.
Ich habe soviel bisher probiert, dass ich mittlerweile ein bisschen ratlos bin. Vielleicht kann mir jemand helfen, der es geschafft hat einen Feitian ePass2003 korrekt zu bespielen und mit openvpn zu nutzen.
meine openvpn conf:
client
dev tun
proto udp
remote xxx.xxx.xxx.xxx 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
ca /Users/peterdombrowski/Documents/_VPN/Token1_test/IMM_VPN_CL_Token1_root.pem
pkcs11-providers /Library/OpenSC/lib/opensc-pkcs11.so
pkcs11-id 'EnterSafe/PKCS\x2315/202618F100030022/IMMToken1\x20\x28User\x20PIN\x29/78a63f42e74bd19070e1c3ef3629acde7d2e767b'
comp-lzo
verb 9
mute 20
inactive 14400
Ich bin für jede Hilfe dankbar!
emails gerne an: peter.dombrowski@mail.de
Viele Grüße
Peter Dombrowski
Fordert dich der OpenVPN daemon zur Eingabe des Passphrase auf ?
AntwortenLöschenFür mich sieht es so aus, als wenn das Passwort falsch eingeben worden ist oder der OpenVPN einfach irgendein Passwort angegeben hat.
Verwendest du eine Tunnelsoftware wie Viscosity ?
VG
Schwarmi
Hallo Schwarmi,
AntwortenLöschendas ist genau der Punkt. Ich verwende Tunnelblick als App für den Mac um mich anzumelden. Wenn ich auf "Verbinden" klicke erscheint folgendes Fenster "client Token1: Bitte Token mitgeben. Bitte stecken Sie das Token "Please insert IMMToken1 (User PIN)" an und klicken Sie "OK"". Wenn ich dann bei angestecktem Token auf die Schaltfläche "OK" klicke, erscheint immer wieder das gleiche oben beschriebene Fenster. Eigentlich würde ich erwarten, dass nach den dem Klicken von "OK" ein Fenster zur Abfrage der Passphrase erscheint. Tut es aber nicht! Nur durch Anklicken der Schaltfläche "Abbrechen" komme ich aus der Schleife wieder heraus. Daraufhin erscheint ein Fenster mit folgendem Inhalt: "client Token1: Authentifizierung gescheitert. Die Passphrase wurde nicht akzeptiert." zwei Schaltflächen stehen mir dann zur Verfügung: "Abbrechen" und " Erneut versuchen". Wenn ich "Erneut versuchen" klicke erscheint wieder das erste Fenster wie oben beschrieben, wenn ich "Abbrechen" klicke, wird der Verbindungsaufbau getrennt mit dem Hinweis, dass die Passphrase nicht akzeptiert wurde. Ich habe aber nirgendwo die Gelegenheit die Passphrase wirklich einzugeben. Vielleicht liegt das Problem an Tunnelblick. Ich werde Viscosity in den nächsten Tagen mal testen.
Vielen Dank für den Hinweis.
Beste Grüße
Peter