Krajowy system e-Faktur

MS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Cześć,

W nawiązaniu do mojego wczorajszego posta dotyczącego problemów z integracją interaktywną FA(3) w środowisku ksef-test – dzięki @Dzyszla przeszedłem krok dalej ......... Ale niestety kolejny problem z tokenem:

Poniżej aktualny stan:

ETAP 1 – /auth/challenge
Działa poprawnie (200 OK).

ETAP 2 – szyfrowanie tokenu
Szyfrowanie RSA-OAEP-SHA256 jest poprawne – zaszyfrowany token przyjęty przez usługę (brak błędów w KROKU 3).

        using RSA rsa = LoadRsaPublicKey(PEM_FILE);

        string toEncrypt = $"{TOKEN_KSEF}|{timestampMs}";
        byte[] tokenBytes = Encoding.UTF8.GetBytes(toEncrypt);

        string encryptedToken = Convert.ToBase64String(
            rsa.Encrypt(tokenBytes, RSAEncryptionPadding.OaepSHA256)
        );

ETAP 3 – /auth/ksef-token
Odpowiedź jest 202 Accepted.
Zwracany jest referenceNumber oraz JWT (authenticationToken), który wygląda poprawnie.

ETAP 4 – polling /auth/{referenceNumber}
I tutaj pojawia się problem — wcześniej dostawałem 401 Unauthorized, ale obecnie wykonałem testy ponownie i teraz polling zwraca:

status 450
"Uwierzytelnianie zakończone niepowodzeniem z powodu błędnego tokenu"
details: "Invalid token encryption"
Czyli nie problem z nagłówkiem — ale z samym tokenem wejściowym (tym, który szyfruję w KROKU 2).

Dodatkowo końcowe wywołanie:
GET /auth/ksef-token/{referenceNumber}

zwraca:
HTTP 404 NotFound (puste body) i kończy się błędem parsera JSON po stronie aplikacji.
Token, którego obecnie używam, został wygenerowany w środowisku testowym, w sekcji:

Tokeny → Generuj token z zaznaczeniem wszystkich możliwych uprawnień.
Przykładowa wartość tokenu:
20251117-EC-385DF35000-17B4EC52F8-00|nip-5840251149|faa04d9658aa413a81340b0a7063e968a027abb59644433c871df8f7c14533d6

Pytanie kluczowe:
Czy tego typu token nadaje się do wykorzystania jako TOKEN_Z_DOSTĘPU w /auth/ksef-token?
Czy endpoint Token Authentication wymaga innego typu tokenu ? Al podpowiada mi, że w moim panelu testowym aplikacji MF powinna być zakładka „Dostęp zewnętrzny” i tak niby się taki token generuje, ale nie mam takiej zakładki.

Z góry dziękuje za pomoc
Michał

tmg
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
0

Co to są "strony w UPO" (array of "pages") które zwraca funkcja statusu sesji? Z API wynika że każda strona ma swój numer referencyjny .. WTF?

Dzyszla
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 184
0

Macie jakieś przemyślenia co do formatu klucza zwracanego ze strony WWW?
Są problemy, żeby go wczytać w SBB :/ W ogóle nie rozpoznaje formatu. AI niby twierdzi, że przestarzały i nie obsługiwany, ale jakoś dziwne mi się to wydaje.

GS
  • Rejestracja: dni
  • Ostatnio: dni
0

Co się dzieje z sesją , w ramach której wysłano jakieś faktury, oraz z fakturami w sesji, jeśli sesja nie została zamknięta przez użytkownika ?

V2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 28
0

Szukam dobrej nazwy w programie dla tego obiektu, który jest autoryzowany, a potem przechowuje tokeny dostępu i odświeżający, i w ramach którego tworzone są sesje interaktywne, wsadowe, wykonywane inne operacje. Macie jakieś propozycje? Na razie przychodzi mi do głowy "Channel", "Thread", "Handle" i "Context" (to ostatnie ma chyba jednak w KSeF węższe znaczenie). W KSeF 1.0 miałem po prostu "Session", ale w KSeF 2.0 sesja raczej jest już tylko częścią czegoś większego.

SM
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Panowie i Panie, jak sobie radzicie z autoryzacją przez podpis xades z użyciem certyfikatu i klucza prywatnego KSEF wygenerowanego na stronie WWW? Ktoś sobie poradził z tematem w języku C# .net framework?

