Guide technique · libre

Signature électronique qualifiée (eIDAS / RGS) sous Linux avec une carte Certigna

Signer un PDF en PAdES qualifié, accepté sur PLACE, sous Ubuntu — sans Windows et sans service payant. · Juin 2026

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

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.

La solution : exporter 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.

Attention : 3 PIN erronés bloquent la carte (déblocage par PUK / procédure de l'AC). En cas de doute sur le code, ne tentez pas à l'aveugle.

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.

Le second piège : n'utilisez pas l'interface graphique de JSignPdf pour un marché. En mode GUI, l'outil retombe en SHA-1 sans horodatage (les réglages ne sont pas appliqués) — signature non conforme. Toujours la ligne de commande.

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.

Normal : la ligne 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.

Bilan. Carte Certigna + Idopte + JSignPdf + TSA Certum = signature qualifiée PAdES, conforme à l'arrêté du 22 mars 2019 et acceptée sur PLACE, entièrement sous Linux et sans licence payante. Le seul obstacle réel est le 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.