Krajowy system e-Faktur

LI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Hej, czy Wam podczas robienia podpisu Xades również zwraca błąd "21406: Konflikt podpisu i typu uwierzytelnienia. - Konflikt podpisu i typu uwierzytelnienia."?
Używam tej biblioteczki ksefowej i tam tworzę według ich instruktarzu certyfikat dla organizacji bo taki mnie interesuje

Kopiuj
X509Certificate2 certificate = SelfSignedCertificateForSealBuilder
                .Create()
                .WithOrganizationName("Kowalskii sp.z o.o.")
                .WithOrganizationIdentifier("9320617184") //jakiś losowy nip
                .WithCommonName("Kowalskii")
                .Build();

a następnie tworzę na podstawie requestu

Kopiuj
var authTokenRequest = AuthTokenRequestBuilder
   .Create()
   .WithChallenge(challengeResponse.Challenge)
   .WithContext(ContextIdentifierType.Nip, "9320617184")
   .WithIdentifierType(SubjectIdentifierTypeEnum.CertificateSubject)
   .WithAuthorizationPolicy(null)
   .Build();

niepodpisany xml - i go podpisuję tym certyfikatem.

Kopiuj
string unsignedXml = AuthTokenRequestSerializer.SerializeToXmlString(authTokenRequest);
string signedXml = await signatureService.SignAsync(unsignedXml, certificate);

W rezultacie

Kopiuj
SignatureResponse authOperationInfo = await ksefClient.SubmitXadesAuthRequestAsync(signedXml, verifyCertificateChain: false); 

zwraca mi błąd przedstawiony powyżej. Czy w takim razie trzeba samemu wygenerować ten certyfikat i go podpisać?

EDIT: Teraz pojawia się kod błędu 415 podczas próby uzyskania statusu autoryzacji po poprawnym podpisie Xades..

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

Przy próbie pobrania statusu uwierzytelniania mam błąd 401 - Unauthorized.

Nie wiem czy dobrze podaję AuthenticationToken w kliencie Delphi

RESTRequest.Params.AddHeader('Authorization','Bearer ' + AuthToken) ;

SS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0

Udało się komuś wysłać poprawnie fakturę? Użyłem przykładu ze strony MF:

Kopiuj
<Faktura xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2022/01/05/eD/DefinicjeTypy/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://crd.gov.pl/wzor/2025/06/25/13775/">
	<Naglowek>
		<KodFormularza kodSystemowy="FA (3)" wersjaSchemy="1-0E">FA</KodFormularza>
		<WariantFormularza>3</WariantFormularza>
		<DataWytworzeniaFa>2026-02-01T00:00:00Z</DataWytworzeniaFa>
		<SystemInfo>SamploFaktur</SystemInfo>
	</Naglowek>
	<Podmiot1>
		<DaneIdentyfikacyjne>
			<NIP><tu_poprawny_nip></NIP>
			<Nazwa>ABC AGD sp. z o. o.</Nazwa>
		</DaneIdentyfikacyjne>
		<Adres>
			<KodKraju>PL</KodKraju>
			<AdresL1>ul. Kwiatowa 1 m. 2</AdresL1>
			<AdresL2>00-001 Warszawa</AdresL2>
		</Adres>
		<DaneKontaktowe>
			<Email>abc@abc.pl</Email>
			<Telefon>667444555</Telefon>
		</DaneKontaktowe>
	</Podmiot1>
	<Podmiot2>
		<DaneIdentyfikacyjne>
			<NIP>1111111111</NIP>
			<Nazwa>F.H.U. Jan Kowalski</Nazwa>
		</DaneIdentyfikacyjne>
		<Adres>
			<KodKraju>PL</KodKraju>
			<AdresL1>ul. Polna 1</AdresL1>
			<AdresL2>00-001 Warszawa</AdresL2>
		</Adres>
		<DaneKontaktowe>
			<Email>jan@kowalski.pl</Email>
			<Telefon>555777999</Telefon>
		</DaneKontaktowe>
		<NrKlienta>fdfd778343</NrKlienta>
		<JST>2</JST>
		<GV>2</GV>
	</Podmiot2>
	<Fa>
		<KodWaluty>PLN</KodWaluty>
		<P_1>2026-02-15</P_1>
		<P_1M>Warszawa</P_1M>
		<P_2>FV2026/02/150</P_2>
		<P_6>2026-01-27</P_6>
		<P_13_1>1666.66</P_13_1>
		<P_14_1>383.33</P_14_1>
		<P_13_3>0.95</P_13_3>
		<P_14_3>0.05</P_14_3>
		<P_15>2051</P_15>
		<Adnotacje>
			<P_16>2</P_16>
			<P_17>2</P_17>
			<P_18>2</P_18>
			<P_18A>2</P_18A>
			<Zwolnienie>
				<P_19N>1</P_19N>
			</Zwolnienie>
			<NoweSrodkiTransportu>
				<P_22N>1</P_22N>
			</NoweSrodkiTransportu>
			<P_23>2</P_23>
			<PMarzy>
				<P_PMarzyN>1</P_PMarzyN>
			</PMarzy>
		</Adnotacje>
		<RodzajFaktury>VAT</RodzajFaktury>
		<FP>1</FP>
		<DodatkowyOpis>
			<Klucz>preferowane godziny dowozu</Klucz>
			<Wartosc>dni robocze 17:00 - 20:00</Wartosc>
		</DodatkowyOpis>
		<FaWiersz>
			<NrWierszaFa>1</NrWierszaFa>
			<UU_ID>aaaa111133339990</UU_ID>
			<P_7>lodówka Zimnotech mk1</P_7>
			<P_8A>szt.</P_8A>
			<P_8B>1</P_8B>
			<P_9A>1626.01</P_9A>
			<P_11>1626.01</P_11>
			<P_12>23</P_12>
		</FaWiersz>
		<FaWiersz>
			<NrWierszaFa>2</NrWierszaFa>
			<UU_ID>aaaa111133339991</UU_ID>
			<P_7>wniesienie sprzętu</P_7>
			<P_8A>szt.</P_8A>
			<P_8B>1</P_8B>
			<P_9A>40.65</P_9A>
			<P_11>40.65</P_11>
			<P_12>23</P_12>
		</FaWiersz>
		<FaWiersz>
			<NrWierszaFa>3</NrWierszaFa>
			<UU_ID>aaaa111133339992</UU_ID>
			<P_7>promocja lodówka pełna mleka</P_7>
			<P_8A>szt.</P_8A>
			<P_8B>1</P_8B>
			<P_9A>0.95</P_9A>
			<P_11>0.95</P_11>
			<P_12>5</P_12>
		</FaWiersz>
		<Platnosc>
			<Zaplacono>1</Zaplacono>
			<DataZaplaty>2026-01-27</DataZaplaty>
			<FormaPlatnosci>6</FormaPlatnosci>
		</Platnosc>
		<WarunkiTransakcji>
			<Zamowienia>
				<DataZamowienia>2026-01-26</DataZamowienia>
				<NrZamowienia>4354343</NrZamowienia>
			</Zamowienia>
		</WarunkiTransakcji>
	</Fa>
	<Stopka>
		<Informacje>
			<StopkaFaktury>Kapiał zakładowy 5 000 000</StopkaFaktury>
		</Informacje>
		<Rejestry>
			<KRS>0000099999</KRS>
			<REGON>999999999</REGON>
			<BDO>000099999</BDO>
		</Rejestry>
	</Stopka>
</Faktura>


I na statusie faktury dostaje:

Kopiuj
{
    "ordinalNumber": 1,
    "referenceNumber": "20251001-EE-27D34D7000-9807F91263-F8",
    "invoiceHash": "mnRWka9iAmK0MNPBj71C9i41yR65eW4z9mH0fzwYX2A=",
    "invoicingDate": "2025-10-01T11:35:59.9596226+00:00",
    "status": {
        "code": 450,
        "description": "Błąd weryfikacji semantyki dokumentu faktury",
        "details": [
            "Could not find schema information for the element 'http://crd.gov.pl/wzor/2025/06/25/13775/:Faktura'."
        ]
    }
}

Jakieś pomysły?

KU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Mam ogromny problem z autoryzowaniem się przez certyfikat. Nie dość, że nie mam pewności czy wygenerowany certyfikat w sposób podany przez @safelock1 jest poprawny

Kopiuj
openssl genrsa -out klucz_prywatny.key 2048
Plik ksef_openssl.cnf

default_bits       = 2048
default_keyfile    = klucz_prywatny.key
distinguished_name = req_distinguished_name
prompt             = no

[ req_distinguished_name ]
C  = PL
ST = Mazowieckie
L  = Warszawa
O  = Firma Testowa
OU = Dział KSeF
CN = Firma Testowa
serialNumber = NIP1234567890
emailAddress = test@firma.pl

openssl req -x509 -new -nodes -key klucz_prywatny.key -days 365 -out certyfikat_test.crt -config ksef_openssl.cnf
openssl pkcs12 -export -out ksef_test.p12 -inkey klucz_prywatny.key -in certyfikat_test.crt -passout pass:TwojeHaslo

To jeszcze nie wiem czy skrypty python do podpisywania pliku XML są poprawne ponieważ czasem dostaję komunikat:
"exceptionCode": 9105, "exceptionDescription": "Nieprawidłowa treść podpisu.",
a czasem:
"exceptionCode": 21115, "exceptionDescription": "Nieprawidłowy certyfikat."

Pytanie, który kod błędu powoduje, że jestem w procesie dalej?
Już nie wiem jak znaleźć poprawne rozwiązanie i zaczynam się kręcić w kółko

S1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

Moj podpisany plik XML do autoryzacji XAdES (nie dziala :/).
Ktoś widzi jakąś nieprawidłowsc? Proszę tez o podesłanie pliku signed.xml ktory został zaakceptowany przez KSeF (do analizy) - najlepiej samopodpisany

Kopiuj
<?xml version='1.0' encoding='UTF-8'?>
<AuthTokenRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ksef.mf.gov.pl/auth/token/2.0">
    <Challenge>20251001-CR-24CA070000-A2B3D95405-78</Challenge>
    <ContextIdentifier>
        <Nip>6422786434</Nip>
    </ContextIdentifier>
    <SubjectIdentifierType>certificateSubject</SubjectIdentifierType>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>dE4JyWOSMxZ20CZ3k3Wl6arRpjavdrpsUgre6isc1yE=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>VE+3eJ2MkQ52ckItfZSE6e/lAIxRvyuQ4ne2t+c6mY/8RWaY5yoqt+YMHUiJxNNL