Próbuje utworzyć xml podpisany podpisem elektronicznym xades z wykorzystaniem certyfikatu i klucza prywatnego KSEF i mam problemy
Poniżej kod pisany w języku C# .net framework 4.8 powstały na podstawie dll-ki dostarczonej przez KSEF napisanej w języku C# .net core 8, co bym nie wymyślił dostaje błąd "System.Security.Cryptography.CryptographicException: 'Failed to create signing key.'"

Kopiuj
            X509Certificate2 certificate = createX509Certificate2(); // tworzenie obiektu klasy X509Certificate2 na podstawie pliku certyfikatu wygenerownego przez KSEF

            string signatureId = "Signature";
            string signedPropertiesId = "SignedProperties";
            string signedPropertiesType = "http://uri.etsi.org/01903#SignedProperties";

            string xadesPrefix = "xades";
            string xadesNsUrl = "http://uri.etsi.org/01903/v1.3.2#";

            DateTime signingTime = DateTime.UtcNow.AddMinutes(-1);

            string certificateDigest = Convert.ToBase64String(certificate.GetCertHash(HashAlgorithmName.SHA256));
            string certificateIssuerName = certificate.Issuer;
            string certificateSerialNumber = new BigInteger(certificate.GetSerialNumber()).ToString();

            string unsignedXml = ""; // xml który będzie podpisywany - docelowo request na endpoint https://ksef-test.mf.gov.pl/api/v2/auth/xades-signature

            byte[] unsignedXmlBytes = Encoding.UTF8.GetBytes(unsignedXml);

            Stream stream = new MemoryStream(unsignedXmlBytes);

            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.PreserveWhitespace = true;
            xmlDocument.Load(stream);

            if (xmlDocument.DocumentElement == null)
            {
                throw new ArgumentException("The XML document has no root element", nameof(xmlDocument));
            }

            xmlDocument.DocumentElement.SetAttribute("xmlns", "http://ksef.mf.gov.pl/auth/token/2.0");

            NGLKSeFSignedXml signedXml = new NGLKSeFSignedXml(xmlDocument);

            string value = File.ReadAllText(@"Ścieżka do klucza prywatnego wygenerowanego w KSEF");

            // próba użycie dll Bouncy Castle, która ma za zadanie utworzyć obiekt klasy RSA z kluczem prywatnym KSEF (w .net framework 4.8 nie ma metody ImportRSAPrivateKey dlatego próba z Bouncy Castle)
            StringReader sr = new StringReader(value);
            string privateKeyPass = "Hasło klucza prywatnego wygenerowanego w KSEF";
            var pf = new NGLKSeFPasswordFinder(privateKeyPass);
            PemReader pr = new PemReader(sr, pf);

            var keyObject = pr.ReadObject();

            RSA rsa = RSA.Create();

            if (keyObject is AsymmetricCipherKeyPair keyPair)
            {
                rsa = DotNetUtilities.ToRSA((RsaPrivateCrtKeyParameters)keyPair.Private);

                certificate = certificate.CopyWithPrivateKey(rsa);  // dodanie do certyfikatu KSEF klucza prywatnego

                signedXml.SigningKey = certificate.GetRSAPrivateKey();
            }
            else if (keyObject is RsaPrivateCrtKeyParameters privateKeyParams)
            {
                rsa = DotNetUtilities.ToRSA(privateKeyParams);

                certificate = certificate.CopyWithPrivateKey(rsa); // dodanie do certyfikatu KSEF klucza prywatnego

                signedXml.SigningKey = certificate.GetRSAPrivateKey();
            }
            else if (keyObject is ECPrivateKeyParameters ecPrivateKeyParameters)
            {
                var q = ecPrivateKeyParameters.Parameters.G.Multiply(ecPrivateKeyParameters.D).Normalize();

                var ecParams = new ECParameters
                {
                    Curve = ECCurve.NamedCurves.nistP256, // adjust depending on curve
                    D = ecPrivateKeyParameters.D.ToByteArrayUnsigned(),
                    Q = new ECPoint
                    {
                        X = q.AffineXCoord.GetEncoded(),
                        Y = q.AffineYCoord.GetEncoded()
                    }
                };

                var ecdsa = ECDsa.Create(ecParams);

                certificate = certificate.CopyWithPrivateKey(ecdsa); // dodanie do certyfikatu KSEF klucza prywatnego

                signedXml.SigningKey = certificate.GetECDsaPrivateKey();
            }

            signedXml.Signature.Id = signatureId;

            // AddKeyInfo
            signedXml.KeyInfo = new KeyInfo();
            signedXml.KeyInfo.AddClause(new KeyInfoX509Data(certificate));

            // AddRootReference
            Reference rootReference = new Reference(string.Empty);
            rootReference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
            rootReference.AddTransform(new XmlDsigExcC14NTransform());
            signedXml.AddReference(rootReference);

            // AddSignedPropertiesIdReference
            Reference signedPropertiesIdReference = new Reference($"#{signedPropertiesId}");
            signedPropertiesIdReference.Type = signedPropertiesType;
            signedPropertiesIdReference.AddTransform(new XmlDsigExcC14NTransform());
            signedXml.AddReference(signedPropertiesIdReference);

            // AddDataObject
            DataObject dataObject = new DataObject();
            dataObject.Data = getDataObjectXmlNodeList(xadesPrefix, xadesNsUrl, signatureId, signedPropertiesId, signingTime, certificateDigest, certificateIssuerName, certificateSerialNumber);
            signedXml.AddDataObject(dataObject);

            signedXml.ComputeSignature(); // tu zwraca błąd
