Federazione CIE errore sub

Buongiorno,
sto sviluppando con la libreria GitHub - italia/spid-cie-oidc-java: The SPID/CIE OIDC Federation Relying Party, written in Java · GitHub l’accesso CIE per la mia azienda.

Sto tentando di creare una componente tecnica per la federazione CIE con queste caratteristiche

  • OIDC
  • pre-produzione

ma non riesco ad inserire una “Chiave pubblica di federazione” che vada bene e ricevo sempre l’errore:

La validazione non è andata a buon fine per i seguenti motivi:

[sub] Elemento mancante

Verifica la sintassi e inseriscilo di nuovo.

Ho alcuni dubbi:
a fronte di un file generato dalla libreeia spid-cie-oidc-java in questo modo

{
“sub”: “https://mio-url-dev”,
“metadata”: {
“federation_entity”: {
“contacts”: [
]
},
“openid_relying_party”: {
“client_registration_types”: [
“automatic”
],
“jwks”: {
“keys”: [
{
“kty”: “RSA”,
“e”: “AQAB”,
“alg”: “RS256”,
“use”: “sig”,
“n”: “:bbbbb…”,
“kid”: “xxxxx”
},
{
“kty”: “RSA”,
“e”: “AQAB”,
“alg”: “RSA-OAEP-256”,
“use”: “enc”,
“n”: “aaaa…”,
“kid”: “yyyy”
}
]
},
“grant_types”: [
“refresh_token”,
“authorization_code”
],
“application_type”: “web”,
“redirect_uris”: [
“https://mio-url-dev/CIECallbackAction.action”
],
“client_name”: “MioNome”,
“client_id”: “https://mio-url-dev”,
“contacts”: [
],
“response_types”: [
“code”
]
}
},
“jwks”: {
“keys”: [
{
“kty”: “RSA”,
“e”: “AQAB”,
“alg”: “RS256”,
“use”: “sig”,
“n”: “cccc…”,
“kid”: “zzzzz”
}
]
},
“iss”: “https://mio-url-dev”,
“authority_hints”: [
“https://preprod.oidc.registry.servizicie.interno.gov.it”
],
“exp”: 1790345252,
“iat”: 1790343452
}

cosa devo inserire nel campo “Chiave pubblica di federazione” ? Tutto il json o solo una parte?

Inoltre, la stringa incollata nella pagina di onboarding deve essere in chiaro o no?

infine l’indirizzi del client_id è un webserver presente sul mio PC di sviluppo, non raggiungibile dall’esterno: può essere questo il problema?

Grazie.

A prescindere da qualsiasi altro contenuto o errore: l’istanza deve essere raggiungibile dal portale, che all’atto della registrazione tenta di accedere al tuo file /.well-known/openid-federation per validarlo.

Grazie per il chiarimento,
il mio problema comunque persiste anche dopo aver fatto un test con un client_id pubblico accessibile dall’esterno.

Qualcuno ha avuto il mio stesso problema ed è riuscito a risolverlo?

Grazie

Ciao, abbiamo federato un RP CIE OIDC e verificato il formato sul portale.

  1. Cosa incollare in “Chiave pubblica di federazione”
    Non va incollata tutta l’Entity Configuration, ma un JWKS con la sola chiave di federazione (il jwks di primo livello, quello che firma l’Entity Configuration, non openid_relying_party.jwks). Il testo va in chiaro, JSON puro, senza base64 e non come JWT, e con la sola parte pubblica:

{
“keys”: [
{
“kty”: “RSA”,
“kid”: “…”,
“e”: “AQAB”,
“n”: “…”
}
]
}

alg e use non servono. Il kid deve coincidere con quello nell’header del JWT servito su n. Probabilmente [sub] Elemento mancante compare quando il validatore non riconosce la
{
“kty”: “RSA”,
“kid”: “…”,
“e”: “AQAB”,
“n”: “…”
}
]
}