Fbf/OJY32IYsoSb6Cp28KLTPQ9G8EJ2KVMzHMUqOrXoOfOrenRKeN8bm3O/ZaloH
NlbGGAMYuZ6k5p2PPwpquSKjJGyAjuHAEpXmV/BStu/UE6GGZEMWpvobr5gSmD11
EGPrMOKw+K29P5wdA05itTjFEswUx4MYCqQOFrSuVqIjhLRmJ1fiMAHYS3WAV9sX
qm6Q79h1k22ZH9eeL4cluhCrXNM3xR96jN1icz1bCESRPih81OyVDzykiNuZ1GyF
NDtShaWz9rEbEmt8wGcjog==</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIID6TCCAtECFCl4dTPEPdP6zznoVq7bckc6ctuAMA0GCSqGSIb3DQEBCwUAMIGw
MQswCQYDVQQGEwJQTDEQMA4GA1UECAwHc2xhc2tpZTERMA8GA1UEBwwIV2Fyc3ph
d2ExFjAUBgNVBAoMDUZpcm1hIFRlc3Rvd2ExFjAUBgNVBAsMDUR6aWHDhcKCIEtT
ZUYxFjAUBgNVBAMMDUZpcm1hIFRlc3Rvd2ExFjAUBgNVBAUTDU5JUDY0MjI3ODY0
MzQxHDAaBgkqhkiG9w0BCQEWDXRlc3RAZmlybWEucGwwHhcNMjUwOTMwMTcyMDIz
WhcNMjYwOTMwMTcyMDIzWjCBsDELMAkGA1UEBhMCUEwxEDAOBgNVBAgMB3NsYXNr
aWUxETAPBgNVBAcMCFdhcnN6YXdhMRYwFAYDVQQKDA1GaXJtYSBUZXN0b3dhMRYw
FAYDVQQLDA1Eemlhw4XCgiBLU2VGMRYwFAYDVQQDDA1GaXJtYSBUZXN0b3dhMRYw
FAYDVQQFEw1OSVA2NDIyNzg2NDM0MRwwGgYJKoZIhvcNAQkBFg10ZXN0QGZpcm1h
LnBsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2QL4SkkBVkKtEjm+
/SBX6LDrAUS8ArQLBfFFJWGg/qoX2tS/8Ld8mxnGoLlZiUISeoFghzVfUcgHh2M+
2Ke4i/PLCPrf06gpp9h1qHPgOwTyvwG9QnhWvU6LUrAUVKcbWf7hw+4VFbb5/WEY
Kd15xIz61POtIp0UMAZh6ikJr+kpb1qxW3uAEmAxDc9vtXKIhoaGF9OP8i1Mdcke
4xjblCDp+W/Mey0fMAbrBXULspLgKO3OaJPzJOgyuEvywBuDaJXYHl/NAIz+QRMO
+XikZkzip246aaS+aWbb18PjKdWNRVevn3p/i4rv3fJ71d1o7JBC4NHY+ZXNLDDq
CAG3oQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQB17hPuOhBkoXAiHcAJxTmdyuQT
RkEkiHGdKjNUTbifM4jTyb3OX7mdJzshJhho72vBEZXMAC4anrZTMVWWbj3cbdJi
A3UBZ2kMjllFhVo5i9GhpJ39sDD52YeqasoDaEPmaCuXVk3Zi7tBfgsboTTdRe6q
XtQr79j/TBN73aJOmyPG0lF3rQ4g2zFJOPLdi8G/EdFTm31JRc65nhNNy8zVKjUC
/E/geaXKrRJ8GglzNo0m1JDvP94ewm9HiY7LIbA6Cu6e8q6A/2xbicxJwAb2ij/w
u3wsbMMCQD++SH2EYuUlS7Vt/BSxh5L2XBJnKCKhrPFWmt/y8YxpFfkIiwZ9
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<ds:Object><ns0:QualifyingProperties xmlns:ns0="http://uri.etsi.org/01903/v1.3.2#" Target="#SignatureId"><ns0:SignedProperties Id="SignedPropertiesId"><ns0:SignedSignatureProperties><ns0:SigningTime>2025-10-01T12:12:03Z</ns0:SigningTime><ns0:SigningCertificate><ns0:Cert><ns0:CertDigest><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><ds:DigestValue>OA7Vt/caMD8prlDRDTh4b68iB4Vf/STi2H1GSZII13o=</ds:DigestValue></ns0:CertDigest><ns0:IssuerSerial><ds:X509IssuerName>1.2.840.113549.1.9.1=test@firma.pl,2.5.4.5=NIP6422786434,CN=Firma Testowa,OU=DziaÅ KSeF,O=Firma Testowa,L=Warszawa,ST=slaskie,C=PL</ds:X509IssuerName><ds:X509SerialNumber>236754920780305540929077014446592445654622198656</ds:X509SerialNumber></ns0:IssuerSerial></ns0:Cert></ns0:SigningCertificate></ns0:SignedSignatureProperties></ns0:SignedProperties></ns0:QualifyingProperties></ds:Object></ds:Signature></AuthTokenRequest>

Odpowiedz z KSeF (var_dump)

Kopiuj

string(280) "{"exception":{"exceptionDetailList":[{"exceptionCode":9105,"exceptionDescription":"Nieprawidłowa treść podpisu.","details":["Nieprawidłowa treść podpisu."]}],"serviceCode":"00-8d9e2f8edab54cead3685e556a7ed991-05a89091c91205ca-00","timestamp":"2025-10-01T12:12:40.5864727Z"}}"


Tomek Kot
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0

"Udało" mi się dodać fakture w fa2 i uzyskać upo. Dobrze czytajcie testy i korzystacie z OnlineSessionUtils taka moja rada.

Przy okazji dziękuje wszystkim za utrzymanie przy życiu tego wątku. Dzięki niemu tylko wiem co sie dzieje w tym burdlu ksefowym.

JR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

invoiceHash
required

string

Skrót SHA256 oryginalnej faktury, zakodowany w formacie Base64.
invoiceSize
required

integer <int64>

Rozmiar oryginalnej faktury w bajtach.
encryptedInvoiceHash
required

string

Skrót SHA256 zaszyfrowanej faktury, zakodowany w formacie Base64.
encryptedInvoiceSize
required

integer <int64>

Rozmiar zaszyfrowanej faktury w bajtach. TO JEST ROZMIAR BASE64?. Dostaje zwrotką Nieprawid\u0142owy rozmiar pliku.","details":["Content length does not match the file size."]}]

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

Mój certyfikat wygląda tak kesf_openssl.cnf

Konfiguracja OpenSSL dla certyfikatu KSeF

Plik: ksef_openssl.cnf

[ ca ]
default_ca = CA_default

[ CA_default ]
dir = .
certs = $dir/certs
crl_dir = $dir/crl
database = $dir/index.txt
new_certs_dir = $dir/newcerts
serial = $dir/serial
RANDFILE = $dir/private/.rand

[ oid_section ]
OID.2.5.4.97 = organizationIdentifier