TA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Mam prośbę, może ktoś podać wartości jakie powinny być dołączone do encryptedToken z poniższych TimeStamp:
2025-11-18T14:32:25.4678898+00:00
2025-11-18T14:54:22.8148047+00:00
2025-11-18T14:58:03.3175404+00:00

ZB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Od paru godzinek dłubie przy linkach do QR kodów i efekt non stop ten sam:

Szczegóły walidacji
Certyfikat istnieje
Podpis wystawcy nie jest prawidłowy
Niewłaściwy typ certyfikatu, Wystawca użył certyfikatu do uwierzytelnienia

A certyfikat na pewno używam Offline, bo nawet tak go mam nazwanego i tak go z pliku wczytuje, widzę to oczami :-)
Gdzie mogę robić błąd? Czy ktoś to przebrnął i mu to działa?

Miang
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1787
1

słuchajcie , Wy to robicie w ramach jakiś firm? Bo normalnie mnie kusi żeby tym się też zająć , ale jakby mi ktoś za to zapłacił
Nie potrzebuje nikt kontaktora do rozkminianie KSef?
Mam doświadczenie z JPK i innymi pomysłami ministerstw odnośnie wymiany danych
Btw w aktualnym Najwyższym Czasie Jan Fijor, ten o pisał już o KSeF teraz napisał artykuł "JPK - bezprawie czy niewolnictwo?"

ZB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Pytanie o identyfikator kontekstu. Tam jest Nip i NipVatUe. Czy ten NipVatUe to jest po prostu nip z id kraju z przodu, czyli np. PLxxxxxxxxxx?
I czym jest InternalId?

M4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0

Mam pytanie do piszących w PHP do pobierania paczek z fakturami używacie httpclienta czy coś innego ?

RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 56
0

Hej, jakie macie podejście do środowiskowych certyfikatów (/api/v2/security/public-key-certificates). Ściągacie przy każdym starcie apki czy gdzieś kisicie po pobraniu?

Mateusz Jaracz
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Cześć mam pytanie, aktualnie mam zrobione uwierzytelnienie(xades oraz ksef_token) jednak widze jest zakladka certyfikaty. z tego co rozumiem mają one zastąpić kiedyś ksef_token, pytanie czy ktoś rozumie/ jest w stanie mi wytłumaczyć jak teraz używać tych certyfikatów? Nie do końca rozumiem ich aktualne przeznaczenie. Dzięki wielkie 😀

tmg
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
0

Czy ja dobrze rozumiem status sesji interaktywnej. 170 to zamknięta ale nie ma jeszcze upo (trwa przetwarzanie). Potem 170 zamienia się na 200 i jest upo do pobrania. Czy tak to wygląda?

V2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 28
0

Czy ktoś analizował jakie byłyby konsekwencje (wydajność, limity itp.) gdyby sesje interaktywne tworzyć i zamykać dla każdej jednej faktury wysyłanej w tym trybie? Na szybko widzę tylko taki minus, że byłoby osobne UPO dla każdej faktury, więc nie można by oszczędzić miejsca w bazie danych robiąc zbiorcze.

RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 56
1

Złośliwy komentarz do rzucenia przy kawie.
W "Pytania i odpowiedzi KSeF 2.0 - KSeF w praktyce – co zyskujesz?" czytamy:
"Stały dostęp do faktur przez 10 lat – bez konieczności ich przechowywania samodzielnie, faktury zawsze są po ręką."

