Cuándo inicia sesión Odoo
Odoo se autentica en dos momentos: cuando guardas el certificado KSeF con su clave privada en los ajustes y en la acción planificada «Refresh KSeF tokens», que repite el inicio de sesión completo cada 6 días. El contexto es el NIP de la empresa, así que el NIF de la empresa tiene que empezar por PL. El desafío (challenge) de KSeF vale 10 minutos.

POST /auth/xades-signature.Los códigos y sus textos
| Código | Texto de KSeF |
|---|---|
| 9101 | «Nieprawidłowy dokument.» (documento no válido) |
| 9102 | «Brak podpisu.» (falta la firma) |
| 9103 | «Przekroczona liczba dozwolonych podpisów.» (demasiadas firmas) |
| 9105 | «Nieprawidłowy podpis.» (firma no válida) |
| 21111 | «Nieprawidłowe wyzwanie autoryzacyjne.» (desafío de autorización no válido) |
| 21115 | «Nieprawidłowy certyfikat.» (certificado no válido) |
| 21117 | «Nieprawidłowy identyfikator podmiotu dla wskazanego typu kontekstu.» (identificador no válido para ese tipo de contexto) |
| 21217 | «Nieprawidłowe kodowanie znaków.» (codificación de caracteres no válida) |
| 21401 | «Dokument nie jest zgodny ze schemą (xsd).» Aquí se trata del XML de inicio de sesión, no de la factura. |
| 21406 | «Konflikt podpisu i typu uwierzytelnienia.» (conflicto entre la firma y el tipo de autenticación) |
| 460 | «Uwierzytelnianie zakończone niepowodzeniem z powodu błędu certyfikatu», con details: «Nieważny certyfikat», «Błąd weryfikacji łańcucha certyfikatów», «Niezaufany łańcuch certyfikatów», «Certyfikat odwołany», «Certyfikat zawieszony» o «Niepoprawny certyfikat» (caducado, error de cadena, cadena no fiable, revocado, suspendido, incorrecto). |
Los diez primeros llegan al momento, como respuesta HTTP 400 a la firma. El estado 460 llega después, al consultar el estado del inicio de sesión. Ojo con la propia especificación: los ejemplos de esa consulta dan para los mismos motivos el código 400 con la descripción «Uwierzytelnianie zakończone niepowodzeniem», mientras su tabla de estados da 460. Importa más el texto de details que el número.
Lo que Odoo no enseña
Si la firma falla, Odoo escribe «Failed to authenticate with XAdES:» seguido del texto de la excepción de la librería requests, del tipo «400 Client Error: Bad Request for url: …/auth/xades-signature». El código de la tabla no llega a la pantalla: Odoo solo toma el cuerpo de la respuesta cuando el objeto respuesta es «verdadero», y en requests una respuesta con código de 400 a 599 es falsa. Pasa lo mismo al pedir el desafío, al consultar el estado y al canjear los tokens.
Con el estado 460, Odoo escribe «KSeF Authentication failed with status 460: …» con la descripción y sin los details (en polaco en la 18 y la 19: «Uwierzytelnianie KSeF nie powiodło się z kodem błędu 460: …»).
Si la renovación de cada 6 días falla, solo deja rastro en el log del servidor. El token de refresco de KSeF dura hasta 7 días; después, el envío acaba con «Failed to refresh KSeF access token. You may need to re-authenticate manually.».
La lista de credenciales de nuestro módulo

Poland KSeF 2.0 Validator tiene en KSeF › Configuration › Credentials una lista de certificados KSeF, tokens, sellos y firmas cualificadas con los días que les quedan: en naranja con 30 días o menos y en rojo ya caducados. La fecha de caducidad la escribe quien da de alta la entrada. El módulo no lee el certificado de los ajustes de Odoo ni su estado en KSeF, así que no marcará un certificado revocado o suspendido.
Qué hacer
- Comprueba en los ajustes que el registro elegido es un certificado KSeF con su clave privada.
- Revisa las fechas de validez y si el certificado está revocado o suspendido en KSeF.
- Comprueba que el NIF de la empresa empieza por PL y es el NIP para el que se emitió el certificado.
- Vuelve a guardar el certificado en los ajustes. Si el error vuelve y en Odoo solo ves «400 Client Error», pide que lean la respuesta de KSeF con su código.
Sigue leyendo
Comprobado en el código del módulo (versión 20.0) y en las fuentes enlazadas
Fuentes
- Código del módulo: flexigo_poland_ksef_2_0_e_invoice_connector_and_migrati 20.0 (ba7c60f1): i18n/pl.po
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/open-api.json
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/uwierzytelnianie.
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/mode
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/l10n_pl_edi/tool
- github.com/odoo/odoo/blob/4d2d4b5895db70596863df941d9a1f0beeb117f8/addons/l10n_pl_edi/tool
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/tool
- github.com/psf/requests/blob/v2.32.5/src/requests/models.py#L730
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/tool
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/l10n_pl_edi/i18n
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/mode
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/data
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/uwierzytelnianie.
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/tool
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/mode
- Código del módulo: flexigo_poland_ksef_2_0_e_invoice_connector_and_migrati 20.0 (ba7c60f1): views/ksef_credential_views.xml
- Código del módulo: flexigo_poland_ksef_2_0_e_invoice_connector_and_migrati 20.0 (ba7c60f1): models/ksef_credential.py