[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
x509_extensions = v3_req
string_mask = utf8only
prompt = no

[ req_distinguished_name ]
countryName = PL
organizationName = Firma
commonName = Jan kowalski
organizationIdentifier = VATPL-7343170998

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment
extendedKeyUsage = clientAuth

a xml z podpisem jaki wysyłam do ksef wygląda tak i cały czas mam błąd Nieprawidłowa treść podpisu. Już nie mam pomysłu dlaczego

Kopiuj
<?xml version="1.0" encoding="UTF-8"?>
<AuthTokenRequest xmlns="http://ksef.mf.gov.pl/auth/token/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Challenge>20251001-CR-2E1E6D7000-63D121B9B4-0D</Challenge>
  <ContextIdentifier>
    <Nip>7343170998</Nip>
  </ContextIdentifier>
  <SubjectIdentifierType>certificateSubject</SubjectIdentifierType>
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="ID-d49a4f18-9201-4807-b303-ecf476297fc0">
    <ds:SignedInfo Id="ID-7eb0ae36-90bd-478a-a408-6a2298792efe">
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
      <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
      <ds:Reference Id="ID-ee01e21b-c390-4a9f-bf63-3d540639c923" URI="">
        <ds:Transforms>
          <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
        </ds:Transforms>
        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
        <ds:DigestValue>GuN34BpLfKAt8CNjiw0OuKaKvCVEfkpO/NU8fk/gxvM=</ds:DigestValue>
      </ds:Reference>
      <ds:Reference Id="ID-33248682-0a46-4815-9286-19e62a59a885" Type="http://uri.etsi.org/01903#SignedProperties" URI="#ID-5e41a2d8-f97c-4bf2-8708-caf90c204336">
        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
        <ds:DigestValue>KjC4aVCjcRaMU6Jf8PY2NtGtJta+S4dgXy6LLEB9LjE=</ds:DigestValue>
      </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue Id="ID-4d0d5d67-7a4b-4a71-a8a4-12eb49ccf440">WCdc+VrCtNgl0Y70aPYGyFeRr+ywZkN/IwCCihdXLV28f67TS/B7t+kaPm4rSLtQ27aqjBOgBPnsl1Smff30YFV6gS+gDkB3UDKwesEcvKdS35SX5JWoSZ73k9l+KdFWn03x4lZFtM9D6hOxYey778RL0dQ2Mk3p5hIL9kJl/v9VKjDTjk7osK0kXyvqU8Zm0T+Zp2jVhsRZk4qRfJu+Nd+jSVVpnyzfKL2EZWI7xWpHxasoH/ch35zx+eMPVAMPXaWqo5OfkFspEEceAc3YEYXF6bMy1USQqEW/W64lDiNGPvSN30CMdMEoGW2YjpN8+/AJNrY23SwfmrVPwTStHQ==</ds:SignatureValue>
    <ds:KeyInfo>
      <ds:X509Data>
        <ds:X509Certificate>MIIDejCCAmKgAwIBAgIUXsu50QRP+JoFXCzTF2tkqXPyG1swDQYJKoZIhvcNAQELBQAwTzELMAkGA1UEBhMCUEwxDjAMBgNVBAoMBUZpcm1hMRUwEwYDVQQDDAxKYW4ga293YWxza2kxGTAXBgNVBGEMEFZBVFBMLTczNDMxNzA5OTgwHhcNMjUxMDAxMTMyNTA1WhcNMjYxMDAxMTMyNTA1WjBPMQswCQYDVQQGEwJQTDEOMAwGA1UECgwFRmlybWExFTATBgNVBAMMDEphbiBrb3dhbHNraTEZMBcGA1UEYQwQVkFUUEwtNzM0MzE3MDk5ODCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMqL9fB4Xm2G2akdk7Or64qlW51RW7Lyv9eK9immKS5fBeK4tzjNex2N9/9uCVGYjCVfL95a7PkfiTMAdFfbbtl7hyKkoX8XSm8GBmQsVXtfQdDhlvxSbQpInMB3+UvFv89k8dyq+xtsEuXvkmbnhgjWp0Yjo7AiS0Ul2TcObkPr3zGbyyWKWI1NGEtsaPQXoDFnLCU1SfasyVdfMVW4LJsIGDDDTUo2UEtpxfHV7x6VMQ0sPbqTtDF+igrnsCpy8STc7kVeGoUlVgnoYhPANhidJnTHps9xrunSqAM17wDxIgU0QSrNTHwc6Ejhg6nxJt6m6/18+lRZPZZE2nKtiP8CAwEAAaNOMEwwCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwHQYDVR0OBBYEFNjyWvVG/GbMOvPTKPYhJT/aGbx5MA0GCSqGSIb3DQEBCwUAA4IBAQCS1auGaaxNWwK+E9YEqdFT6m8yUxHT6RJfGZG5j0pkWbRRRiKS69/HspJI/5QXj3x6Hj5bNTOShXsbgf3DEfOMtNjslJlRZ0Qqc2EwbngB4C0ZbzMa9WIh50OX79m+MMYczi5UmjYJHYTjKfr7dvndLNo+zXE3sbOeOQFmLCXTqxEPe25uG0FVu3d1VFNP+lXajL8Gnbd2w73gy6G6gkZoS9kGAMsR43luwyDYEhnr5GcQOUXsHSXDRpkOw6wssT3ZPAht463nU58CTJwROPpDEnprdDLLlzW0dAuIBRw4TZDV63Ne1pjhZx/T8enE7wFmuktcHj3fsAoOn5FJCFqW</ds:X509Certificate>
      </ds:X509Data>
    </ds:KeyInfo>
    <ds:Object>
      <xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#ID-d49a4f18-9201-4807-b303-ecf476297fc0">
        <xades:SignedProperties Id="ID-5e41a2d8-f97c-4bf2-8708-caf90c204336">
          <xades:SignedSignatureProperties>
            <xades:SigningTime>2025-10-01T13:25:57Z</xades:SigningTime>
            <xades:SigningCertificate>
              <xades:Cert>
                <xades:CertDigest>
                  <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                  <ds:DigestValue>LUoCVAAzrClmesOUyqKKBMMbcGvzbckI1/6pnS2RpaY=</ds:DigestValue>
                </xades:CertDigest>
                <xades:IssuerSerial>
                  <ds:X509IssuerName>L=Mazowieckie, C=PL, O=Firma, serialNumber=NIP-7343170998, GN=Jan, SN=Kowalski, CN=Jan kowalski</ds:X509IssuerName>
                  <ds:X509SerialNumber>541188370630386839572757270176888046432034102107</ds:X509SerialNumber>
                </xades:IssuerSerial>
              </xades:Cert>
            </xades:SigningCertificate>
          </xades:SignedSignatureProperties>
        </xades:SignedProperties>
      </xades:QualifyingProperties>
    </ds:Object>
  </ds:Signature>
</AuthTokenRequest>

S1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

To jest prawidłowa struktura dla certyfikatu.

Kopiuj
default_bits       = 2048
default_keyfile    = klucz_prywatny.key
distinguished_name = req_distinguished_name
prompt             = no

[ req_distinguished_name ]
countryName  = PL
givenName    = Dawid
surname      = Nazwisko
commonName   = Firma
serialNumber = NIP-6422786434

Kolejnosc bledow przy autoryzacji:

  1. Nieprawidłowa treść podpisu.
  2. Nieprawidłowy certyfikat.
  3. Nieprawidłowe wyzwanie autoryzacyjne. ->(blednie przekazany nr init do xml)

python3 skrypt podpisujący plik auth.xml do signed.xml (cert p12 bez hasła) - działa z ksef2.0!!! - podziękowania dla ChatGPT 99% roboty odwalił (ja jako amator w programowaniu dzięki ChatGPT zintegrowałem środowisko testowe z moim system fakturowym (lms.org.pl) w 1 dniówkę ):

Kopiuj
import base64
import uuid
from datetime import datetime
from lxml import etree
import xmlsec
from cryptography.hazmat.primitives.serialization import pkcs12, Encoding, PrivateFormat, NoEncryption
from cryptography.hazmat.primitives import hashes

# =======================
# Pliki i konfiguracja
# =======================
xml_input_file = "auth.xml"
xml_output_file = "signed.xml"
p12_file = "cert.p12"
p12_password = b""  # bytes

DS_NS = "http://www.w3.org/2000/09/xmldsig#"
XADES_NS = "http://uri.etsi.org/01903/v1.3.2#"

NSMAP = {
    "ds": DS_NS,
    "xades": XADES_NS
}

# =======================
# Wczytaj XML
# =======================
tree = etree.parse(xml_input_file)
root = tree.getroot()

# =======================
# UUID i Id dla podpisu
# =======================
sig_id = f"Signature-{uuid.uuid4()}"
qp_id = f"QualifyingProps-{uuid.uuid4()}"
sp_id = f"xades-{uuid.uuid4()}"

# =======================
# Utwórz szablon podpisu (enveloped)
# =======================
signature_node = xmlsec.template.create(
    root,
    xmlsec.Transform.EXCL_C14N,
    xmlsec.Transform.RSA_SHA256,
    ns="ds"
)
signature_node.set("Id", sig_id)
root.append(signature_node)

# =======================
# Reference do całego dokumentu z XPath
# =======================
ref_doc = xmlsec.template.add_reference(signature_node, xmlsec.Transform.SHA256, uri="")
xpath_transform = xmlsec.template.add_transform(ref_doc, xmlsec.Transform.XPATH)

# Tworzymy element <ds:XPath> wewnątrz transform
xpath_elem = etree.SubElement(xpath_transform, etree.QName(DS_NS, "XPath"))
xpath_elem.text = "not(ancestor-or-self::ds:Signature)"

# =======================
# KeyInfo / X509Data
# =======================
key_info = xmlsec.template.ensure_key_info(signature_node)
xmlsec.template.add_x509_data(key_info)

# =======================
# Dodaj XAdES-BES Object
# =======================
object_node = etree.SubElement(signature_node, etree.QName(DS_NS, "Object"))
qualifying_properties = etree.SubElement(
    object_node,
    etree.QName(XADES_NS, "QualifyingProperties"),
    Id=qp_id,
    Target="#" + sig_id
)
signed_properties = etree.SubElement(
    qualifying_properties,
    etree.QName(XADES_NS, "SignedProperties"),
    Id=sp_id
)
signed_signature_properties = etree.SubElement(
    signed_properties,
    etree.QName(XADES_NS, "SignedSignatureProperties")
)

# SigningTime z lokalną strefą czasową
local_time = datetime.now().astimezone()
signing_time = etree.SubElement(
    signed_signature_properties,
    etree.QName(XADES_NS, "SigningTime")
)
signing_time.text = local_time.isoformat(timespec="milliseconds")

# =======================
# Załaduj P12 i certyfikat
# =======================
with open(p12_file, "rb") as f:
    p12_data = f.read()

private_key, cert, additional_certs = pkcs12.load_key_and_certificates(p12_data, p12_password)

# SHA256 digest certyfikatu
cert_der = cert.public_bytes(Encoding.DER)

# SigningCertificate
signing_certificate = etree.SubElement(signed_signature_properties, etree.QName(XADES_NS, "SigningCertificate"))
cert_node = etree.SubElement(signing_certificate, etree.QName(XADES_NS, "Cert"))
cert_digest = etree.SubElement(cert_node, etree.QName(XADES_NS, "CertDigest"))
digest_method = etree.SubElement(cert_digest, etree.QName(DS_NS, "DigestMethod"))
digest_method.set("Algorithm", "http://www.w3.org/2001/04/xmlenc#sha256")
digest_value = etree.SubElement(cert_digest, etree.QName(DS_NS, "DigestValue"))

digest = hashes.Hash(hashes.SHA256())
digest.update(cert_der)
digest_value.text = base64.b64encode(digest.finalize()).decode("utf-8")

# IssuerSerial
issuer_serial = etree.SubElement(cert_node, etree.QName(XADES_NS, "IssuerSerial"))
issuer_name = etree.SubElement(issuer_serial, etree.QName(DS_NS, "X509IssuerName"))
issuer_name.text = cert.issuer.rfc4514_string()
serial_number = etree.SubElement(issuer_serial, etree.QName(DS_NS, "X509SerialNumber"))
serial_number.text = str(cert.serial_number)

# =======================
# SignaturePolicyIdentifier (implied)
# =======================
spi = etree.SubElement(signed_signature_properties, etree.QName(XADES_NS, "SignaturePolicyIdentifier"))
etree.SubElement(spi, etree.QName(XADES_NS, "SignaturePolicyImplied"))

# =======================
# SignerRole - tu możesz dodać dane osoby zgodnie z KSeF
# =======================
signer_role = etree.SubElement(signed_signature_properties, etree.QName(XADES_NS, "SignerRole"))
claimed_roles = etree.SubElement(signer_role, etree.QName(XADES_NS, "ClaimedRoles"))
claimed_role = etree.SubElement(claimed_roles, etree.QName(XADES_NS, "ClaimedRole"))
# claimed_role.append(...)  # Tutaj możesz wstawić strukturę ePUAP / KSeF

# =======================
# Dodaj Reference do SignedProperties
# =======================
ref_props = xmlsec.template.add_reference(
    signature_node,
    xmlsec.Transform.SHA256,
    uri="#" + sp_id,
    type="http://uri.etsi.org/01903#SignedProperties"
)
xmlsec.template.add_transform(ref_props, xmlsec.Transform.EXCL_C14N)

# =======================
# Przygotuj klucz PEM do xmlsec
# =======================
private_key_pem = private_key.private_bytes(
    encoding=Encoding.PEM,
    format=PrivateFormat.PKCS8,
    encryption_algorithm=NoEncryption()
)
cert_pem = cert.public_bytes(Encoding.PEM)

key = xmlsec.Key.from_memory(private_key_pem, xmlsec.constants.KeyDataFormatPem, None)
key.load_cert_from_memory(cert_pem, xmlsec.constants.KeyDataFormatPem)

# =======================
# Podpisz dokument
# =======================
ctx = xmlsec.SignatureContext()
ctx.key = key
ctx.sign(signature_node)

# =======================
# Zapis podpisanego XML
# =======================
tree.write(xml_output_file, encoding="UTF-8", xml_declaration=True, pretty_print=True)
print(f"Dokument podpisany i zapisany jako {xml_output_file}")


Jak już macie token_auth to teraz czas na token do uwierzytelnienia operacji :

Kopiuj
function GetToken($url,$token_auth) {

$url = $url."api/v2/auth/token/redeem";

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$headers = array(
    "accept: application/json",
    "Authorization: Bearer $token_auth",
    "Content-Type: application/json",
);

curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$resp = curl_exec($curl);
var_dump($resp);
curl_close($curl);
return $resp;
};

I sprawdzenie czy jest aktywna sesja:

Kopiuj


function SessionStatus($url,$token) {
$url = $url."api/v2/auth/sessions";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$headers = array(
    "accept: application/json",
    "SessionToken: $token",
    "Authorization: Bearer $token"
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$resp = curl_exec($curl);
curl_close($curl);
return $resp;
};

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

Panowie i Damy, a czy jest dostępna aplikacja podatnika w wersji Test? Ta webowa. Bo ni cholery nie widzę.

JR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Potrzebuję pomocy jak to ogarnąć.
invoiceHash required string

Skrót SHA256 oryginalnej faktury, zakodowany w formacie Base64.
invoiceSize required integer <int64>

Rozmiar oryginalnej faktury w bajtach.
encryptedInvoiceHash required string

Skrót SHA256 zaszyfrowanej faktury, zakodowany w formacie Base64.
encryptedInvoiceSize required integer <int64>

Rozmiar zaszyfrowanej faktury w bajtach.
encryptedInvoiceContent required string

Faktura zaszyfrowana algorytmem AES-256-CBC z dopełnianiem PKCS#7 (kluczem przekazanym przy otwarciu sesji), zakodowana w formacie Base64 .

Mam xml w bazie I wyliczam skrót i rozmiar ale jak go wyliczyć po szyfrowaniu .
Mam function
EncryptInvoiceAESBase64(const Xml: string; const AESKey, AESIV: TBytes; OUT aSize:integer): string;
var
XmlBytes, EncryptedXml: TBytes;
begin
if Length(AESKey) <> 32 then
raise Exception.Create('AESKey musi mieć 32 bajty (AES-256)');
if Length(AESIV) <> 16 then
raise Exception.Create('AESIV musi mieć 16 bajtów');
// 1. Zamiana XML na bajty UTF-8
XmlBytes := TEncoding.UTF8.GetBytes(Xml);
// 2. Szyfrowanie AES-256-CBC z PKCS#7
EncryptedXml := AESEncrypt(XmlBytes, AESKey, AESIV);
aSize := Length(EncryptedXml);
// 3. Kodowanie Base64
Result := TNetEncoding.Base64.EncodeBytesToString(EncryptedXml);
end;
i nie wiem jak dobrze policzyc sha256

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

Czy w tym momencie da się jakoś zweryfikować poprawność kodów QR? Czy po prostu jak wejdzie aplikacja podatnika? Czyli 03.11?

N1ebieski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 27
0

OK po całym dniu walki udało mi się zaimplementować całą sekcję generowania tych ich certyfikatów > https://ksef-test.mf.gov.pl/docs/v2/index.html#tag/Certyfikaty

Wg dokumentacji dozwolone typy kluczy prywatnych to:

RSA (OID: 1.2.840.113549.1.1.1), długość klucza równa 2048 bitów,
EC (klucze oparte na krzywych eliptycznych, OID: 1.2.840.10045.2.1), krzywa NIST P-256 (secp256r1)

Zalecają EC.

Jeśli generuje klucz prywatny w formacie RSA:

Kopiuj
$privateKey = openssl_pkey_new([
    "private_key_bits" => 2048,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
]);

to potem podpis w "mojej" nieco przerobionej klasie > https://github.com/N1ebieski/ksef-php-client/blob/main/src/Actions/SignDocument/SignDocumentHandler.php za pomocą:

Kopiuj
$sign = openssl_sign(
    $signedInfo->C14N(),
    $actualDigest,
    $action->certificate->privateKey,
    'sha256WithRSAEncryption'
);

Przechodzi przez ich system bezproblemowo.

Ale jeśli podpis stworzę w formacie EC:

Kopiuj
$privateKey = openssl_pkey_new([
    'private_key_type' => OPENSSL_KEYTYPE_EC,
    'curve_name' => 'prime256v1'
]);

to żaden algorytm nie przechodzi. Ani OPENSSL_ALGO_SHA256, ani OPENSSL_PKCS1_PADDING. Za każdym razem zwrotka: "Nieprawidłowa treść podpisu".

Ktoś ma jakiś pomysł?

S1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

Pojawił się kolejny problem przy wysyłaniu faktury:

Kopiuj
string(316) "{"exception":{"exceptionDetailList":[{"exceptionCode":21180,"exceptionDescription":"Status sesji nie pozwala na wykonanie
operacji.","details":["Status sesji (415) uniemożliwia wysyłkę faktur."]}],"serviceCode":
"00-fcf48820ae729b97efc25e67e8193112-692d9bfa14795fb4-00","timestamp":"2025-10-01T17:48:25.3885281Z"}}"