Natomiast w "Limity Api - Rekomendowany sposób integracji w zakresie pobierania" jest:
"Operacje biznesowe - niezależnie od wybranej strategii, wszystkie działania użytkowników (wyszukiwanie, filtrowanie, raportowanie) powinny być realizowane na lokalnej bazie danych, zsynchronizowanej wcześniej z KSeF."

Znaczy... ja wiem o co chodzi, Wy wiecie o co chodzi ale no wiecie no ;)

JK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0

Pytanie laika z systemu c#. Przy uruchamianiu programu do obsługi KSEF definiuję środowisko (test, demo, prod)
// 0) DI i konfiguracja klienta
ServiceCollection services = new ServiceCollection();
services.AddKSeFClient(options =>
{
options.BaseUrl = KsefEnvironmentsUris.DEMO;
});
Czy mogę w programie zmienić środowisko, czy też muszę restartować program z innym BaseUrl.
Przykładowo po 1 lutego chciałbym odbierać faktury z środowiska PROD, ale wysyłać jeszcze testowe faktury na DEMO.

RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

Tak się zastanawiam jak to jest z tymi trybami online i offline.

  1. Po co są znaczniki offline w fakturach przyjętych przez KSeF oraz przy wysyłaniu batch, skoro i tak każda faktura która otrzymała nr staje się
    online i każda niewysłana (nie ważne z jakiego powodu) jest offline.
  2. Obowiązek dwóch kodów QR dla faktur offline, ten pierwszy z opisem offline przed wysłaniem zawsze będzie błędny więc po co on w zasadzie jest - jedynym wyjaśnieniem jest przypadek wysyłania faktur do klientów przed wysłaniem do KSEF, co jest swego rodzaju Pro Formą i czy to o to chodzi w idei KSeF offline.
TA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Fragment w Delphi 10.4:

Kopiuj
 RClient.BaseUrl := 'https://ksef-demo.mf.gov.pl/api/v2/';
 AuthStatusResource = 'auth/';

 RRequest.Params.clear;
 RRequest.Body.ClearBody;
 RRequest.Accept := 'application/json';
 RRequest.Resource := AuthStatusResource+ReferenceNumber; //referenceNumber z auth/ksef-token
 RRequest.Params.AddItem('Authorization', 'Bearer ' + AuthenticationToken, pkHTTPHEADER); //authenticationToken z auth/ksef-token

 RRequest.Method := rmGet;
 RRequest.Execute;

Ciągle zwraca 401.

Stefan Olszewski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Jako że jest to mój pierwszy post witam wszystkich bardzo serdecznie.
A teraz do sedna i pytania które mnie nurtują:

  1. czy szyfrowanie encryptedSymmetricKey używanego przy otwarciu sesji interaktywnej oraz Tokena KsEF pobranego w aplikacji MF i używanego do uwierzytelniania wykonuje się tą samą metoda tzn RSA_OAEP z SHA256
  2. W jakim formacie ma być encryptedSymmetricKey wysyłany do szyfrowania (ciąg bajtów, ciąg bajtów przekształcony do HEX, coś innego ) ?

Do zaszyfrowania używam openssl.

P2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Cześć, czy powie ktoś mi gdzie jest aplikacja testowa ? Tutaj : https://web2te-ksef.mf.gov.pl/ ? Zrobiłem sobie token i teraz nie wiem do którego API on jest. Gdy wysyłam zaszyfrowany token to dostaje cały czas błąd:

{"startDate":"2025-11-19T13:44:36.255762+00:00","authenticationMethod":"Token","status":{"code":450,"description":"Uwierzytelnianie zakończone niepowodzeniem z powodu błędnego tokenu","details":["Invalid token encryption."]}}

Nie wiem co to za błąd. Czy to problem z timestamp (tam 7 znaków), czy to problem z szyfrowaniem, czy to problem z tym że nie taki token, czy może klucz publiczny nie poprawny.

Ja mam taki klucz publiczny:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxsyeiYiWB2+KFxEpQGoN
Qa6W8Pc4kWGl8V+sBMdW3Fqh0lhKiqKfpH5RWLDmZ30EzkKJ5+IdaWYFoijhYxDB
IBhINVQKlBZvEVd6CfPJUJypa94eRO5cc6IPNI35aMhfKP/Kc4A/OiT2J4nyCz6B
V98xOXCAlyDPD73XM6O2ormL6gUb673zvjOIakf39tAPPVgWIDuX7GDZYGebN7LX
oGvjPo5YDqC2KN51ofLbO+n74iei5OaGN94Ap52vI7uzK2g/hQslOd0Avl2U1kwR
nnF0yzwbDzRrHqPCHUYxVp5nHdo+jHe1CNoa6gt0m6pn1StYcitSXKg2hTNjnes6
TQIDAQAB
-----END PUBLIC KEY-----

