eToken-Crypt

Submitted by admin on So, 11.12.2016 - 11:21

SafeNet eToken und OpenSSL

Neben dem eToken wird noch eine Software gebraucht. Unter http://www.etokenonlinux.org/et/FAQ
wird beschrieben, wie man da heran kommt. Wer nur ein HW Token bekommen hat,
kann dort für ca. 20,- € eine offizielle Lizenz kaufen.

Installation

Auf einem normalen Linux Client wird nicht alles aus dem Paket gebraucht. Damit kann man sich alles installieren, was man für pcks11 Anwendungen braucht (Beispiel für 64 Bit):

rpm2cpio SafenetAuthenticationClient-8.0.5-0.x86_64.rpm | cpio -ivd
cp -a SAC 8.0 Linux/x86_64/SAC_8_0_5_0_Linux_RPM_64/RPM/lib64 /usr/lib64
cd /usr/lib64 && ln -s libeToken.so.8.0 libeTPkcs11.so
ldconfig

Key erzeugen

War die Installation der eToken Software erfolgreich, kann man jetzt einen RSA Key auf dem eToken erstellen.

pkcs11-tool --module /usr/lib/libeTPkcs11.so -k --key-type rsa:2048 -l --id 45 --label 0001

OpenSSL

Ein auf dem Token gespeichertes Zertifikat kann mit den folgenden Skript extrahiert werden:

pkcs11-tool --module /usr/lib/libeTPkcs11.so --login --id 45 --read-object --type cert | openssl x509 -inform DER

Wer sich die ganze Tipperei bei OpenSSL sparen will, kann eine angepasste openssl.cnf benutzen:

openssl_conf = openssl_def
... # weitere globale Einstellungen

[openssl_def]
engines = engine_section

[engine_section]
pkcs11 = pkcs11_section

[ pkcs11_section ]
engine_id = pkcs11
dynamic_path = /usr/lib/ssl/engines/engine_pkcs11.so
MODULE_PATH = /usr/lib/libeTPkcs11.so
init = 0
... # Rest der openssl.cnf

Wie man sehen kann, wird die eToken Library im MODULE_PATH eingebunden.

Verschlüsseln

Zunächst muss aus dem erstellten Zertifikat der Public Key extrahiert werden:

openssl x509 -inform pem -in cert.pem -pubkey -noout > public.pem

Es wird ein beliebiges File erstellt, es muss kleiner als 226 Byte sein. Dieses wird jetzt mit dem eben ausgepackten Public Key verschlüsselt:

openssl rsautl -encrypt -inkey public.pem -pubin -in test.txt -out test.ssl

Entschlüsseln

Dazu wird wieder openssl ohne Parameter gestartet.

engine dynamic -pre SO_PATH:/usr/lib/engines/engine_pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:/usr/lib/libeTPkcs11.so
rsautl -decrypt -engine pkcs11 -inkey slot_0-id45 -keyform engine -in test.ssl -out test.txt2
exit

Die libeTPkcs11.so ist manchmal recht zickig, falls ein Fehler auftritt, einfach mal nachsehen, ob das eToken noch aktiv ist:

pkcs11-tool --module /usr/lib64/libeTPkcs11.so -L

sollte dann so etwas wie

Available slots:
Slot 0 (0x0): Aladdin eToken PRO USB 72K Java [Main Interface] 00 00
 token label:   usb-0001
 token manuf:   SafeNet Inc.
 token model:   eToken
 token flags:   rng, login required, PIN initialized, token initialized, other flags=0x200
 serial num  :  ********
Slot 1 (0x1): 
  (empty)
...

zurück liefern. Ggf. Token rausziehen und wieder rein stecken, das hilft eigentlich immer.

Nützliche Skripte

PEM in DER umwandeln

openssl x509 -in usb-0002.crt -out usb-0002.der -outform DER

Zertifikat auf eToken übertragen

pkcs11-tool --module /usr/lib64/libeTPkcs11.so -l --type cert -w usb-0001.der --id 45 --label usb-0001

Zertifikat Request erstellen

Mit diesem Skript kann man sich unter Verwendung der openssl.cnf ein Certificate Signing Reqest erstellen. Dieser muss von einer CA signiert werden.

#!/bin/sh

subject='/CN=My eToken/O=Internet Widgits Pty Ltd/OU=Property Master/C=DE'
key_id=45
openssl req -config ./openssl.cnf \
-engine pkcs11 -new -key slot_0-id_${key_id} -keyform engine \
-subj "${subject}" \
-out ${filename}.csr

Anwendungen

Die eTokens lassen sich damit grundsätzlich für alle PKCS11 Anwendungen benutzen. Auf die Nutzung mit pam_pkcs11 sollte man lieber verzichten, denn beim nächsten Update der Distribution kann es passieren, dass die libeTPkcs11.so irgendwelche Libs nicht mehr findet und dann kann sich niemand mehr am Linux PC anmelden.