Aller au contenu

fetch_certificate

fetch_certificate récupère l’URL du certificat eIDAS Certigna pour une contribution IP Secure scellée. Introduit en v1.4.2 (#415) pour combler un trou : Jinnove / Certigna génère le certificat eIDAS de manière asynchrone, donc le champ ipsecure_certificate_url retourné par seal_* est presque toujours null immédiatement.

Cet outil est idempotent et NULL-guardé côté ledger — vous pouvez le rappeler en boucle sans risque.

Deux formes acceptées (au moins l’une doit être fournie) :

ledger_id number

Forme préférée. ID de l’entrée du ledger pour laquelle récupérer le certificat. Le tool résout automatiquement ipsecure_project_id et ipsecure_contribution_id depuis le ledger row.

{ "ledger_id": 42 }
ipsecure_project_id string

ID du projet IP Secure (forme directe, requise quand ledger_id est omis).

{ "ipsecure_project_id": "abc123", "contribution_id": "mwMWTpjmu3" }
contribution_id string

ID de la contribution IP Secure (forme directe, requise quand ledger_id est omis).

StatusSignification
readyURL fraîchement récupérée chez Jinnove et persistée dans le ledger.
already_persistedL’URL était déjà stockée dans le ledger — aucun appel API effectué.
pendingJinnove n’a pas encore généré le certificat. Réessayer dans quelques minutes.
not_configuredIP Secure n’est pas configuré, OU le ledger row n’a pas de ipsecure_contribution_id (seal local uniquement).
{
"status": "ready",
"ledger_id": 42,
"contribution_id": "mwMWTpjmu3",
"certificate_url": "https://certigna.fr/cert/abc-123.pdf",
"hint": "Certificate fetched and persisted."
}
  1. Sceller la preuve

    Scelle le fichier rapport.pdf pour mon projet — asset_types ["programme_rnd"]

    Sortie typique :

    {
    "ipsecure_contribution_id": "mwMWTpjmu3",
    "ipsecure_certificate_url": null, // ← async, normal
    "fingerprint": "476b712a..."
    }
  2. Attendre 1 à 5 minutes (le temps que Certigna génère le certificat)

  3. Récupérer le certificat

    Récupère le certificat pour l'entrée 42
    fetch_certificate({ "ledger_id": 42 })
  4. Si status: "pending", réessayer

    Pas d’erreur — c’est le comportement attendu. Patience.

  • L’écriture dans le ledger utilise updateLedgerIpSecureCertificate() qui est NULL-guardé : si une URL existe déjà (race condition), elle n’est pas écrasée.
  • L’appel à Jinnove passe par IpSecureClient.getCertificate() qui utilise le rate-limiter.ts + circuit-breaker.ts standard du projet — donc résilient aux pannes Jinnove (3-state circuit : closed → open → half_open).
  • L’outil est sans effet de bord destructif : il ne supprime jamais, n’overrride jamais. Vous pouvez l’appeler en boucle.