TH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
1

Zastanawiam się w kwestii faktur offline, bo nie do końca łapię idee, mam pewien scenariusz:

Jestem klientem sklepu i proszę o wystawienie faktury.
Sklep aktualnie ma awarię Internetu i decyduje się na wysłanie faktury w trybie offline.
Dostaję od sklepu wizualizacje faktury w formie papierowej/elektronicznej z nadrukowanymi dwoma kodami QR, 1 i 2.
Sklep na następny dzień chce przesłać tę fakturę do KSeF, ale otrzymuje status przesyłanego dokumentu XML z kodem > 200, np. z błędem semantycznym w pliku XML.
Ja dostałem formę papierową faktury z kodami QR, które nigdy nie będą poprawne i dana faktura nigdy nie pojawi się w systemie KSeF w takiej formie jaką docelowo miałem otrzymać.

Co w tej sytuacji ma zrobić wystawiający fakturę i co ma zrobić klient?

ME
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0

Mam juz napisaną integracje KSeF API v.1 i tutaj działa wszystko prawidłowo, została wczęsniej wdrozonaw kilku miejscach.
Teraz postanowiłem napisac integracje dla wersji API v.. Mam problem https://ksef-test.mf.gov.pl/api/v2/sessions/online - przesyłam dane i dostaje w zwrocie referenceNumber z tym ze jak sprawdzam status sesji to mam odpowiedz 451 | Błąd odszyfrowania dostarczonego klucza | Rozszyfrowania klucza symetrycznego zakończone błędem. Rozwiązanie jest tworzone w PHP może ma ktoś działające rozwiązanie do zaszyforowania tych dwóch wartości encryption { encryptedSymmetricKey, initializationVector } autoryzacje wykonuje tokenem ksef. Certyfikaty pobieram https://ksef-test.mf.gov.pl/api/v2/security/public-key-certificates

MG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 46
0

Czy ktoś może mi podrzucić linka do styl.xsl UPO, szukam i nie moge znależć gdzie to jest.

RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 56
0

Wieczorne przemyślenie #452. Większości pewnie nie dotyczy i nie jest jakieś uciążliwe. Jak już wejdą faktury RR to przy przyrostowym pobieraniu faktur dla Subject2 trzeba będzie wyfiltrować te których jesteśmy wystawcą, czyli chyba wszystkie o typie RR. Taka tam pierdoła ale może się przytrafić.

RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 56
0

Wiecie czy pobieranie ze storage (czyli pobieranie zipów przy exporcie paczek faktur albo pobieranie upo z downloadUrl statusu wysyłki) podpada pod domyślne limity? Niby piszą "Domyślne limity obowiązują dla wszystkich zasobów API" tylko nie wiem czy te url'e podpadają pod API :) Ktoś testował czy tam można 429 dostać?

tmg
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
0

Gdzie znajdę informacje jak przez API odbierać wystawione mi faktury? Patrzę w specyfikację ale wszystko dotyczy faktur które sam wystawiam.

Dzyszla
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 184
0

Ciekawe info myślę: apka www nie będzie pozwalała na przesyłanie/wystawianie faktur offline :) (źródło: https://github.com/CIRFMF/ksef-docs/issues/320#issuecomment-3554341979 )
No ciekawe, jakbyśmy tak wszyscy zrezygnowali z tego trybu w programach naszych też :)

GS
  • Rejestracja: dni
  • Ostatnio: dni
0

Ogarnąłem kody QR na środowisku testowym,
Ale mam problem z serwerem Demo. Wygenerowane linki nie działają.
Zastanawiam się, czy mam błąd u siebie w aplikacji, czy środowisko DEMO, póki co nie obsługuje kodów QR

GS
  • Rejestracja: dni
  • Ostatnio: dni
0

Tak OFFTopic. Po godzinie 21 wrzucam na forum post z problemem i niemal natychmiast (kilka minut) mam od pięciu osób pozytywną reakcję z chęcią udzielenia pomocy. Jesteśmy hobbystami "klepiącymi" wieczorami KSef, czy pracoholikami, a może jedno i drugie ? :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.