Menu

jeudi 7 mars 2013

Smart card PKCS#11


Introduction

Ce blog va expliquer comment accéder, générer des clés, utiliser les algorithmes cryptographiques (chiffrer / signer des données) contenus dans la carte en utilisant le standard de cryptographie à clé publique PKCS#11.
Nous allons utiliser une carte PKI, un lecteur de carte, d’autres utilitaires qui seront nécessaires pour le bon fonctionnement.

C'est quoi une carte cryptographique ?
Une carte cryptographique est une carte à puce contenant un microprocesseur à mémoire supportant les opérations cryptographiques (signature numérique, cryptage). Elles ont été conçues pour permettre un stockage sécurisé des clés privées et des certificats. Ces cartes peuvent exécuter des fonctions cryptographiques sur la carte à puce elle-même. Elles permettent donc de conserver et gérer des informations sensibles telles que :

- Les clés privées, 
- Les numéros de compte,
- Les mots de passe,
- 

PKCS#11 Définition: 
PKCS#11 aussi appelé Cryptoki, appartient à une famille de standard appelée standard cryptographique à clé publique (PKCS : Public-Key Cryptography Standard), publié par les laboratoires RSA. PKCS#11 définit une API multiplateforme pour discuter et interagir avec les jetons cryptographiques, tel que les module de sécurité matérielle (HSM : Hardware Security Module), ces derniers peuvent être sous plusieurs formes : cartes à puce, jetons USB, etc. Le but est d’accélérer les opérations cryptographiques et conserver les clés en toute sécurité.
PKCS#11 fournit une interface à un ou plusieurs dispositifs cryptographiques, qui seront actifs dans le système à travers un certain nombre de « slot ». Chaque « slot »  correspond à un lecteur physique (ex. Lecteur de carte).

PKCS#11 Module: 
Le module PKCS#11 est un programme qui est responsable de gérer les opérations cryptographique comme le chiffrement et le déchiffrement et utilisant le standard PKCS#11.


Outils 

Dans cette étape, je vais présenter de quelques outils open-source qui vont nous servir de manipuler et utiliser les données sur les cartes à puce avec le PKCS#11. 
Pour utiliser le PKCS#11, nous pouvons écrire notre propre wrapper java (enveloppeurs) qui utilise la JNI (Java Native Interface) ce qui permet au code java s’exécutant à l’intérieur de la JVM d’appeler et d’être appelé par des applications natives.

Pour la suite du travail, j’ai opté à utiliser le wrapper open source : « iaik PKCS#11 Wrappers ».
Ce que nous aurons besoin :

- Une carte à puce PKI,
- Un wrapper PKCS#11 pour java,
- Un module PKCS#11.

La première étape est de télécharger l’iaik PKCS#11 Wrappers, la bibliothèque est gratuite, mais il est nécessaire de procéder à un enregistrement. Après la décompression, nous aurons besoin du fichier de « iaikPkcs11Wrapper.jar » pour l’intégrer au projet java.

Nous aurons besoin aussi d’un module qui va nous fournir des informations sur les cartes connectées que nous pourrons y accéder.
Pour notre module, qui est normalement en « .dll » pour Windows et en « .so » pour linux, on doit installer « OpenSC » qui est un ensemble de librairies et de pilotes pour les cartes à puce. Il est conçu pour fonctionner avec les cartes supportant PKCS#11.
Pour la version de « OpenSC » choisie sous Windows 32/64 bit, il est recommandé d’installer la version 32 bits de ce logiciel, et ce pour des problèmes de compatibilité, mais aussi les pilotes intégrés dans « OpenSC » ne sont pas signés et peuvent ne pas fonctionner avec d’autres logiciels signés.
Après l’installation, on doit modifier la variable %PATH% pour inclure le répertoire de OpenSC, et aussi nous permettre d’exécuter nos commandes depuis le terminal.
 C:\Program Files (x86)\OpenSC Project\OpenSC\tools  


Partie 1 : OpenSC 


Quelques tests ont été effectués pour exploiter la carte et essayer d’utiliser les algorithmes implémentés.
Tout d’abord, on va essayer de lister les lecteurs de cartes disponibles :

 $ opensc-tool --list-readers  

On remarque qu’on a deux lecteurs, le premier avec une carte insérée le deuxième est vide. On vérifie après si une carte a été bien détectée. Chaque carte possède un ATR (Answer To Reset), sous forme d’une chaîne hexadécimale utilisée pour identifier le type de la carte. 

 $ opensc-tool --reader 0 --atr  

On vérifie aussi si la carte est bien reconnue par OpenSC :

 $ opensc-tool --reader 0 --name  


La carte a été bien reconnue, et donc on peut utiliser la commande « opensc-explorer » cette commande nous permet par exemple de supprimer/créer des fichiers EF (fichiers élémentaires) et DF (répertoire), de changer le code PIN, de lister tous les fichiers du répertoire courant.

 $ pkcs11-tool --module=c:\Windows\System32\opensc-pkcs11.dll -l -O  

L’option ‘-l’ permet d’interroger la carte pour la vérification du code PIN et se connecter à la carte et l’option ‘-O’ permet de lister les objets contenus dans la carte et afficher quelques informations.


Partie 2 : Java Class
(en cours)

Aucun commentaire:

Enregistrer un commentaire