alg e use non servono. Il kid deve coincidere con quello nell’header del JWT servito su /.well-known/openid-federation. Probabilmente [sub] Elemento mancante compare quando il validatore non riconosce la struttura, per esempio se si incolla l’intero documento o una chiave singola senza l’array keys.

  1. Altri punti da controllare
  • Cifratura: il portale accetta RSA-OAEP + A256CBC-HS512. A noi RSA-OAEP-256 è stato rifiutato.
  • contacts: in federation_entity non può essere vuoto e deve contenere la PEC dell’ente/impresa
  • authority_hints: deve essere il Trust Anchor dell’ambiente scelto, non l’OP. Conviene verificare l’URL di preproduzione nella documentazione del portale.
  • Entity ID: deve coincidere esattamente con iss/sub. L’URL <entity_id>/.well-known/openid-federation deve essere raggiungibile pubblicamente in HTTPS e restituire il JWT firmato (application/entity-statement+jwt).
  1. Riferimento
    Il nostro proxy è open source (EUPL-1.2): GitHub - Provincia-di-Pescara/pa-sso-proxy: SPID/CIE SSO proxy per Pubblica Amministrazione — SATOSA-based, multi-client OIDC, WebUI di configurazione · GitHub
    È pensato per la Pubblica Amministrazione: per SPID non è adatto a un’impresa, perché il metadata SAML e il certificato sono generati con il profilo da SP pubblico (IPACode, spid:Public, PA:IT-). Puoi però consultare il sorgente come esempio per la parte CIE OIDC Federation, che non ha vincoli specifici della PA:
  • config-api/app/satosa_config_generator.py: metadata federation_entity e openid_relying_party;
  • config-api/app/jwk_generator.py: chiavi federation/sig/enc e formato da incollare nel portale;
  • satosa/plugins/cieoidc-backend/: backend RP CIE OIDC (Entity Configuration, trust chain, callback).

Buongiorno,
finalmente sono riuscito a eseguire l’onboarding per la federazione CIE come Relying Party e sviluppando in Java con la libreria GitHub - italia/spid-cie-oidc-java: The SPID/CIE OIDC Federation Relying Party, written in Java · GitHub .

Premessa:
ho incontrato tre grossi problemi riguardanti tutta la gestione del progetto da parte del team di sviluppo:

  • l’assistenza ufficiale CIE contattata attraverso cie.enti@interno.it non mi è stata di aiuto, ho sempre ricevuto risposte frettolose, parziali, poco chiare e assolutamente non risolutive.
  • la pagina di onboarding gestisce in maniera terribile gli errori riguardanti l’inserimento dei dati, in particolare nell’inserimento della Chiave pubblica di federazione: vengono restituiti pochi errori generici che non aiutano assolutamente a capire cosa non va nelle stringhe inserite (i fantomatici “[sub] Elemento mancante” e “L’entità non rispetta i requisiti di federazione”).
    In pratica dà errore [sub] Elemento mancante sia se la Chiave pubblica di federazione non è corretta, sia se l’EC servito alla pagina .well-known/openid-federation non è accessibile o non è corretto, anche se in realtà l’elemento sub è presente.
  • La documentazione sull’onboarding è inesistente:
    • per l’inserimento della Chiave pubblica di federazione, non è chiaro cosa vada inserito e non c’è un semplice esempio ufficiale, o se c’è non è facile da trovare, visto che nessuno me lo ha indicato: sarebbe molto semplice metterne un template nel pulsante informativo a fianco del campo da compilare
    • non viene detto da nessuna parte che durante l’onboarding l’EC deve essere accessibile su indirizzo pubblico https non in chiaro (ci si può arrivare, ma scriverlo esplicitamente cosa costa?)
  • non vengono indicati tool di validazione che in realtà esistono
  • non vengono indicate repository con progetti relativi a diversi ambienti di sviluppo (ci ho messo un bel po’ a trovare il progetto OIDC che utilizza java GitHub - italia/spid-cie-oidc-java: The SPID/CIE OIDC Federation Relying Party, written in Java · GitHub)

Mi spiace farlo presente qui ma se qualche responsabile del progetto legge questo post deve essere a conoscenza di queste problematiche che rallentano enormente lo sviluppo dei progetti.

Vi riassumo come ho risolto le varie problematiche.

