Signature électronique qualifiée (eIDAS / RGS) sous Linux avec une carte Certigna
Les marchés publics dématérialisés exigent une signature électronique qualifiée (règlement eIDAS, arrêté du 22 mars 2019). Les autorités de certification ne documentent que Windows. Voici la chaîne complète, testée, pour signer sous Linux avec un certificat Certigna sur carte à puce — y compris le piège qui fait perdre une journée.
1. Les composants
- Carte : IDEMIA IAS-ECC (réf. 9-250-99), délivrée avec le certificat qualifié.
- Lecteur : token USB type Gemalto Shell Token V2, lu par le pilote CCID standard (
pcscd). - Middleware : Idopte SCMiddleware, module PKCS#11
/usr/lib/SCMiddleware/libidop11.so. - Outil de signature : JSignPdf 2.3.0 (Java).
- Base système :
pcscd,libccid,pcsc-tools,opensc,default-jre.
2. Installation
Paquets de base :
sudo apt install pcscd libccid pcsc-tools opensc default-jre
Middleware Idopte — téléchargeable librement (paquet distribué par ChamberSign) :
curl -sSLO https://support.chambersign.fr/6.23.44.0-scmiddleware-user_idopte_6.23.44.0_ubun22_amd64.deb
sudo apt install ./6.23.44.0-scmiddleware-user_idopte_6.23.44.0_ubun22_amd64.deb
JSignPdf 2.3.0 : décompresser l'archive (sourceforge.net/projects/jsignpdf) dans /opt/jsignpdf-2.3.0/.
Si vous signez sans session graphique active, autorisez l'accès au lecteur via une règle polkit dans /etc/polkit-1/rules.d/50-pcscd.rules (remplacez VOTRE_USER) :
polkit.addRule(function(action, subject) {
if ((action.id == "org.debian.pcsc-lite.access_pcsc" ||
action.id == "org.debian.pcsc-lite.access_card") &&
subject.user == "VOTRE_USER") {
return polkit.Result.YES;
}
});
3. Le piège qui fait perdre une journée : OpenSSL 3.4
Au premier appel du module, Java (ou pkcs11-tool) plante avec :
OPENSSL_3.4.0 not found
libidop11.so est lié à OpenSSL 3.4, alors qu'Ubuntu 24.04 fournit OpenSSL 3.0. La bonne version est embarquée dans le paquet Idopte lui-même : il suffit de la mettre en tête du chemin de recherche des bibliothèques avant tout appel PKCS#11.
LD_LIBRARY_PATH=/usr/lib/SCMiddleware avant chaque commande qui charge le module. Sans ça, rien ne fonctionne — et c'est introuvable dans la doc officielle.4. Vérifier que la carte est vue
sudo env LD_LIBRARY_PATH=/usr/lib/SCMiddleware \
pkcs11-tool --module /usr/lib/SCMiddleware/libidop11.so -T
Doit lister les tokens IDEMIA. Un test à PIN vide atteint l'étape d'authentification sans consommer d'essai.
5. Déclarer le fournisseur PKCS#11 à Java
Deux petits fichiers. jsignpdf-idopte.cfg (déclare le module) :
name = IdopteQSCD
library = /usr/lib/SCMiddleware/libidop11.so
slotListIndex = 0
Et idopte-java.security, qui enregistre le provider SunPKCS11 en pointant vers le fichier ci-dessus (chemin absolu obligatoire) :
security.provider.13=SunPKCS11 /home/VOTRE_USER/jsignpdf-idopte.cfg
6. Signer (le bon réglage)
Script signer.sh — SHA-256 et horodatage qualifié en dur :
#!/bin/bash
PDF="$1"
export LD_LIBRARY_PATH=/usr/lib/SCMiddleware
read -s -p "PIN de signature (4 chiffres) : " PIN; echo
java -Djava.security.properties="$HOME/idopte-java.security" \
-jar /opt/jsignpdf-2.3.0/JSignPdf.jar \
-kst PKCS11 -ksp "$PIN" \
-ha SHA256 -ts http://time.certum.pl -tsh SHA256 \
-d "$(dirname "$PDF")" "$PDF"
Résultat : monfichier_signed.pdf, signature PAdES adbe.pkcs7.detached, SHA-256, horodatée.
7. L'horodatage qualifié, gratuit
La TSA Certum (http://time.certum.pl) est qualifiée eIDAS et gratuite. Vous obtenez un jeton d'horodatage RFC 3161 conforme sans payer de service dédié.
8. Vérifier la signature
pdfsig monfichier_signed.pdf
Doit afficher Signing Hash Algorithm: SHA-256 et Signature Validation: Signature is Valid.
Certificate issuer is unknown apparaît simplement parce que l'autorité Certigna n'est pas dans le magasin local de l'outil. Elle ne traduit aucun défaut de la signature.9. PIN : ne pas confondre
Le PIN de signature est le code à 4 chiffres (slot 0, User PIN). Le code reçu par SMS (avec des lettres) n'est qu'un code à usage unique pour s'identifier sur le portail de l'AC, qui affiche ensuite le vrai PIN. Le slot QSCD à 6 chiffres n'est pas utilisé ici : la clé de signature est sur le slot 0.
LD_LIBRARY_PATH vers la bonne OpenSSL.Guide rédigé d'après une mise en œuvre réelle sur Ubuntu 24.04. Les versions de paquets évoluent ; adaptez les numéros. Questions : olivier@quadrifoglio.ai.