Smartcard/Crypto-USB-Stick (optional)

Einführung:
Auf Smartcards und Crypto-USB-Sticks lassen sich Zertifikate und geheime Schlüssel sicher verwahren.
Es gibt verschiedene Anwendungen für den Einsatz von Smartcards, so können sie auch zur Authentifizierung an einem VPN Gateway dienen. Mit der aktuellen strongSwan Version 4.5.1 werden Smartcards und crypto-sticks auf Basis von PKCS#11 in IKEv2 unterstützt.

Dieses howto beschreibt die Einrichtung des Mobilen Pool VPN Zugang unter Linux. Dabei erfolgt die zertifikatsbasierte Anmeldung mit Hilfe einer Smartcard oder eines Crypto-USB-Stick.  

Voraussetzung:
Da in den aktuellen Distributionen die aktuelle strongSwan Version noch nicht zur Verfügung steht, muss die aktuelle strongSwan Version 4.5.1 aus den Quellen kompiliert werden. Die Anleitung hierfür wurde dem strongSwan wiki entnommen und beschreibt die Installation des strongSwan NetworkManager Plugins für Ubuntu 10.10.

Hardware:

Benötigt wird eine Smartcardleser + Smartcard oder ein Crypto-USB-Stick der von OpenSC unterstützt wird.
Jede Smartcard/LeseriKombination bzw USB-Crypto-Token der von OpenSC unterstützt wird, sollte theoretisch funktionieren.

Folgende Hardware haben wir erfolgreich getestet:
CryptoToken:
 
Feitian ePass PKI Token
  Aladdin eToken pro

SmartCard:
  Feitian PKI card (FTCOS / PK-01C)

 

Software:
Getestet und erstellt unter Ubuntu 10.10.
OpenSC Pakete, pcsclite Bibiliotheken, strongSwan 4.5.1, NetworkManager-strongSwan

Vorgehensweise:
1.) Crypto-USB-Stick vorbereiten
2.) strongSwan NetworkManager plugin installieren
3.) VPN-Verbindung konfigurieren

Anleitung:

Diese Anleitung ist teilweise aus folgenden howtos entnommen:
  strongSwan smartcard howto
  gooze Smartcard howto

1.) SmartCard / Crypto-USB-Stick installieren:


Für den PKCS11 suppport werden folgende Pakete benötigt:
apt-get install pcsc-tools libccid opensc


Karten-Treiber Konfiguration:

/etc/opensc/opensc.conf

...
  reader_drivers = pcsc;
...


PCSC Daemon neu starten:
service pcscd restart

 
Überprüfen ob der Token erkannt wird:
opensc-tool -l
Nr.  Driver    Features    Name
0    pcsc      Feitian SCR301 01 00

Der "Feitian SCR301" USB-Token wurde erkannt und kann jetzt verwendet werden..

Folgende Zertifikate/Schlüssel werden auf dem Token gespeichert :
- Mobile Pool User Zertifikat und der zugehörige private Schlüssel
- CA Zertifikat

Dazu wir der Token nach dem PKCS#15 Standard formatiert und zur Speicherung von Zertifikaten und Schlüssel vorbereitet. Der PKCS#15 Standard beschreibt das Format wie Zertifikat und Schlüssel Objekte auf Smartcards gespeichert werden. Dieser Standard wird von den OpenSC Bibliotheks Funktionen vollständig unterstützt.

Zunächst wird auf der "Mobile Pool" Seite im Bereich "Zertifikats-Verwaltung" ein Benutzer Zertifikat erstellt und heruntergeladen. Die Datei ist im PKCS#12 Format, darin enthalten ist das Benutzer Zertifikat, der zugehörige private Schlüssel und das CA Zertifikat. Diese werden aus der .p12 Datei extrahiert:

# the users certificate
openssl pkcs12 -in cert.p12 -clcerts -nokeys -out cert.pem

# the certificate of the certificate authority which issued the certificate
openssl pkcs12 -in cert.p12 -cacerts -nokeys -out root.pem

# the users private key
openssl pkcs12 -in cert.p12 -nocerts -out key.pem

hier wird drei mal nach dem  Passwort gefragt:
1.) zum enstchlüsseln des privaten Schlüssels
2.) zum verschlüsseln des privaten Schlüssels der Datei key.pem
3.) zum verifizeren des gerade eingegebenen Passworts