OnBoarding

  • Identificativo componente:
    • deve essere un indirizzo pubblico in HTTPS , accessibile durante il processo di onboarding;
    • deve servire l’Entity Configuration con questi requistiti al path */.well-known/openid-federation
      • è un jwt firmato con la chiave privata di federazione

      • il Content-Type deve essere application/entity-statement+jwt

      • Il corpo è un’unica stringa nel formato header.payload.firma, con le tre parti in base64url.

      • ecco un esempio in chiaro (non so se sono proprio tutti i campi obbligatori, ma così è valido)

        {
        "iss": ``https://mioSito``,
        "sub": ``https://mioSito``,
        "iat": 1790930143,
        "exp": 1790928343,
        "authority_hints": [
        "``https://oidc.registry.servizicie.interno.gov.it``" (per produzione)
        ],
        "jwks": {
        "keys": [
        {
        "kty": "RSA",
        "use": "sig",
        "alg": "RS256",
        "kid": "<KID_CHIAVE_FEDERAZIONE>",
        "e": "AQAB",
        "n": "<MODULO_RSA_CHIAVE_FEDERAZIONE>"
        }
        ]
        },
        "metadata": {
        "federation_entity": {
        "organization_name": "<NOME_ORGANIZZAZIONE>",
        "homepage_uri": ``https://mioSito/paginalogin``,
        "policy_uri": ``https://mioSito/paginalogin.html``,
        "logo_uri": ``https://mioSito/logo.svg``,
        "federation_resolve_endpoint": ``https://mioSito/oidc/resolve``,
        "contacts": [
        miaazienda@pec.it
        ]
        },
        "openid_relying_party": {
        "client_id": ``https://mioSito``,
        "client_name": MiaApp,
        "organization_name": "Mia Azienda Spa",
        "application_type": "web",
        "client_registration_types": [
        "automatic"
        ],
        "redirect_uris": [
        https://mioSito/Callback.action
        ],
        "response_types": [
        "code"
        ],
        "grant_types": [
        "authorization_code",
        "refresh_token"
        ],
        "token_endpoint_auth_method": "private_key_jwt",
        "id_token_signed_response_alg": "RS256",
        "userinfo_signed_response_alg": "RS256",
        "userinfo_encrypted_response_alg": "RSA-OAEP",
        "userinfo_encrypted_response_enc": "A128CBC-HS512",
        "contacts": ,
        "jwks": {
        "keys": [
        {
        "kty": "RSA",
        "use": "sig",
        "alg": "RS256",
        "kid": "<KID_CHIAVE_FIRMA_CORE>",
        "e": "AQAB",
        "n": "<MODULO_RSA_CHIAVE_FIRMA_CORE>"
        },
        {
        "kty": "RSA",
        "use": "enc",
        "alg": "RSA-OAEP-256",
        "kid": "<KID_CHIAVE_CIFRATURA_CORE>",
        "e": "AQAB",
        "n": "<MODULO_RSA_CHIAVE_CIFRATURA_CORE>"
        }
        ]
        }
        }
        }
        }

        • Particolarità:
          • il “jwks” di primo livello è la Chiave pubblica di federazione da inviare all’onboarding
          • il logo deve essere in svg
          • la mail deve essere una PEC
          • “federation_entity” e “openid_relying_party” devono avere i campi indicati
          • attenzione ai valori
            • "token_endpoint_auth_method": "private_key_jwt",
            • "id_token_signed_response_alg": "RS256",
            • "userinfo_signed_response_alg": "RS256",
            • "userinfo_encrypted_response_alg": "RSA-OAEP",
            • "userinfo_encrypted_response_enc": "A128CBC-HS512",
  • Chiave pubblica di federazione fatta esattamente così:*
    *
    {
    "keys": [
    {
    "kty": "RSA",
    "kid": "zm2Kky....",
    "e": "AQAB",
    "use": "sig",
    "alg": "RS256",
    "n": "7pKFhq6W9......"
    }
    ]
    }
    • meglio inserire una stringa unica senza spazi e a capo per evitare problemi (poi la pagina di onboarding la formatta in automatico)
    • se manca la parte iniziale { “keys”: [ { ]} si genera errore [sub] Elemento mancante
    • se manca anche solo un elemento non va bene, senza “alg” e “use” da errore “L’entità non rispetta i requisiti di federazione”

Validazione in DEV
Grazie a @dametto.luca ho scoperto il tool di validazione

che valida l’EC e ti fa capire gli errori e le parti mancanti (ad esempio il logo in svg)

In realtà anche questo tool ha un errore (io ho usato la versione v1.0.1) in quanto se manca il Trustmark (che non ci deve essere in fase di onboarding) la validazione va in errore:
ho risolto eseguendo la modifica indicata qui mig_validator.py in errore per mancanza trustmark · Issue #8 · stfbk/OIDC-SPID-CIE-Validator · GitHub

Non sono stati invece utili né il validatore online SPID OIDC CHECK RP che ad oggi non funziona,
né la sua versione locale con docker GitHub - italia/spid-saml-check: Tool di verifica implementazione SPID SAML · GitHub (sono riuscito a farlo funzionare ma non mi ha risolto i problemi sull’EC)

Se avete bisogno di altre info (anche sul codice sviluppato in Java) chiedete pure, intanto mi avventuro nello sviluppo dell’AuthenticationRequest.