Jakieś pomysły?

WJ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 47
0

@safelock1 podał przepis na poprawny certyfikat w tym poście. Patrząc na podpisy, z którymi wielu z Was miało problemy, chciałbym podrzucić podpowiedź, która wynika z tej dokumentacji:

Dla bazy danych TEST twórzcie pieczęcie firmowe (self-signed), z kluczem RSA, zawierające w Subject element OID.2.5.4.97 z numer NIP do którego chcecie wejść. Stworzyć je można na wiele różnych sposobów, ale koniec końców pole Subject takiego certyfikatu powinno mieć postać:

Kopiuj
O={Oficjalna nazwa firmy}, OID.2.5.4.97=VATPL-{NIP}, CN={Skrócona nazwa firmy}, C=PL

Przedrostek "VATPL-" jest KONIECZNY.

Na przykład:
O=Test sp. z o.o., OID.2.5.4.97=VATPL-1111111111, CN=Test, C=PL

Nie masz poprawnego OID.2.5.4.97 w polu Subject certyfikatu - Twój request nie przejdzie autoryzacji.

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

@Witold Jaworski zmieniłem na OID.2.5.4.97=VATPL-7343170998 ale dalej Nieprawidłowa treść podpisu

Kopiuj
<?xml version="1.0" encoding="UTF-8"?>
<AuthTokenRequest xmlns="http://ksef.mf.gov.pl/auth/token/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Challenge>20251001-CR-41B5126000-63647AD176-1E</Challenge>
  <ContextIdentifier>
    <Nip>7343170998</Nip>
  </ContextIdentifier>
  <SubjectIdentifierType>certificateSubject</SubjectIdentifierType>
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="ID-7cabc86e-c91f-435f-a91b-503165e00dc7">
    <ds:SignedInfo Id="ID-b6162afe-9c26-4d1c-b0da-5bf394a4ffbf">
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
      <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
      <ds:Reference Id="ID-a37bbc66-d8db-40f1-aec9-d77763486941" URI="">
        <ds:Transforms>
          <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
        </ds:Transforms>
        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
        <ds:DigestValue>9YmyM76cMXfQLTC4FWxuf6itL35ie621QsVYHvbQTMQ=</ds:DigestValue>
      </ds:Reference>
      <ds:Reference Id="ID-2de97359-d31c-4147-9f8a-f3bd67262359" Type="http://uri.etsi.org/01903#SignedProperties" URI="#ID-92a3d812-c60b-49c6-9548-7cbcc53307cd">
        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
        <ds:DigestValue>CFt45hIIqR5l99zD+GVJohdRzaUeXtwTpUtnMom9uis=</ds:DigestValue>
      </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue Id="ID-85a1f7fc-c381-4f46-9435-f59b081185d4">oY8ZIc7EWdfbv/DifBnb2RvGpIsvr+yw0KBTwgbVzSbXjEwCwHVwHyishYM04BVst89GdzOYuYuErspKIBx0T+KvYaIHEt+8/dX/oGzavWBoEH2M/npo3s1DUntTUlKXvvGAv8ha8GloTnBKoJkeXFk4beXgp378JcYhL7vfdB+R73siAbAsH8ofLKaDZCR1XuNEHmnKOqxdWr/kDiGhbwrp3m5EpiSXZrf8foDOYH8RMsy1VW9R2+xVr84AttG3dUVqrdER6dKlOjKsi9TmlyE+PDofYSyrG6V62xgIzvicwBuaW9RfhXCCKWlahoeLc2zi/SSAXdmolBYmsSWfBw==</ds:SignatureValue>
    <ds:KeyInfo>
      <ds:X509Data>
        <ds:X509Certificate>MIIDejCCAmKgAwIBAgIUXsu50QRP+JoFXCzTF2tkqXPyG1swDQYJKoZIhvcNAQELBQAwTzELMAkGA1UEBhMCUEwxDjAMBgNVBAoMBUZpcm1hMRUwEwYDVQQDDAxKYW4ga293YWxza2kxGTAXBgNVBGEMEFZBVFBMLTczNDMxNzA5OTgwHhcNMjUxMDAxMTMyNTA1WhcNMjYxMDAxMTMyNTA1WjBPMQswCQYDVQQGEwJQTDEOMAwGA1UECgwFRmlybWExFTATBgNVBAMMDEphbiBrb3dhbHNraTEZMBcGA1UEYQwQVkFUUEwtNzM0MzE3MDk5ODCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMqL9fB4Xm2G2akdk7Or64qlW51RW7Lyv9eK9immKS5fBeK4tzjNex2N9/9uCVGYjCVfL95a7PkfiTMAdFfbbtl7hyKkoX8XSm8GBmQsVXtfQdDhlvxSbQpInMB3+UvFv89k8dyq+xtsEuXvkmbnhgjWp0Yjo7AiS0Ul2TcObkPr3zGbyyWKWI1NGEtsaPQXoDFnLCU1SfasyVdfMVW4LJsIGDDDTUo2UEtpxfHV7x6VMQ0sPbqTtDF+igrnsCpy8STc7kVeGoUlVgnoYhPANhidJnTHps9xrunSqAM17wDxIgU0QSrNTHwc6Ejhg6nxJt6m6/18+lRZPZZE2nKtiP8CAwEAAaNOMEwwCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwHQYDVR0OBBYEFNjyWvVG/GbMOvPTKPYhJT/aGbx5MA0GCSqGSIb3DQEBCwUAA4IBAQCS1auGaaxNWwK+E9YEqdFT6m8yUxHT6RJfGZG5j0pkWbRRRiKS69/HspJI/5QXj3x6Hj5bNTOShXsbgf3DEfOMtNjslJlRZ0Qqc2EwbngB4C0ZbzMa9WIh50OX79m+MMYczi5UmjYJHYTjKfr7dvndLNo+zXE3sbOeOQFmLCXTqxEPe25uG0FVu3d1VFNP+lXajL8Gnbd2w73gy6G6gkZoS9kGAMsR43luwyDYEhnr5GcQOUXsHSXDRpkOw6wssT3ZPAht463nU58CTJwROPpDEnprdDLLlzW0dAuIBRw4TZDV63Ne1pjhZx/T8enE7wFmuktcHj3fsAoOn5FJCFqW</ds:X509Certificate>
      </ds:X509Data>
    </ds:KeyInfo>
    <ds:Object>
      <xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#ID-7cabc86e-c91f-435f-a91b-503165e00dc7">
        <xades:SignedProperties Id="ID-92a3d812-c60b-49c6-9548-7cbcc53307cd">
          <xades:SignedSignatureProperties>
            <xades:SigningTime>2025-10-01T19:08:19Z</xades:SigningTime>
            <xades:SigningCertificate>
              <xades:Cert>
                <xades:CertDigest>
                  <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                  <ds:DigestValue>LUoCVAAzrClmesOUyqKKBMMbcGvzbckI1/6pnS2RpaY=</ds:DigestValue>
                </xades:CertDigest>
                <xades:IssuerSerial>
                  <ds:X509IssuerName>O=Firma, OID.2.5.4.97=VATPL-7343170998, CN=Jan kowalski, C=PL</ds:X509IssuerName>
                  <ds:X509SerialNumber>541188370630386839572757270176888046432034102107</ds:X509SerialNumber>
                </xades:IssuerSerial>
              </xades:Cert>
            </xades:SigningCertificate>
          </xades:SignedSignatureProperties>
        </xades:SignedProperties>
      </xades:QualifyingProperties>
    </ds:Object>
  </ds:Signature>
</AuthTokenRequest>

Przepraszam pousuwałem białe spacje i formatowanie i teraz mam błąd
{"exceptionCode":21001,"exceptionDescription":"Nieczytelna treść."}],"serviceCode":"00-0e93d12bb2ce866d985aa0578aceba32-6e36a5dfe558401c-00","timestamp":"2025-10-01T19:16:14.9798872Z"}}

