Von CardContact gibt es eine Smartcard mit dem Namen Smardcard-HSM, die einige bemerkenswerte Eigenschaften hat. Da wären:
Bei den ersten Tests hat sich gezeigt, dass die Karte, wenn man sie erst einmal zum Laufen bekommen hat, sehr zuverlässig funktioniert.
Ein Zertifikat bekommt man nur mit der Middleware von CardContact auf die Karte, was aber nicht wirklich ein Problem darstellt,
da Open-Source. Die Performance der Karte ist als gut zu bezeichnen, Wartezeiten bei Zugriffen, wie man sie von älteren Smartcards
kennt, gibt es nicht.
Weniger schön sind jedoch die Anforderungen an den Kartenleser, was jedoch eher den Leser Herstellern zuzurechnen ist.
Die Karte verlangt vom Leser, dass dieser extended APDUs unterstützt. So ganz neu ist das Feature nicht, es wird aber von vielen Herstellern immer noch ignoriert.
Die einzigen Kartenleser, der mit der Smardcard-HSM zuverlässig funktionieren, sind bisher der Reiner-SCT und der ACR1281 von Advanced Card Systems.
Bei dem Reiner SCT RFID Comfort funktioniert das Pinpad im kontaktlosen Mode nicht.
Zunächst muss die Karte initialisiert werden.
PIN=123456
SO_PIN=0123456789ABCDEF
sc-hsm-tool --initialize --so-pin ${SO_PIN} --pin ${PIN}
Die Smartcard HSM ist eines der wenigen Produkte, die Schlüssel auf der Basis elliptischer Kurven unterstützt, also gleich einmal testen:
# Die folgenden Key Types werden von SmartCard HSM unterstützt:
KEY_TYPE="prime256v1"
KEY_ID=$(dd if=/dev/urandom bs=1 count=20 status=none | xxd -ps)
pkcs11-tool --module /usr/lib64/pkcs11/opensc-pkcs11.so --login --pin ${PIN} --keypairgen --key-type EC:${KEY_TYPE} --id ${KEY_ID}
Keypair ist schön und gut, aber wir brauchen auch noch ein Zertifikat
openssl req -engine pkcs11 -keyform engine -key ${KEY_ID} -new -text -out hsm-0001.csr -passin pass:${PIN} -subj "/O=example.com/CN=hsm-0001"
hat man das Zertifkat von der PKI im Base64 Format erhalten, dann muss es zunächst mit
openssl x509 -in hsm-0001.crt -out hsm-0001.crt.der -outform der
in das DER Format umgewandelt werden. Danach wird es mit
pkcs11-tool --module /usr/lib64/pkcs11/opensc-pkcs11.so --login --pin ${PIN} --write-object hsm-0001.crt.der --type cert --id ${KEY_ID}
in die Smartcard HSM importiert.
Oder man erstellt ein selbstsigniertes Zertifikat:
openssl req -x509 -engine pkcs11 -keyform engine -key ${KEY_ID} -new -text -out hsm-0001.crt -passin pass:${PIN} -subj "/O=example.com/CN=hsm-0001"
openssl x509 -in hsm-0001.crt -out hsm-0001.crt.der -outform der
pkcs11-tool --module /usr/lib64/pkcs11/opensc-pkcs11.so --login --pin ${PIN} --write-object hsm-0001.crt.der --type cert --id ${KEY_ID}
Am besten macht man das alles mit einem Skript
#!/usr/bin/env bash
PIN=12345678
SO_PIN=0123456789ABCDEF
KEY_TYPE="prime256v1"
CRT_FILE="hsm-0001.crt.$$"
KEY_ID=$(dd if=/dev/urandom bs=1 count=20 status=none | xxd -ps)
PKCS11_MOD="/usr/lib64/pkcs11/opensc-pkcs11.so"
sc-hsm-tool --initialize --so-pin ${SO_PIN} --pin ${PIN} --pin-retry 10 --label 'Demo Card' || exit 1
pkcs11-tool --module ${PKCS11_MOD} --login --pin ${PIN} --keypairgen --key-type EC:${KEY_TYPE} --id ${KEY_ID} || exit 2
openssl req -x509 -engine pkcs11 -keyform engine -key ${KEY_ID} -new -text -out ${CRT_FILE} -passin pass:${PIN} -subj "/O=example.com/CN=hsm-0001" || exit 3
openssl x509 -in ${CRT_FILE} -out ${CRT_FILE}.der -outform der || exit 4
pkcs11-tool --module ${PKCS11_MOD} --login --pin ${PIN} --write-object ${CRT_FILE}.der --type cert --id ${KEY_ID} || exit 5
rm -f ${CRT_FILE} ${CRT_FILE}.der
pkcs15-tool --read-certificate ${KEY_ID} | openssl x509 -text
have fun...
Bei der SmartCard HSM wird bei RSA > 1024Bit ein Smartcardreader mit extended APDU Unterstützung benötigt.
Da elliptische Kurven mit vergleichsweise kleineren Schlüssellängen auskommen, sind diese eine gute
Wahl für diese Smartcards, wenn noch veraltete Smartcard Reader verwendet werden.
Die Smartcard-HSM hat noch eine ganz interessante Funktion, mit der Karten mit gleichen Keys erstellte werden können. Zunächst werden Key Container erzeugt:
sc-hsm-tool --create-dkek-share dkek-share.1.pbe
Nun werden die Key Container importiert, das muss für jede Karte, die eine Kopie des Schlüsselmaterials erhalten soll, gemacht werden:
sc-hsm-tool --initialize --so-pin ${SO_PIN} --pin ${PIN} --dkek-shares 1
sc-hsm-tool --import-dkek-share dkek-share.1.pbe
Jetzt wird das Schlüsselmaterial auf der ersten Karte erzeugt:
pkcs11-tool --module /usr/lib64/pkcs11/opensc-pkcs11.so -l --pin ${PIN} --keypairgen --key-type rsa:2048 --id ${KEY_ID}
Bei aktuellen Smartcard HSM Versionen (getestet ab 3.4) können auch 4096 Bit RSA Keys verwendet werden.
Der Export erfolgt mit:
pkcs15-tool -D
sc-hsm-tool --wrap-key wrap-key.1.bin --key-reference 1 --pin ${PIN}
Der Import auf den anderen Karten erfolgt mit:
sc-hsm-tool --unwrap-key wrap-key.1.bin --key-reference 1 --pin ${PIN}
Als Key Referenz muss der Wert aus
Private RSA Key [Private Key]
Object Flags : [0x03], private, modifiable
Usage : [0x0E], decrypt, sign, signRecover
Access Flags : [0x1D], sensitive, alwaysSensitive, neverExtract, local
Algo_refs : 0
ModLength : 2048
Key ref : 1 (0x01)
Native : yes
Auth ID : 01
ID : 10
MD:guid : 34d1aa52-5b68-dcad-7ba2-10278d1187b4
angegeben werden.
Die Karten bieten in den neueren Firmware Versionen (V3.x) die Möglichkeit eines Updates. Erste Anlaufstelle ist CardContact PKI as a Service. Die Dokumentation dieses Services ist leider nicht so gut wie das Produkt Smartcard-HSM. Zunächst sollte das Tool ocf-cc.jar heruntergeladen und manuell gestartet werden. Ein sehr beliebter Fehler liegt darin, dass das Tool keinen Kartenleser findet. Mit
java -Dsun.security.smartcardio.library=/usr/lib64/libpcsclite.so.1 -jar ocf-cc.jar -r "ACS ACR1281 1S Dual Reader 00 00" -v
kann man dem Tool auf die Sprünge helfen, so dass es den Kartenleser findet. Danach klappt es auch mit dem Update. Auf der o.g. Seite muss man sich mit seiner E-Mail Adresse registrieren.
Das gehört jetzt zu den weniger schönen Seiten von Smartcard HSM. Zunächst wird die Smartcard Shell benötigt, die unter OpenSCDP zu bekommen ist (Open Source). Nach der Installation kann das Tool mit ./CardContact/scsh3/scsh3gui aufgerufen werden. Unter Files -> Keymanager wird das für den Import benötigte Script aufgerufen.
Zunächst erfolgt mit einem Rechtsklick auf "Userpin not verified..." ein Login, an dieser Stelle wird die bereits vergebene PIN verwendet.
Mit einem Rechtsklick auf "Smartcard-HSM..." wird zunächst ein Keypair erzeugt, dieses wird für den Import benötigt. Jetzt kann der Import mit Rechtsklick auf "Smartcard-HSM..." -> "Import PKCS#12" begonnen werden. Es wird zunächst nach der dkek-share Datei gefragt, danach kann man eines oder mehrere PKCS#12 Dateien importieren, zumindest so lange der Speicherplatz der Smartcard-HSM reicht.
Sofern es keine Fehler gab, kann die Smatcard-HSM mit den importierten Zertifikaten benutzt werden.