Damit der private Schlüssel dem Zertifikat zugeordnet werden kann, wenn der USB-Crypto Token ausgelesen wird, wird der "subject key identfier" des Benutzerzertifikats ermittellt:
openssl x509 -in cert.pem -text

...

        X509v3 Subject Key Identifier:
                8F:1F:90:A1:90:E8:9F:EB:7B:14:4C:5A:90:0C:36:33:6B:8F:02:4E
...


Nachdem jetzt die Zertifikate/Schlüssel einzel vorliegen, wird der Crypto-USB-Stick vorbereitet:
Löschen des Crypto-USB-Sticks:
pkcs15-init -E --reader 0

Formatieren, gleichzeitig wird hier auch die PIN und PUK des Tokens und eine Bezeichung vergeben:

pkcs15-init --create-pkcs15 --profile pkcs15\+onepin --use-default-transport-key --pin 0000 --puk 111111 --label "MoPo SC"

Übertragen des privaten Schlüssels, mit Angabe des zuvor ermittelten "Subject Key Identifier":
pkcs15-init --auth-id 1 --id <key-id> --store-private-key key.pem

Übertragen des Benutzerzertifikats:
pkcs15-init --auth-id 1 --store-certificate cert.pem

Übertragen des CA Zertifikats:

pkcs15-init --auth-id 1 --store-certificate root.pem --authority

Mit folgendem Befehl lässt sich der Inhalt des Crypto Token auslesen:

pkcs15-tool --list-pins --list-keys --list-certificates


2.) strongSwan NetworkManager plugin installieren
strongSwan muss aus den aktuellen Quellen kompiliert werden:

Zum Bau von stronSwan werden folgende Pakete benötigt:
aptitude install libpam0q-dev network-manager-dev libnm-util-dev libnm-glib-dev libgnomeui-dev gnome-common


a.) # get the strongSwan tarball

wget http://download.strongswan.org/strongswan-4.5.1.tar.bz2
tar xjf strongswan-4.5.1.tar.bz2

b.) # build charon with OpenSSL/NM Plugin PKCS11 support


alternativ, findet sich eine Beschreibung zum Bau von debian Paketen >>coming soon<<
./configure --sysconfdir=/etc --prefix=/usr --libexecdir=/usr/lib \
  --disable-aes --disable-des --disable-md5 --disable-sha1 --disable-sha2 \
  --disable-fips-prf --disable-gmp --disable-stroke --disable-pluto --disable-tools \
  --disable-updown --enable-openssl --enable-nm --enable-agent \
  --enable-eap-gtc --enable-eap-md5 --enable-eap-mschapv2 --enable-pkcs11
make
make install


# get the NetworkManager strongsSwan plugin as a tarball
wget http://download.strongswan.org/NetworkManager/NetworkManager-strongswan-1.2.0.tar.bz2
tar xjf NetworkManager-strongswan-1.2.0.tar.bz2
cd NetworkManager-strongswan-1.2.0

# build the NetworkManager strongsSwan plugin 
./configure --sysconfdir=/etc --prefix=/usr --libexecdir=/usr/lib/ --with-charon=/usr/lib/ipsec/charon
make
make install


alternativ, finden sich debian Pakete für Ubuntu 10.10 >>coming soon<<

3.) Konfiguration

Angabe des PKCS#11 modules bzw Bibliothek über die der Crypto-USB-Stick zugreifbar ist.
Im Falle des Crypto-USB-Stick wird die "opensc-pkcs11.so" Bibliothek angegeben:
In der Datei /etc/strongswan.conf wir der Abschnitt libstrongswan um folgenden Eintrag erweitert:

/etc/strongswan.conf

...
libstrongswan {
  plugins {
    pkcs11 {
      modules {
        openSC {
          path = /usr/lib/opensc-pkcs11.so
        }
      }
    }
  }
}
...




Zum Schluss wird ein VPN-Verbindungs Beschreibung im NetworkManager erstellt:
siehe "StrongSwan NetworkManager GUI"

Bei der Client Authentisierung kann jetzt Smartcard ausgewählt werden.


Networkmangager plugin:

NetworkManager