Jednak nie dalej Nieprawidłowa treść podpisu :(

WJ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 47
0

@mores4 cóż, specjalistą od podpisów nie jestem (wykorzystałem metody z biblioteki MF i się "uwierzytelniłem").

Pierwsza rzecz to oczywiście klasyczne sprawdzenie, czy tam gdzieś na początku pliku XML nie ma niewidocznego BOM-a.

No a jak go nie ma : nie wiem, czym wykonałeś swój podpis. Dla porównania załączam taki, który przeszedł (zmieniłem tylko NIP w elemencie X509IssuerName certyfikatu, że by się nie "afiszować" 🙂 ). Wykonałem go serwisem SignatureService z biblioteki MF:

Kopiuj
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="Signature">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<DigestValue>UWl+nsKcgKCHfuT+k3GQDcPjnnc6NP2PD2JwNZ7LkQY=</DigestValue>
</Reference>
<Reference URI="#SignedProperties" Type="http://uri.etsi.org/01903#SignedProperties">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<DigestValue>3oSC+5z5h+IETZFJHYztAcfAOB9fSaM6MyE+rfkfY60=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>HSSneflx4kSGTcqUQIdgbyD96eIpVsq0P1hzBvTdwuSfwXN3IiNH/dTdYPjTh/6Px22ZWWNc7hi6sCkVQKyIcaUsvOClydHAAjYMfMrKNS03ypLYi+AzFWQzWtmcubugRCVoRZPZKAh9/NBQUUFJHvD/uohVwDrIPVQUThRdSmT3CVq/YDOg8dlRhWPBQs1pz1FT8tjSzkgebSG+r8BfZqE2CIXZERCYPEifETh3h40SXgyoHVqR1DChNrTPdCA9WbB+YNwhxskDbavdWcg9GxAfNYAY3ySW9Vcqk/r3N/iFbLEssYPKJcbBbN7oyRPtugEy0/Ozg2vB92c5J4XU3w==</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>MIIDNDCCAhygAwIBAgIIRUoViqTmCxQwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UEBhMCUEwxDzANBgNVBAMTBlppZ1phazEZMBcGA1UEYRMQVkFUUEwtNTI1MTQ2OTI4NjEfMB0GA1UEChMWWmlnWmFrIFdpdG9sZCBKYXdvcnNraTAeFw0yNTA4MzEyMjAwMDBaFw0yNjA5MjkyMjAwMDBaMFoxCzAJBgNVBAYTAlBMMQ8wDQYDVQQDEwZaaWdaYWsxGTAXBgNVBGETEFZBVFBMLTUyNTE0NjkyODYxHzAdBgNVBAoTFlppZ1phayBXaXRvbGQgSmF3b3Jza2kwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwPO3NDP15sdAZG3AvuNr6/bBQY/h8F6Pg6CVM67fYZLd499p8nVJ8arCtkRZmHa5EMqbq/P58+KoppwuNMF5d31AEIjUA1RQodv4FTY+IITnSM8gy1jXSPMXUONjdqL4XROh853jAV21vVVGWykusFDon1wvDIPFX+tCaPq7Z0eBVRqDbdIREGYEldquf8gnvvzDvdHROxUyY0GpRY2Hp08mtuICwRAFO0NyF8HdOueYjej9gYHWqo9aD8CmsyVEbfOJnXxO+HjsgyZVM819fjgquLR/fMu10w9TrlnLJNHd/Ajip7HnfINhHbdQkFb0JaZZltS6JFLaPrTMeq3WpAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAIOSI1LR0ynEpundphRS3Q27qPZyJkEK0v72vcXiJIVRao0uw3PHL2nXJ/yKq+ADMcF4EZmnKvCiN2Ks+FCh4ENZvlgfSkSiogDa/I/tBRK5CKm8iebGgY/4GCrv3TnIGy/yRbDTPGy9RJxZkgvdkhBZKelYSyQPXP/53wiSz89suuNFOcoF5cB5C4ygIqPrxioapMq45iCpKKMy0u+t23M3uTFXJ/1QoE0nCvOIutSofvBo/ELhNLHYSsfNLiIZVXa8a2bG18zjaQvXwR/TSzcrt9cgWIUP29HXU6BI7U1fif5XfK5WF3iTFl+7bMY5y8993CYUJyRy5uXyE2BjD0g=</X509Certificate>
</X509Data>
</KeyInfo>
<Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" xmlns="http://www.w3.org/2000/09/xmldsig#" Target="#Signature">
<xades:SignedProperties Id="SignedProperties">
<xades:SignedSignatureProperties>
<xades:SigningTime>2025-10-01T12:08:13.8186675+00:00</xades:SigningTime>
<xades:SigningCertificate>
<xades:Cert>
<xades:CertDigest>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<DigestValue>MQAvJFXNau76xZUQnDMk9p8gdVawKqs/+4hi9UYJ5fo=</DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<X509IssuerName>O=Test S.A, OID.2.5.4.97=VATPL-1111111111, CN=Test, C=PL</X509IssuerName>
<X509SerialNumber>4992826822109825812</X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
</xades:SigningCertificate>
</xades:SignedSignatureProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</Object>
</Signature>

Porównując Twój podpis z moim, widzę, że w Twoim nie ma transformat Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#". Może to jest przyczyną? (Inna sprawa, że nie podejmowałbym się ich ręcznie dodawać - to chyba wiąże się głęboko z innymi elementami struktury podpisu).

Inną "ciekawostką" jest czas tego podpisu (xades:SigningTime): jest o 1 minutę wcześniejszy niż rzeczywisty czas podpisania. Wg loga w moim programie nastąpiło to o 2025-10-01 12:09:13+00:00. Nie wiem, czy to przesunięcie ma jakieś znaczenie.

S1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

Otwarcie sesji wysylania faktur. Coś mi źle przekazuje klucz lub iv. Poniżej przedstawiam kod:

Kopiuj
function OpenSendInvoice($url,$token,$certyfikat) {

$url = $url."api/v2/sessions/online";

$aesKey = random_bytes(32);
$iv = random_bytes(16);
// 3. Wczytaj certyfikat publiczny Ministerstwa Finansów przekazywany do funkcji jako $certyfikat
$publicKey = openssl_pkey_get_public($certyfikat);
if (!$publicKey) {
    die("Błąd: nie udało się wczytać certyfikatu publicznego MF");
}

// 4. Zaszyfruj klucz AES kluczem publicznym (RSA-OAEP)
$encryptedKey = null;
$ok = openssl_public_encrypt(
    $aesKey,
    $encryptedKey,
    $publicKey,
    OPENSSL_PKCS1_OAEP_PADDING
);

if (!$ok) {
    die("Błąd: nie udało się zaszyfrować klucza AES");
}

// 5. Zamień na Base64 (do JSON)
$encryptedKeyB64 = base64_encode($encryptedKey);
$ivB64 = base64_encode($iv);

$result = [
    "encryptedSymmetricKey" => $encryptedKeyB64,
    "initializationVector" => $ivB64
];


$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$headers = array(
    "accept: application/json",
    "Authorization: Bearer $token",
    "Content-Type: application/json",
);
$body='{
"formCode": {
"systemCode": "FA (2)",
"schemaVersion": "1-0E",
"value": "FA"
},
"encryption": {
"encryptedSymmetricKey": "'.$encryptedKeyB64.'",
"initializationVector": "'.$ivB64.'"
}
}
';
//echo $body;
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
$resp = curl_exec($curl);
curl_close($curl);
//var_dump( $resp);
return [$resp,$aesKey,$iv];
};

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

@Witold Jaworski @mores4
To ja wrzucę swój:

Kopiuj
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Signature-202241658">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>nZYlmYOb66IEZIlESUJ8Dm5q8Cwiw2bfSHQfM9z/7kc=</ds:DigestValue>
</ds:Reference>
<ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#SignedProperties-25133724">
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>o7Lzb3rZ/oYVsNjbf5uj8L0R9LE=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>YIPJDsYHespJGmDl6aVYpW34p/8OTgbwQZaI/vq0oEy6vr+5fB+qoJNHRMIaqoIv0ZTqKweRcWFd1cXPyFf0OOnbVZVycHfX3yIbsQI2K05Af32VhYNNKUGziEp+aXn52xhqNB4M1IG2n5mA4y+yFEwVjxBJit1PkzUHNxOIMFY=</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>CN=Test KSeF, 2.5.4.97=#1310564154504C2D35313730333539343538</ds:X509IssuerName>
<ds:X509SerialNumber>112537077704693295255734581952659904794</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509SubjectName>CN=Test KSeF, 2.5.4.97=#1310564154504C2D35313730333539343538</ds:X509SubjectName>
<ds:X509Certificate>MIICczCCAeCgAwIBAgIQVKnaT9Mn36hMeYOONrDZGjAJBgUrDgMCHQUAMC8xGTAXBgNVBGETEFZBVFBMLTUxNzAzNTk0NTgxEjAQBgNVBAMTCVRlc3QgS1NlRjAeFw0yNDA0MjQxMzU2MjhaFw0yNjEyMzEyMjAwMDBaMC8xGTAXBgNVBGETEFZBVFBMLTUxNzAzNTk0NTgxEjAQBgNVBAMTCVRlc3QgS1NlRjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6k9cDpZYliTHSF3AhT7mkFhCnjq2fyZ/LScmqmg1qDE+vodaJjjmmZgq/gI2e3kCibQZVnrAeyuO06CFVMTlf9zRpt7KQ1l6HvMH5vLxTirUaLym3P/hYW+r6ho5I0LSGBFgslk0cWqL1lh+US9A6yNvxYY8Az8UG5LoEiblv30CAwEAAaOBlzCBlDAPBgNVHRMBAf8EBTADAgEAMB8GA1UdJQQYMBYGCCsGAQUFBwMDBgorBgEEAYI3CgMNMGAGA1UdAQRZMFeAEPhrUOoYlRfA4knMNE/A7yShMTAvMRkwFwYDVQRhExBWQVRQTC01MTcwMzU5NDU4MRIwEAYDVQQDEwlUZXN0IEtTZUaCEFSp2k/TJ9+oTHmDjjaw2RowCQYFKw4DAh0FAAOBgQDhNiYhghoANdCGG5koRkHJ53PYpJQmij2OUCDiDX69CIpDGnrlQ7YPaKp5FVMboQqperFOoq7gPL8LEXfKooojKBoUOrXtqJtHSVYzJBkCuVdFLkXQ9508pRGhrtVSvb3FHk+t6Tn8rVU0FORu3gU3Wkcumu26Zq3trvwChpxwLA==</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<ds:Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#Signature-0">
<xades:SignedProperties Id="SignedProperties-25133724">
<xades:SignedSignatureProperties>
<xades:SigningTime>2025-10-02T06:37:41.404Z</xades:SigningTime>
<xades:SigningCertificate>
<xades:Cert>
<xades:CertDigest>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>1xvQ9anL4h01HgKH4r95atQlJBI=</ds:DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<ds:X509IssuerName>CN=Test KSeF, 2.5.4.97=#1310564154504C2D35313730333539343538</ds:X509IssuerName>
<ds:X509SerialNumber>112537077704693295255734581952659904794</ds:X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
</xades:SigningCertificate>
</xades:SignedSignatureProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds:Object>
</ds:Signature>

Co widzę w różnicach

  • ja mam prefix ds, a u @Witold Jaworski nie ma.
  • Mam inne CanonicalizationMethod.Algorith, ale teoretycznie ten mój też jest dopuszczony
  • Nie mam tej drugiej transformaty (która wskazuje na to, co mam ja w CanonicalizationMethod.Algorith hm....
  • NIe mam transformaty pod drugą z referencji
  • mam pola w X509Data wypisane
  • nie mam znacznika czasu
  • I najwazniejsze - błędny format podpisu - sha1 a nie sha256
    Zmieniłem zatem w kodzie w Delphi (SecureBlackBox) dodając linijkę:
Kopiuj
		XAdESSigner.SignedPropertiesReferenceDigestMethod := xdmSHA256;

I poszedłem krok dalej (mimo aż tylu innych różnic) - teraz mam, że certyfikat nieprawidłowy.

Postanowiłem więc zmienić certyfikat zgodnie z tym, co napisał @Witold Jaworski przy pomocy powershella:

Kopiuj
 New-SelfSignedCertificate `
    -Subject "O=Test KSeF, OID.2.5.4.97=VATPL-5170359458, CN=Test KSeF, C=PL" `
    -KeyAlgorithm RSA `
    -KeyLength 2048 `
    -HashAlgorithm SHA256 `
    -KeyExportPolicy Exportable `
    -CertStoreLocation "Cert:\CurrentUser\My" `
    -NotAfter (Get-Date).AddYears(5) `
    -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13")

I... Przeszło wreszcie!
Mimo, że mój XML wygląda teraz tak:

Kopiuj
<?xml version="1.0" encoding="utf-8"?>
<AuthTokenRequest xmlns="http://ksef.mf.gov.pl/auth/token/2.0">
<Challenge>20251002-CR-194FEF2000-B0286D41C4-78</Challenge>
<ContextIdentifier>
<Nip>5170359458</Nip>
</ContextIdentifier>
<SubjectIdentifierType>certificateSubject</SubjectIdentifierType>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Signature-630190668">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>ZQlIiQTXxRFM+F/G58ck4/LktLQC/8nlx2+v3Pan0aM=</ds:DigestValue>
</ds:Reference>
<ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#SignedProperties-1421100823">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>il+qd24O6SeRGq7qUsghMf0/0hYkHJ0vHkXZz2Mf7m4=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>lcDYV52N5nq29ML1likX2dyYgpHAulJ9P1lhXdUNBBaTN/mSWf4CXSTbHOVLnMRl/f+WhBJZFkpX6Aso2vBy2yMpEso4tWac8pAFiPQXhWELIKD6+5myB6bcSxcY+HcFt6Y8ASNeyermrBVM6WINp3fmOBOp0HRyv6QwxE954rU9+KTe5LeAPLLDiDJ33U3l0ujXynlw28ANwa/43j96aB4AgfPY3OrOAcSFzZnhweA5z2wLcL5sn5/Z+ABX8Vz75EhlANWE2vvfhk7VXgcOjSvV4clUQr8B4OZWz3lLv7Db01lcLLO8jH1YD9v872RMX90H75MasdLciHqamxAKBQ==</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>O=Test KSeF, 2.5.4.97=#0C10564154504C2D35313730333539343538, CN=Test KSeF, C=PL</ds:X509IssuerName>
<ds:X509SerialNumber>37506405189843694338792495016796811875</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509SubjectName>O=Test KSeF, 2.5.4.97=#0C10564154504C2D35313730333539343538, CN=Test KSeF, C=PL</ds:X509SubjectName>
<ds:X509Certificate>MIIDfDCCAmSgAwIBAgIQHDd4i/6M9pxMcaPFFTjyYzANBgkqhkiG9w0BAQsFADBQMQswCQYDVQQGEwJQTDESMBAGA1UEAwwJVGVzdCBLU2VGMRkwFwYDVQRhDBBWQVRQTC01MTcwMzU5NDU4MRIwEAYDVQQKDAlUZXN0IEtTZUYwHhcNMjUxMDAyMDcxMDU1WhcNMzAxMDAyMDcyMDU1WjBQMQswCQYDVQQGEwJQTDESMBAGA1UEAwwJVGVzdCBLU2VGMRkwFwYDVQRhDBBWQVRQTC01MTcwMzU5NDU4MRIwEAYDVQQKDAlUZXN0IEtTZUYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyVba7EsQQWl4YFKDkSy3h116XVsHO7uZgF4/oeudW210lx3ac++6IdWwnpojvSXve7ICO7WkiWq1zn6s3EavS/2tVswPNcMq2hvSC7U8D4V+d55phxlCnvJ8Ppgbh+yBtridQQpvYpZp22JAMtqCsWWxE2b82XS/XjUmBod2lfArcTdG7izaeQCFuG+on4Eab4Ydb31LPF0XxywZmSWC94+j1SZeZyb5uweZu3Gz8ePAnmK+1haH3cISLcLAUBtSt91C0cmaOD5NnUk8Lgm8xTp1ZTN19G5SnawjmnOB0FlL2ah4tYRlEHFzTFP1ZaYnrXTRY/0cN0jyaDGcU3j0VAgMBAAGjUjBQMA4GA1UdDwEB/wQEAwIFoDAfBgNVHSUEGDAWBggrBgEFBQcDAwYKKwYBBAGCNwoDDTAdBgNVHQ4EFgQU+HKNFNorpe1VRDpJ0lccE7pfDS0wDQYJKoZIhvcNAQELBQADggEBAGhCWM9N6gTxihyKR1eeTNBqUo0+B3ZO4E2h0+WQIwdwAJS/bpbA2/LMEMnKUFchVWwECph5+UA//9EDZyxpX/sDNVuAyBDuB/HrI7385fcokw4wvh4Squmu/Pc3xBsoTwc5djkA+d4INo18Qv65yYe87sckL+RiAdKtceZzWxZ2NeEjJwO1QTnRgNjFIbfJ0It3ivDq8TrRN7rX2kQxicKIta1+GDiN3x/hp5gaS2s3aYPpAfW3lv0doxhC3R6yiDFajLV4xIChwxrsNN3DsIh3EdLh3fMZ23LW3m3QpUSnBZaERE39ULUT9HRbh4F6tvtx+NLt26pPbY+GWUqroJM=</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<ds:Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#Signature-0">
<xades:SignedProperties Id="SignedProperties-1421100823">
<xades:SignedSignatureProperties>
<xades:SigningCertificate>
<xades:Cert>
<xades:CertDigest>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>JZ3GhSKH/v+U/jDj7tiKPWq8kUk=</ds:DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<ds:X509IssuerName>O=Test KSeF, 2.5.4.97=#0C10564154504C2D35313730333539343538, CN=Test KSeF, C=PL</ds:X509IssuerName>
<ds:X509SerialNumber>37506405189843694338792495016796811875</ds:X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
</xades:SigningCertificate>
</xades:SignedSignatureProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds:Object>
</ds:Signature>
</AuthTokenRequest>

Tylko teraz przy auth/{Ref} dostaję 401, czyli jakby certyfikat nie odpowiadał kontekstowi?

EDIT: Głupi bład - zapomniałem nagłówka Authorization.
Tak więc wszystko już działa
EoE

BTW: NIP to nie mój - pierwszy z brzegu wziąłem jaki google wyrzucił ;)

