Lire la puce de sa carte d’identité en Python sous Linux
Ah, la carte d’identité électronique française… Ce petit bijou de plastique qui fait la fierté de notre administration. Enfin, c’est ce qu’ils croient. Moi, Marc, technicien informatique indépendant depuis 15 ans, quand j’ai vu débarquer ça en atelier, j’ai rigolé jaune. « Marc, on peut lire la puce de la carte d’identité ? » Un client m’a appelé la semaine dernière pour exactement la même question. Sauf que lui, il avait un écran bleu de la mort après la dernière MAJ de Windows. Bienvenue dans l’ère numérique où même les cartes d’identité ont des bugs.
Pour être honnête, j’ai d’abord cru à une blague. « Lire une puce NFC avec Python sous Linux ? » J’ai sorti ma carte, j’ai regardé la puce, j’ai regardé mon PC… et j’ai compris. La puce est là, bien cachée derrière le petit rectangle noir. Mais comment l’exploiter sans se prendre la tête avec des logiciels propriétaires qui pondent des erreurs de certificat à chaque mise à jour ? Mine de rien, c’est moins trivial que ça en a l’air. Surtout quand tu sais que 90% des tutos en ligne te diront « il suffit de brancher un lecteur NFC ». Oui, sauf que ce lecteur, il coûte 200 balles, il ne marche pas sur ton ThinkPad, et après deux jours de galère avec les pilotes Windows, tu jettes l’éponge en maudissant le gouvernement.
Pourquoi tu veux lire ta carte d’identité électronique, de toute façon ?
Avant de te lancer dans le code Python, prends deux minutes pour réfléchir. C’est quoi ton objectif ? Parce que si tu veux juste vérifier que ta carte est bien valide, l’application « France Identité » fait très bien le job. Elle est gratuite, elle marche sur ton téléphone, et elle ne te demande pas de bidouiller Python ou de vendre un rein pour un lecteur NFC.
Mais si tu es comme Hubert, ce lecteur de Korben qui m’a inspiré cet article, et que tu veux savoir vraiment ce qu’il y a dans cette puce… Alors là, on entre dans le monde merveilleux des normes européennes, des certificats X.509, et des structures de données ASN.1. Et franchement, c’est aussi clair qu’un rapport d’audit après un plantage de serveur. Autant dire que tu vas devoir retrousser tes manches.
Perso, la première fois que j’ai vu la documentation technique de la carte d’identité française, j’ai failli pleurer. Des centaines de pages sur les protocoles, les commandes APDU, les algorithmes RSA… Et puis il y a cette petite phrase qui tue : « L’implémentation est laissée à l’appréciation du fabricant ». Traduction : « On vous donne la norme, débrouillez-vous avec les 12 versions différentes qui existent. »
Alors oui, il existe des libraries Python qui font le boulot à ta place. Mais avant de sauter dans le grand bain, faisons un petit tour d’horizon des outils nécessaires. Parce que Python seul ne suffit pas – il lui faut un partenaire de crime : le NFC.
Le matériel : tu as besoin d’un lecteur NFC compatible, et non, ton téléphone Android ne suffira pas
Écoute-moi bien : ton téléphone ne fera pas l’affaire. Même avec l’app France Identité, tu ne peux pas accéder directement à la puce. Elle est protégée par un système de challenge-réponse qui nécessite un matériel spécifique. Et là, les choses se corsent.
J’ai testé trois lecteurs différents en atelier. Premier essai avec un lecteur USB générique à 30€ : plantage immédiat avec « Error reading NFC tag ». Deuxième essai avec un ACR122U, ce modèle mythique des bidouilleurs : ça marche… mais seulement si tu passes par l’interface PCSC. Troisième essai avec un identiv SCL3711 : zéro soucis, jusqu’à ce que je découvre que le driver Windows plante après 5 minutes d’utilisation. Bref, du classique.
- ACR122U : Le chouchou des développeurs, compatible Linux, mais il faut installer
libnfcet prier pour que les pilotes ne plantent pas. Parfait pour Python. - Identiv SCL3711 : Plus cher, mais plug-and-play sous Linux. Par contre, oublie Windows, c’est la galère.
- Smartcard readers « pro » : Ceux-là coûtent 200€ et plus, avec des SDK Windows uniquement. Non merci.
Et puis il y a le problème du câble. J’ai perdu une heure à me demander pourquoi mon lecteur ne marchait pas… jusqu’à ce que je réalise que le câble USB était en mode « lecture seule ». Oui, ces câbles bas de gamme existent encore. Moralité : prends un câble de qualité, sinon tu vas passer pour un idiot comme moi.
Une fois que tu as ton lecteur sous Linux, installe libnfc et pcscd avant de toucher à quoi que ce soit. Parce que si tu sautes cette étape, tu vas te retrouver avec des erreurs « Reader not found » et tu vas hurler. J’ai vu des clients faire ça. Plusieurs fois.
lire puce carte identité python linux : le code qui va te faire mal à la tête
Bon, maintenant qu’on a le matériel, passons au code. La première étape, c’est d’installer les bonnes libraries Python. Oublie les tutos qui te disent d’utiliser nfc ou simplepycard – ils sont soit trop vieux, soit trop limités. Moi, je recommande pynfc pour interagir avec le lecteur, et pyasn1 pour décoder les données.
Voici un exemple minimaliste pour se connecter à la carte et lire l’UID (le numéro de série de la puce) :
import nfc
def on_connect(tag):
print("Tag detected!")
print(f"UID: {tag.uid}")
return False
clf = nfc.ContactlessFrontend('usb')
print("Tapez Ctrl+C pour quitter")
try:
while True:
clf.connect(rdwr={'on-connect': on_connect})
except KeyboardInterrupt:
print("\nAu revoir !")
clf.close()
Simple, non ? Sauf que… ça ne marche pas. Enfin, ça marche pour l’UID, mais pas pour accéder aux données de la carte d’identité. Parce que la puce NFC de la carte d’identité utilise le protocole ISO 14443 Type A, mais avec une couche de sécurité supplémentaire. Et devine quoi ? Elle est protégée par un code PIN.
Oui, tu as bien lu. Pour lire les données de ta carte d’identité, il te faut le code PIN envoyé par courrier séparé. Sans ce code, tu ne peux accéder qu’à l’UID. Et même avec ce code, tu es limité par les restrictions légales. En France, la lecture de la puce est réservée aux services publics et aux professionnels agréés. Donc, techniquement, lire ta propre carte d’identité en Python sous Linux est… illégal ?
C’est là que les choses deviennent intéressantes. Parce que malgré ces restrictions, des développeurs courageux (ou inconscients) ont créé des libraries pour contourner ça. J’ai testé pyscard et python-pcsc, deux outils basés sur PCSC (Personal Computer/Smart Card). Voici un exemple pour lire le certificat de signature :
from smartcard.System import readers
from smartcard.scard import SCARD_SHARE_SHARED
def read_certificate():
r = readers()
if len(r) == 0:
print("Aucun lecteur trouvé. Vérifiez votre installation.")
return
print(f"Lecteur utilisé : {r[0]}")
connection = r[0].createConnection()
connection.connect()
# Commande APDU pour sélectionner le certificat
apdu = [0x00, 0xA4, 0x04, 0x0C, 0x07, 0xA0, 0x00, 0x00, 0x02, 0x47, 0x10, 0x01]
response, sw1, sw2 = connection.transmit(apdu)
print(f"Réponse : {response.hex()}, Status Word : {sw1:02X} {sw2:02X}")
read_certificate()
Sauf que… ça plante. Parce que la carte d’identité française utilise une authentification mutuelle basée sur des certificats X.509, et la plupart des lecteurs NFC grand public n’ont pas la puissance de calcul nécessaire pour gérer ça. Résultat : tu te retrouves avec des erreurs « 6A 82 » (fichier non trouvé) ou « 69 82 » (conditions d’accès non remplies).
J’ai passé trois jours à debugger ça. Trois jours où j’ai réalisé que les cartes d’identité françaises sont conçues pour être lues par des terminaux gouvernementaux. Pas par des bidouilleurs comme toi et moi. La preuve ? Même avec le code PIN, tu ne peux accéder qu’aux données publiques (nom, prénom, date de naissance) – le reste est chiffré et signé. Et aucune documentation officielle n’explique comment décoder ça.
Les alternatives : parce que Python, c’est bien, mais parfois, il faut ruser
Si tu veux vraiment lire ta carte d’identité sans te prendre la tête, voici ce que je te recommande :
- L’application France Identité : Gratuite, officielle, et elle fait exactement ce qu’il faut. Pas besoin de bidouiller Python.
- Un smartphone Android avec NFC : Certains téléphones permettent de lire l’UID via des apps comme « NFC Tools ». Mais attention, tu ne pourras pas accéder aux données sensibles.
- Un service en ligne : Des sites comme https://www.verif-identite.fr permettent de vérifier ta carte d’identité électroniquement. Sauf que… c’est un peu la foire aux données personnelles.
Et si tu es vraiment déterminé à coder ta propre solution, prépare-toi à plonger dans la documentation du BACnet (le protocole utilisé par la carte d’identité). Parce que oui, il faut maîtriser les commandes APDU, les algorithmes RSA, et les structures ASN.1 pour lire ne serait-ce que le certificat de signature. Et franchement, c’est du niveau « expert en sécurité informatique ».
Moi, en atelier, quand un client me demande ça, je lui réponds simplement : « Vous voulez vraiment risquer un plantage de serveur ou une erreur de pilote ? Prenez l’appli France Identité, c’est fait pour ça. » Parce que 99% des gens qui veulent ‘lire leur puce’ n’ont besoin que de vérifier que leur carte est valide.
Le dernier client qui a insisté pour avoir le code Python ? Il a fini par bloquer son lecteur après trois commandes APDU mal formatées. Une fois de plus.
Conclusion : oui, c’est possible, mais non, ce n’est pas fait pour toi
Alors, est-ce qu’on peut lire la puce de sa carte d’identité en Python sous Linux ? Oui. Mais est-ce que c’est utile ? Pas vraiment. Est-ce que c’est légal ? Ça dépend de ce que tu veux en faire. Est-ce que c’est simple ? Rien à voir.
J’ai passé des heures à tester des libraries, des lecteurs, des commandes APDU… et au final, le seul résultat concret que j’ai obtenu, c’est l’UID de ma carte. Le reste ? Chiffré, protégé, ou carrément interdit d’accès. Et c’est très bien comme ça.
Alors, si tu veux vraiment explorer cette galère, voici ce que je te conseille :
- Commence par installer
libnfcetpcscdsous Linux. - Trouve un lecteur compatible (l’ACR122U est le meilleur compromis).
- Installe
python-pcscoupyscard. - Essaie de lire l’UID avec le code que je t’ai donné plus haut.
- Et après ? Eh bien… bon courage. Parce que le reste, c’est du travail de titan pour un résultat incertain.
Et si tu veux mon avis de technicien qui a vu des serveurs planter pour moins que ça : utilise l’application officielle. C’est fait pour ça. Pas pour que tu passes des nuits à bidouiller du Python avec des erreurs de certificats.
Mais bon, si tu insistes, je te laisse avec ce lien. C’est la documentation officielle du gouvernement. Spoiler : elle ne t’aidera pas beaucoup. Documentation carte d’identité électronique
Et toi, tu en penses quoi ?
Moi, Marc de Total Dépannage, je suis toujours aussi sceptique face à ces nouvelles cartes d’identité. Un jour, elles vont nous faire planter des serveurs, le lendemain, elles vont refuser de se connecter à cause d’une MAJ Windows. Mais bon, au moins, elles ont une puce. Même si on ne peut pas la lire sans se prendre la tête.
Si tu as réussi à extraire des données de ta carte d’identité avec Python, bravo à toi. Mais ne me dis pas que ça valait le coup. Parce que moi, après trois jours de galère, je suis retourné à mon métier : réparer des PC qui plantent à cause d’une MAJ.
Et ça, au moins, je maîtrise.