KU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Czy ktoś podpowie jak z certyfikatu klucz publicznego zwracanego przez metodę /public-key-certificates wyodrębnić klucz publiczny?
Bo coś podpowiedzi AI dla openSSL nie zwracają właściciwie żadnego wyniku

PP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Hej, podobnie jak wy męczę się z ksefem. Piszę w JavaScript, więc mnie biblioteki nie obejmują i muszę implementować wszystko sam.

Mam wygenerowanych kilka tokenów testowych z wersji 1.0 i chcę zachować autoryzację poprzez metodę tokenem KSEF.
Niestetyt tym razem coś nie działa i strona zwraca mi odpowiedź, że enkrypcja jest zła, mimo, że w wersji 1.0 działała świetnie.
Nieco zmieniłem skrypt, żeby pobierać klucz publiczny DER z certyfikatu (wcześniej używałem PEM) i nim enkryptować token.
Co robię tutaj źle? Bo wydaje mi się, że skoro poprzednia implementacja działała, to i ta powinna, ale tak nie jest.

Skrypt do generowania encryptedToken w JS:

Kopiuj
// JavaScript

import * as crypto from 'crypto';

/////////////////////////////////////////////// input data

const ksefCertificates = [
    {
        "certificate": "MIIGWDCCBECgAwIBAgIQGmXqNRg5ye1JMZDOQ7HNCTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJQTDEhMB8GA1UECgwYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMRwwGgYDVQQDDBNDZXJ0dW0gU01JTUUgUlNBIENBMB4XDTI1MDkyOTA2MDMxOVoXDTI3MDkyOTA2MDMxOFowgb4xGTAXBgNVBGETEFZBVFBMLTUyNjAyNTAyNzQxCzAJBgNVBAYTAlBMMRQwEgYDVQQIDAttYXpvd2llY2tpZTERMA8GA1UEBwwIV2Fyc3phd2ExHzAdBgNVBAoMFk1pbmlzdGVyc3R3byBGaW5hbnPDs3cxHzAdBgNVBAMMFk1pbmlzdGVyc3R3byBGaW5hbnPDs3cxKTAnBgkqhkiG9w0BCQEWGmtvbnN1bHRhY2plLmtzZWZAbWYuZ292LnBsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxsyeiYiWB2+KFxEpQGoNQa6W8Pc4kWGl8V+sBMdW3Fqh0lhKiqKfpH5RWLDmZ30EzkKJ5+IdaWYFoijhYxDBIBhINVQKlBZvEVd6CfPJUJypa94eRO5cc6IPNI35aMhfKP/Kc4A/OiT2J4nyCz6BV98xOXCAlyDPD73XM6O2ormL6gUb673zvjOIakf39tAPPVgWIDuX7GDZYGebN7LXoGvjPo5YDqC2KN51ofLbO+n74iei5OaGN94Ap52vI7uzK2g/hQslOd0Avl2U1kwRnnF0yzwbDzRrHqPCHUYxVp5nHdo+jHe1CNoa6gt0m6pn1StYcitSXKg2hTNjnes6TQIDAQABo4IBvzCCAbswDAYDVR0TAQH/BAIwADBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vY3NtaW1lcnNhY2EuY3JsLmNlcnR1bS5wbC9jc21pbWVyc2FjYS5jcmwwgYMGCCsGAQUFBwEBBHcwdTAuBggrBgEFBQcwAYYiaHR0cDovL2NzbWltZXJzYWNhLm9jc3AtY2VydHVtLmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NzbWltZXJzYWNhLnJlcG9zaXRvcnkuY2VydHVtLnBsL2NzbWltZXJzYWNhLmNlcjAfBgNVHSMEGDAWgBRm+8MPvvS/4JzJq03eRxm9wMqmaDAdBgNVHQ4EFgQUyDshAguoI0vLLGyA3aRgapjC4JEwTAYDVR0gBEUwQzAJBgdngQwBBQICMDYGCyqEaAGG9ncCZAMBMCcwJQYIKwYBBQUHAgEWGWh0dHBzOi8vd3d3LmNlcnR1bS5wbC9DUFMwHQYDVR0lBBYwFAYIKwYBBQUHAwQGCCsGAQUFBwMCMA4GA1UdDwEB/wQEAwIE8DAlBgNVHREEHjAcgRprb25zdWx0YWNqZS5rc2VmQG1mLmdvdi5wbDANBgkqhkiG9w0BAQsFAAOCAgEAxX7ltOEd6+RbztKIgfmpfxsgmg3TXdmwQucy+tw6aqBNF7Xk22PhVcWVgHKLq6xkaCTCfHbfpl6iGWsWkM5re2FltEF8QuLJbI7n6sC/T/pG+aIj4TWgaiKO79dST4kda9GxMEuKxZDkC7OXg4optdxB8Kg3ctFPqzLdnH71lL8I+Wo+KIwGe2h0tDMo39+UQC2XOd5l//1abiuO8ZMal+NEbz8WBeS4saH3qPcYmB8+4hV16kU4csNcyrR6PBKO7vkUXI0Lqh0ioEyFJyhxmx3ZPN4VUQFyQZ8l+GmbRFWBCHIhB5dfWmGazE1gWQmVfpYsmuot7sSI2Uw1pBLPsniA9sBQfIB1tPGmdfTb/Cpkj1k/owYN6G+08dTqG7v8O7R+skSgcem4O9Ftr+8RDTmhLrPwpx9RXf881bmm47aw1BTPzzqDsFGmcNF2Hjb8OpJoJ3ZQQ98ep+yJUb0Ub9trfQNRVKfWltrTDl4Uc+vlWYegocIhJdZ5ZwpeJIZMUHIUXarsuC/hyHZb5nDZSp/mf8a1Qxw9SeYb5TG6AAacGfnVPK2YXA6mu4thhszUBxc6/WKEovN8LfYhZzppf9bgp1Gs7TJIzPUJbsAD2tZg2VssAsuJ17u10vTBEZnYwRZXsfMnMJJMC1wsrA5Xmp3C+oN84Z8l7viL5l1VxbU=",
        "validFrom": "2025-09-29T06:03:19+00:00",
        "validTo": "2027-09-29T06:03:18+00:00",
        "usage": [
            "KsefTokenEncryption"
        ]
    },
    {
        "certificate": "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",
        "validFrom": "2025-09-29T06:17:45+00:00",
        "validTo": "2027-09-29T06:17:44+00:00",
        "usage": [
            "SymmetricKeyEncryption"
        ]
    }
];

const customerKsefToken = "SOME_KSEF_TOKEN";

const challenge = {
    "challenge": "20251002-CR-1AAD8D3000-B44D0C38FF-B1",
    "timestamp": "2025-10-02T09:14:42.2598361+00:00"
}

//////////////////////////////////////////////////////// utils
export function getPublicKeyPemFromCertificate(certificateBase64) {
    const derBuffer = Buffer.from(certificateBase64, 'base64');
    const cert = new crypto.X509Certificate(derBuffer);
    return cert.publicKey.export({ type: 'spki', format: 'pem' });
};

export function encryptToken(messageToEncrypt, publicKeyPem) {
    const messageBuffer = Buffer.from(messageToEncrypt, 'utf8');

    const publicKey = crypto.createPublicKey({
        key: publicKeyPem,
        format: 'pem',
        type: 'spki'
    });

    const encryptedToken = crypto.publicEncrypt({
        key: publicKey,
        padding: crypto.constants.RSA_PKCS1_PADDING
    }, messageBuffer);

    return encryptedToken.toString('base64');
}

////////////////////////////////////////////////// logic 
const publicKeyPem = getPublicKeyPemFromCertificate(ksefCertificates.find(cert => cert.usage.includes('KsefTokenEncryption')).certificate);
const message = `${customerKsefToken}|${new Date(challenge.timestamp).getTime()}`;

const encryptedToken = encryptToken(message, publicKeyPem);

console.error(encryptedToken);

z endpointu {{ksef_api_url}}/auth/ksef-token dostaję odpowiedź (PRZYKŁAD)

Kopiuj
{
    "referenceNumber": "20253302-EU-1D4DEEB000-00565FF031-C7",
    "authenticationToken": {
        "token": "sadfsfasdfa.sdfasdfasdfasdf.asdfdsa",
        "validUntil": "2025-10-02T09:17:04.8575039+00:00"
    }
}

A potem, gdy sprawdzam status uwierzytelnienia, dostaję odpowiedź z endpointu https://ksef-test.mf.gov.pl/api/v2/auth/{referenceNumber}:

Kopiuj
{
    "startDate": "2025-10-02T08:32:04.8366577+00:00",
    "authenticationMethod": "Token",
    "status": {
        "code": 450,
        "description": "Uwierzytelnianie zakończone niepowodzeniem z powodu błędnego tokenu",
        "details": [
            "Invalid token encryption."
        ]
    }
}

Poprzednio enkrypcja działała, więc zastanawiam się co się zmieniło i jak to naprawić, bo teraz już nie działa.

T2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
0

Cześć

Męczę się z inicjalizacja sesji KSeF i wywala mi błąd: {"success":false,"status":404,"response":""}

Challenge działa poprawnie

Certyfikat wygenerowany:

Kopiuj
[ req ]
default_bits        = 2048
default_keyfile     = private.key
distinguished_name  = req_distinguished_name
prompt              = no
oid_section         = custom_oids

[ custom_oids ]
organizationIdentifier = 2.5.4.97

[ req_distinguished_name ]
countryName              = PL
organizationName         = FIRMA
commonName               = FIRMA
organizationIdentifier   = VATPL-88888888

Może ktoś ma pomysł co jest złe:

Kopiuj
public $nip;
    public $certPath;
    public $keyPath;
    public $challengeUrl;
    public $initSignedUrl;

    public function __construct($config = [])
    {
        parent::__construct($config);

        $this->nip = '88888888';
        $this->certPath = Yii::getAlias('/certs/certificate.pem');
        $this->keyPath = Yii::getAlias('/certs/private.key');
        $this->challengeUrl = 'https://ksef-test.mf.gov.pl/api/v2/auth/challenge';
        $this->initSignedUrl = 'https://ksef-test.mf.gov.pl/api/v2/online/Session/InitSigned';
    }

    /**
     * Pobranie challenge od KSeF
     */
    public function getChallenge()
    {
        $timestamp = gmdate('Y-m-d\TH:i:s\Z');
        $challenge = uniqid('CHL-');

        $signedData = [
            'contextIdentifier' => [
                'type' => 'onip',
                'identifier' => $this->nip,
            ],
            'timestamp' => $timestamp,
            'challenge' => $challenge,
        ];

        $signedDataJson = json_encode($signedData, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

        // Podpisanie JSON
        $privateKey = openssl_pkey_get_private(file_get_contents($this->keyPath));
        if (!$privateKey) {
            return ['success' => false, 'message' => 'Nie można załadować klucza prywatnego'];
        }

        if (!openssl_sign($signedDataJson, $signature, $privateKey, OPENSSL_ALGO_SHA256)) {
            openssl_free_key($privateKey);
            return ['success' => false, 'message' => 'Nie udało się podpisać danych'];
        }

        openssl_free_key($privateKey);

        $requestBody = [
            'signedData' => $signedDataJson,
            'signature' => base64_encode($signature),
            'certificate' => base64_encode(file_get_contents($this->certPath)),
        ];

        return $this->sendRequest($requestBody, $this->challengeUrl);
    }

    /**
     * Inicjalizacja sesji KSeF (InitSigned) – pobranie sessionToken
     */
    public function initSession()
    {
        $challengeResponse = $this->getChallenge();

        if (!isset($challengeResponse['challenge'])) {
            return ['success' => false, 'message' => 'Nie udało się pobrać challenge', 'challengeResponse' => $challengeResponse];
        }

        // JSON do wysłania do InitSigned (tylko jedno json_encode)
        $signedDataForRequest = json_encode($challengeResponse, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

        // Podpisanie JSON
        $privateKey = openssl_pkey_get_private(file_get_contents($this->keyPath));
        if (!$privateKey) {
            return ['success' => false, 'message' => 'Nie można załadować klucza prywatnego'];
        }

        if (!openssl_sign($signedDataForRequest, $signature, $privateKey, OPENSSL_ALGO_SHA256)) {
            openssl_free_key($privateKey);
            return ['success' => false, 'message' => 'Nie udało się podpisać danych'];
        }

        openssl_free_key($privateKey);

        $requestBody = [
            'signedData' => $signedDataForRequest,
            'signature' => base64_encode($signature),
            'certificate' => base64_encode(file_get_contents($this->certPath)),
        ];

        $response = $this->sendRequest($requestBody, $this->initSignedUrl);

        // Zapisz sessionToken w sesji Yii2
        if (isset($response['sessionToken'])) {
            Yii::$app->session->set('ksef_token', $response['sessionToken']);
        }

        return $response;
    }

    /**
     * Wysyłka requestu do KSeF
     */
    protected function sendRequest($data, $url)
    {
        $ch = curl_init($url);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
            CURLOPT_HTTPHEADER => [
                'Content-Type: application/json',
                'Accept: application/json',
            ],
        ]);

        $response = curl_exec($ch);
        $error = curl_error($ch);
        $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($error) {
            return ['success' => false, 'message' => 'CURL error: ' . $error];
        }

        $decoded = json_decode($response, true);

        if ($statusCode !== 200) {
            return [
                'success' => false,
                'status' => $statusCode,
                'response' => $decoded ?: $response,
            ];
        }

        return $decoded;
    }
N1ebieski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 27
0

Kolejny dzień, kolejne problemy. Czy ktoś wie jak przetestować autoryzację przez profil zaufany? W v1 robiłem to w środowisku Demo na swój firmowy NIP, a tutaj Demo nie działa.

Zarejestrowałem konto testowe na swój NIP przez > https://ksef-test.mf.gov.pl/docs/v2/index.html#tag/Dane-testowe/paths/~1api~1v2~1testdata~1person/post przy czym oni tu wymagają też podania numeru Pesel, a tego z oczywistych względów nie podam własnego, więc dałem wymyślony.

Ale nadal próba autoryzacji XMLem podpisanym profilem zaufanym zwraca: "Uwierzytelnianie zakończone niepowodzeniem" czyli "Brak przypisanych uprawnień" wg ich dokumentacji.

JR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Wysłałe FV i odebrałem do niej UPO. Na drugim chcę odebrać, i tu problem za każdym razem pobieranie metadanych że nie ma fv.'{"subjectType":"Subject2","dateRange":{"dateType":"Issue","from":"2025-09-30T22:00:00.000Z","to":"2025-10-01T22:00:00.000Z"}}'
Tylko ciekawostka bo zakres dat podaje 01-10-2025 do 02-10-2025.
Coś może wewnątrz jsona zamieniać?

CZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Czy ktoś z Was korzysta przy integracji z KSEF z Javy i pakietu Bouncy Castle ? Mam problem taki, że próbowałem już dziesiątki certyfikatów (w tym generowanych z PowerShell'a, które rzekomo działają na 100%, jak pokazuje przykład powyżej) i za każdym razem, gdy próbuję wykonać AuthTokenRequest to dostaję błąd 9105 (Nieprawidłowa treść podpisu). Korzystam z BouncyCastle 1.76. Może to ustrojstwo trzeba jakoś inaczej wysterować ?

Poniżej potraktowany PrettyPrint'em plik XML, który korzysta z certyfikatu wygenerowanego w Java:

Kopiuj
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<AuthTokenRequest xmlns="http://ksef.mf.gov.pl/auth/token/2.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<Challenge>20251002-CR-24A114E000-4B1D329D64-DB</Challenge>
	<ContextIdentifier>
		<Nip>1070001057</Nip>
	</ContextIdentifier>
	<SubjectIdentifierType>certificateSubject</SubjectIdentifierType>
	<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="id-0c77f3e8994095f54e47e547c16c170b">
		<ds:SignedInfo>
			<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
			<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
			<ds:Reference Id="r-id-0c77f3e8994095f54e47e547c16c170b-1" URI="">
				<ds:Transforms>
					<ds:Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2">
						<dsig-filter2:XPath xmlns:dsig-filter2="http://www.w3.org/2002/06/xmldsig-filter2" Filter="subtract">/descendant::ds:Signature</dsig-filter2:XPath>
					</ds:Transform>
					<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
				</ds:Transforms>
				<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
				<ds:DigestValue>p/slBiwp3SiKafvdKz89Z14JtTYOcY6Y6Va6RHQ6IYs=</ds:DigestValue>
			</ds:Reference>
			<ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#xades-id-0c77f3e8994095f54e47e547c16c170b">
				<ds:Transforms>
					<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
				</ds:Transforms>
				<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
				<ds:DigestValue>TuTVI7Mq6enUDajwF1r1BIfbRbfeiopWDIfex5cgYSc=&#13;
</ds:DigestValue>
			</ds:Reference>
		</ds:SignedInfo>
		<ds:SignatureValue Id="value-id-0c77f3e8994095f54e47e547c16c170b">FTiVTREostcVevijxiMcskio/wXOUyf2VZlu6xYPyin5pK/BbJ8b//0kVfKeQ6zWN1SfkNwoLq9X&#13;
zhc4UNW3F8o/oMo38xH1PTs05+ZySBtUrfhK5f0kE2tovJN6llCdKZ/8L7oRc9WjeskyElE+n1fG&#13;
HQ3rDoIezwHwAFRsbgyTwK5RoAB2V2x4Kry2TOszJ5Yw6Mn8WpYj+mWOcEWDPOdEKrSIE/Clzgut&#13;
XoU5rYB5eCJX7ss7AmyaCyCEpwN6IYBh0QhTlzEpHeo0cEg+Oy5UhNWOPP6+kQzdr+skPqdPTf14&#13;
AM7soAu+Yql/OMAmsPS7CHYDwjt8oqYUM3e5wg==&#13;
</ds:SignatureValue>
		<ds:KeyInfo>
			<ds:X509Data>
				<ds:X509Certificate>MIIDBjCCAe6gAwIBAgIGAZmkgi1cMA0GCSqGSIb3DQEBCwUAMEQxDDAKBgNVBAoMA05GWjEZMBcG&#13;
A1UEYQwQVkFUUEwtMTA3MDAwMTA1NzEMMAoGA1UEAwwDTkZaMQswCQYDVQQGEwJQTDAeFw0yNTEw&#13;
MDIxMDQwMThaFw0yNjEwMDIxMDQwMThaMEQxDDAKBgNVBAoMA05GWjEZMBcGA1UEYQwQVkFUUEwt&#13;
MTA3MDAwMTA1NzEMMAoGA1UEAwwDTkZaMQswCQYDVQQGEwJQTDCCASIwDQYJKoZIhvcNAQEBBQAD&#13;
ggEPADCCAQoCggEBAJXQ+0j8YFs5GJC13JTd6WsDxo5ORyU5fu2v1YyyLrkH+XeN2LcZCB9yHwAL&#13;
pCVKZlKVsULrpdqdczQ5lIabY0QFXLTvRU5Y8AtTVQvCugXyOPGLka/mmRwjp9JL/4O5BpPQ/Cmp&#13;
C8nOsjs/pgSoI8ze8JnphwxWhruBXIbo6JcTnnm3hogs3PmKUqR/iRjy9g+/ioeIRxXXfR6uSgBo&#13;
nCy7VnvrSXTgQ4O1j3ckjeqsNXDqE9IJOYQwp/tyFJRO4DfhIcksWXrSxXkQ6Y4WIKPZSEwXuhJ/&#13;
jMMU2UZO2pUtaD0lm9tfRcvlTnfXAemK0YFlyszdgKSjBgR2Foizz7sCAwEAATANBgkqhkiG9w0B&#13;
AQsFAAOCAQEATA6qtK6UmYUBcBRURsdY9HxHCKvK6JlhwNOaFBpHaEKzHuoD7etyy2hJyMi61w23&#13;
cjcbvXK521BX/3kbnF4TuHYO/mTGxGf9UaBaz3aW8OARsHbvXAF9DiIedNCl91iEOevXZdDqcTLm&#13;
Yb/9uewDTIP0W0oFa1gqskeMiTrd9GRtq+i3Irr+RCuEm5P7FCEumc5QzsULB7WkCSrlReEvFXAa&#13;
DVbEdxilFdjWnfscGksbwC+O+hJvhB0No/jvqyh4g4tUA66fEzuAYViy8N/kyOFCkK7xP4MBVNIb&#13;
5P9GAYpMCSyubHEdunbsrapLK9q8KoJO1yC4EkpVm+AsQFXjyg==&#13;
</ds:X509Certificate>
			</ds:X509Data>
		</ds:KeyInfo>
		<ds:Object>
			<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#id-0c77f3e8994095f54e47e547c16c170b">
				<xades:SignedProperties Id="xades-id-0c77f3e8994095f54e47e547c16c170b">
					<xades:SignedSignatureProperties>
						<xades:SigningTime>2025-10-02T10:40:22Z</xades:SigningTime>
						<xades:SigningCertificate>
							<xades:Cert>
								<xades:CertDigest>
									<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
									<ds:DigestValue>kRfWsbnT89+Y27ph7CcEPP3+hlgNM8BTj47De1t1bdg=&#13;
</ds:DigestValue>
								</xades:CertDigest>
								<xades:IssuerSerial>
									<ds:X509IssuerName>C=PL,CN=NFZ,2.5.4.97=#0c10564154504c2d31303730303031303537,O=NFZ</ds:X509IssuerName>
									<ds:X509SerialNumber>1759401618780</ds:X509SerialNumber>
								</xades:IssuerSerial>
							</xades:Cert>
						</xades:SigningCertificate>
					</xades:SignedSignatureProperties>
					<xades:SignedDataObjectProperties>
						<xades:DataObjectFormat ObjectReference="#r-id-0c77f3e8994095f54e47e547c16c170b-1">
							<xades:MimeType>text/xml</xades:MimeType>
						</xades:DataObjectFormat>
					</xades:SignedDataObjectProperties>
				</xades:SignedProperties>
			</xades:QualifyingProperties>
		</ds:Object>
	</ds:Signature>
</AuthTokenRequest>

Jakieś sugestie ?

S1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0
Kusterek napisał(a):

Czy ktoś podpowie jak z certyfikatu klucz publicznego zwracanego przez metodę /public-key-certificates wyodrębnić klucz publiczny?
Bo coś podpowiedzi AI dla openSSL nie zwracają właściciwie żadnego wyniku

Kopiuj
$url = $url."api/v2/security/public-key-certificates";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
//curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
include "debug.inc";
$resp = curl_exec($curl);
curl_close($curl);

$json = $resp;
    $data = json_decode($json, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
	throw new RuntimeException('Błąd JSON: ' . json_last_error_msg());
    }

    $cert = null;
    $now  = new DateTime('now', new DateTimeZone('UTC'));

    foreach ($data as $entry) {
    if (!isset($entry['usage']) || !in_array($typ, $entry['usage'])) {
        continue;
    }

    // sprawdzamy daty ważności
    $validFrom = new DateTime($entry['validFrom']);
    $validTo   = new DateTime($entry['validTo']);

    if ($now < $validFrom || $now > $validTo) {
        // ten certyfikat jest nieważny (jeszcze lub już)
        continue;
    }

    // budujemy PEM
    $base64 = preg_replace('/\s+/', '', $entry['certificate']);
    $cert = "-----BEGIN CERTIFICATE-----\n" .
            chunk_split($base64, 64, "\n") .
            "-----END CERTIFICATE-----\n";

    break;
}

if ($cert === null) {
    throw new RuntimeException('Nie znaleziono ważnego certyfikatu KsefTokenEncryption.');
};
return $cert;
};


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

Używam Delphi
RESTResponse.JSONValue.Format(4) zwraca w treści każdy znak "/" jako parę "" i "/". Wie ktoś jak tego uniknąć?

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

Potrzebuje spojrzenia zewnętrzenego oka na moja sytuację bo od wczoraj się męcze z tymi XML-ami.
Stworzyłem certyfikat jak kolega Dzyszla:

Kopiuj
New-SelfSignedCertificate `
    -Subject "O=Test KSeF, OID.2.5.4.97=VATPL-5170359458, CN=Test KSeF, C=PL" `
    -KeyAlgorithm RSA `
    -KeyLength 2048 `
    -HashAlgorithm SHA256 `
    -KeyExportPolicy Exportable `
    -CertStoreLocation "Cert:\CurrentUser\My" `
    -NotAfter (Get-Date).AddYears(5) `
    -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13")

Podpisuje nim XML i wychodzi mi taki wynik:

Kopiuj
<?xml version="1.0" encoding="UTF-8"?>
  <AuthTokenRequest xmlns="http://ksef.mf.gov.pl/auth/token/2.0" Id="251cedd9ce8b">
    <Challenge>20251002-CR-2AD42CC000-4B19C5E963-D9</Challenge>
    <ContextIdentifier>
      <Nip>5170359458</Nip>
    </ContextIdentifier>
    <SubjectIdentifierType>certificateSubject</SubjectIdentifierType>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Signature-1738818866">
      <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
        <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
        <ds:Reference>
          <ds:Transforms>
            <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
          </ds:Transforms>
          <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
          <ds:DigestValue>o+j++UcCntc16YCl1qV18xTLuIYahXEKbi0HWDRheE4=</ds:DigestValue>
        </ds:Reference>
        <ds:Reference URI="#SignedProperties-5516855610">
          <ds:Transforms/>
          <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
          <ds:DigestValue>47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=</ds:DigestValue>
        </ds:Reference>
      </ds:SignedInfo>
      <ds:SignatureValue>S1758cvAEfwac416pY1ZcyumcfzrXPNHQom5pahch9ed/qn+3O2cfcPX9spUa2a7xlzMUOa7bemw2am+NwSffRj8s9mjFQ5tt5IGRDVu14r9DNrsSqLzBLR0bwxy54seY7l9vVASe2GT6f37AsWAIEJd1tHtdNkXNeNcL0388j2Ov5xtxg1VoeeSgbV8gMITCvH29HQVeN5JUH6oonmNYSzTYUu9oafwcfJvLLIGmO5Q4et1eu3Bm2diC8ekeL3J8Id5t1zA0NeB30BB6v5MXpp0SM5+FvONLLJa45EG5W6nt4CJfyEgV1UbN2xNe31g0jDe4ED1NRbgzpBseSwYMA==</ds:SignatureValue>
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>MIIDfDCCAmSgAwIBAgIQGAi1MUczDrJLxVeJOYYMYzANBgkqhkiG9w0BAQsFADBQMRkwFwYDVQRhDBBWQVRQTC01MTcwMzU5NDU4MQswCQYDVQQGEwJQTDESMBAGA1UEAwwJVGVzdCBLU2VGMRIwEAYDVQQKDAlUZXN0IEtTZUYwHhcNMjUxMDAyMTExMjI3WhcNMzAxMDAyMTEyMjI2WjBQMRkwFwYDVQRhDBBWQVRQTC01MTcwMzU5NDU4MQswCQYDVQQGEwJQTDESMBAGA1UEAwwJVGVzdCBLU2VGMRIwEAYDVQQKDAlUZXN0IEtTZUYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtJDZRPquedwIwyk5vANbgbuvfCoJXDr2BN/FzQOO8OxsL/AnCLEjplQyif8ncU/BC1MtL/NwoI7P969IoZj5i/FKaSb2JvPIvCmDjwKyYQwu+5I62zmRPwFwbsm4rUXlUxgjmq7Co5JXlasW4U1P5p6ZuDM+gUR5+i9hXjusRUXqzxKTs6Bq6fGx61u8XieFBiLaketJtXzgLWBjPVdrG5G91L33uAlF/ytmGA9qkM7dv7A/XsXzTnyXa6MjG79Fzq3qsItVRLvpKqLloBQQVKovwulV29ex4C4uK/Yip1mhqRcrNFrotxVoWI026UftMfNMWVPgC65G1YBd6QE31AgMBAAGjUjBQMA4GA1UdDwEB/wQEAwIFoDAfBgNVHSUEGDAWBggrBgEFBQcDAwYKKwYBBAGCNwoDDTAdBgNVHQ4EFgQUKuEJT/hnAaPWP8tB0bO0AA1zUCkwDQYJKoZIhvcNAQELBQADggEBAATQEPzx8uXIGB+r4/dS3SeEd9/jv67jqL+RXNIqFAtMTAII/YWcI+8hvQJMLFA5fPxJiiQCRXtJEAq82ZbA5/anYyGxt5TAjP2PdRImlD4/66Y5oVSLrr9uUIz8zAikq9BZBbAsD0d3iF8b9Q5xLYaELda7ktv0vNBNUUKD8cQ5vc08YfdjpZai9xScbbdY9A8v4w57XUOti8ybcDVrCQYf0DEzLiuTNiGgyJsmSUKLU8vOqUZb/ornYL81wCC9R8pjz/vqXcOwpcCjcGQ/g89HsJyuVmRxxxr1DSWsBnoAIWu1YnjqOlABU9tQGMKiYFGI9MegNyctjeoX1/l/TkU=</ds:X509Certificate>
          <ds:X509IssuerSerial>
            <ds:X509IssuerName>O=Test KSeF, 2.5.4.97=#0C10564154504C2D35313730333539343538, CN=Test KSeF, C=PL</ds:X509IssuerName>
            <ds:X509SerialNumber>31946685294059644038245807586344832099</ds:X509SerialNumber>
          </ds:X509IssuerSerial>
          <ds:X509SubjectName>O=Test KSeF, 2.5.4.97=#0C10564154504C2D35313730333539343538, CN=Test KSeF, C=PL</ds:X509SubjectName>
        </ds:X509Data>
      </ds:KeyInfo>
      <ds:Object xmlns:xades="http://uri.etsi.org/01903/v1.3.2#">
        <xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#Signature-1738818866">
          <xades:SignedProperties xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="SignedProperties-5516855610">
            <xades:SignedSignatureProperties xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
              <xades:SigningCertificate xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <xades:Cert xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                  <xades:CertDigest xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                    <ds:DigestMethod xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                    <ds:DigestValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">o5HE8BdIqbDIMTO9EOeko2HyzB0=</ds:DigestValue>
                  </xades:CertDigest>
                  <xades:IssuerSerial xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                    <ds:X509IssuerName xmlns:ds="http://www.w3.org/2000/09/xmldsig#">O=Test KSeF, 2.5.4.97=#0C10564154504C2D35313730333539343538, CN=Test KSeF, C=PL</ds:X509IssuerName>
                    <ds:X509SerialNumber xmlns:ds="http://www.w3.org/2000/09/xmldsig#">31946685294059644038245807586344832099</ds:X509SerialNumber>
                  </xades:IssuerSerial>
                </xades:Cert>
              </xades:SigningCertificate>
            </xades:SignedSignatureProperties>
          </xades:SignedProperties>
        </xades:QualifyingProperties>
      </ds:Object>
    </ds:Signature>
  </AuthTokenRequest>

standardowo błąd po przesłaniu "Nieprawidłowa treść podpisu". Juz mi się w oczach mieni, co ja tu mam nie tak. Niby wszystko jest oprócz może namespace które są dodawane w głąb od rodzica ale czy to by miało znaczenie?
Próba weryfikacji xml w https://puesc.gov.pl/wer/ zwraca:
Obiekt, do którego odnosi się podpis został naruszony
Podpis dokumentu jest nieprawidłowy
Przynajmniej jeden skrót w podpisie nie zgadza się ze skrótem dokumentu
Certyfikat podpisujący nie jest zaufany
Niezaufana ścieżka certyfikacji podpisu

Może ktoś pomoże i nakieruje co mam nie tak.

KU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Wysyłka paczkami.
Czy w momencie gdy wysyłamy fakturę paczkami. tj otrzymujemy z otwierania sesji URL na ktory mamy wysyłać plik binarny oraz headers. Jakie dodatkowo nagłówki powinny być?
dodaję:
'Content-Type' 'application/octet-stream'
'x-ms-blob-type' 'BlockBlob'
'Authorization' 'Bearer <token>'

Za każdym razem dostaje komunikat:

<?xml version="1.0" encoding="utf-8" ?>
  • <error> AuthenticationFailed <message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:34b057c1-801e-0044-329a-333971000000 Time:2025-10-02T12:45:57.6431470Z</message> </error>
M4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 61
0

W końcu :)

Kopiuj
KsefXadesAuthService.php on line 345:
array:2 [▼
  "referenceNumber" => "20251002-AU-2C7C279000-6369773857-24"
  "authenticationToken" => array:2 [▼
    "token" => "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXAiOiJBdXRoZW50aWNhdGlvblRva2VuIiwiYXJuIjoiMjAyNTEwMDItQVUtMkM3QzI3OTAwMC02MzY5NzczODU3LTI0IiwiZXhwIjoxNzU5NDEyNTQ1LCJ ▶"
    "validUntil" => "2025-10-02T13:42:25.8948183+00:00"
  ]

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.