JPK wysyłka danych do MF w PHP, certyfikaty do podpisu plików ?

0

Witam
Potrzebuję zrealizować proces wysyłki plików JPK z fakturami do MF i mam problem z przygotowaniem w xml pliku metadanych do metody przesyłania InitUploadSigned.
Czy ktoś z was ma jakiś przykładowy kod do wygenerowania tego pliku ?
Cześć Xml metody InitUploadSigned stanowiącej opis przesyłanych plików wydaje mi się że wiem jak wygenerować, ale
nie wiem jak podpisać to cyfrowo.
W pdf na stronie http://www.mf.gov.pl/documents/764034/5134536/Specyfikacja+Interfejsów+usług+JPK+wersja+2.2.pdf
w punkcie 1.2 napisane jest, że plik metadanych musi być podpisany cyfrowo podpisem kwalifikowany ... w wersji Enveloped lub **Enveloping **
W załączniku zaznaczyłem informację, których nie jestem pewien skąd wziąć:
X509Certificate
pola w strukturze SignedProperties
i SignatureValue (jak wygenerowac)
?
I co to jest ten X509Certificate ? Czy to trzeba zakupić w jakimś centrum certyfikacji ?
Na stronie MF o JPK napisane jest też, że ministerstwo udostępnia:

JPK

"Poniżej zamieszczono certyfikat klucza publicznego w formacie tekstowym (Base64) do zaszyfrowania klucza szyfrującego wykorzystywany w środowisku testowym - „Klucz publiczny do szyfrowania.pem" (JPKMFTest-klucz publiczny do szyfrowania.pem). Dodatkowo udostępniono certyfikat - „Certyfikat ssl.zip" (test-e-dokumenty.mf.gov.pl_ssl) oraz dwa przykładowe pliki żądania w postaci XML podpisane certyfikatem niekwalifikowanym (self-signed) w formacie XAdES-BES"

Czy ten "Klucz publiczny do szyfrowania.pem" lub "certyfikat.ssl.zip" ma związek z tym polem x509Certyficate ? i jeżeli ma to jaki ?
I co to znaczy, że podpisane certyfikatem niekwalifikowanym ?
Czy jeżeli ktoś z was już przerabiał ten temat, to mógłbym poprosić o pomoc i wyjaśnienie tych zagadnień ?

Pozdrawiam
Paweł

0

żeby to podpisać musisz posiadać podpis cyfrowy. Takie coś trzeba sobie wykupić. Dostajesz pendrivea albo kartę wielkości karty bankomatowej a wraz z nimi program do podpisywania. Ty generujesz XMLa do podpisu, a podpisywaniem zajmuje się soft od dostawcy certyfikatu. Szczerze wątpię aby dało się podpisywanie zrealizować z poziomu PHP

0

Właśnie nigdy jeszcze nie miałem styczności z tematem podpisu cyfrowego i tak nie do końca to czuje.
A nie jest tak może, że po wczytaniu tego XMLa do podpisu do softu, to ten soft nie zwróci jakiegoś podpisu (ciągu znaków) i potem nie dało by się dołączyć go do tego xmla i wysłać dopiero taki XML do MF ?

Na stronie MF o JPK piszą:
że udostępniają

dwa przykładowe pliki żądania w postaci XML podpisane certyfikatem niekwalifikowanym (self-signed) w formacie XAdES-BES.

np. ten w tej wersji Enveloped (zamieszczony poniżej) i można go wysłać tu https://test-e-dokumenty.mf.gov.pl, metodą
/api/Storage/InitUploadSigned ->
https://test-e-dokumenty.mf.gov.pl/swagger/ui/index#!/Storage/Storage_InitUploadSigned.

Wtedy serwer MF odpowiada, że jest nie właściwy kod formularza

{"Message":"Nieobsługiwany kod formularza: JPK_VAT (1)","Code":150,"RequestId":"9Llmxu9SQCs="}

bo już teraz obowiązuje: JPK_VAT (2) ,
a jak zmieniam w:

 <FormCode schemaVersion="1-0" systemCode="JPK_VAT (1)">JPK_VAT</FormCode>

JPK_VAT (1) -> JPK_VAT (2)

To serwer MF odpowiada

{"Message":"Referencje w podpisie zostały negatywnie zweryfikowane. Dane prawdopodobnie zostały zmodyfikowane lub użyto podpisu zewnętrznego","Code":130,"RequestId":"QlwFwnU1od0="}

Czyli przestaje zgadzać się podpis ?
z tego co zrozumiałem to SignatureValue, ale też nie wiem jak ją do końca wygenerować ?
I jakie znaczenie ma tu ten certyfikat X509 ?
A dodatkowo tak jak już wcześniej zamieściłem cytat z MF, rozumiem ze w przypadku bramki testowej chodzi o podpis niekwalifikowany ? (czyli tu nie potrzebne jest to urządzenie ?)

Czy mógłbym CI poprosić, żebyś mi odpowiedział na te moje ciężkie dla mnie pytania ?

Pozdrawiam
Paweł

Plik metadanych wysyłany do MF:

<?xml version="1.0" encoding="UTF-8"?>
<InitUpload xmlns="http://e-dokumenty.mf.gov.pl">
    <DocumentType>JPK</DocumentType>
    <Version>01.02.01.20160617</Version>
    <EncryptionKey algorithm="RSA" encoding="Base64" mode="ECB" padding="PKCS#1">RpBLkg/Y4O+iQV01AkszhFfMSyJlUQh1JYQq623AOPgNahGema1SqB1CRW+T0Mg06n7mMkbjTldR1m7X5wIKN1qcpmLIN2vrCQ9zOsP3pmmp9qs75eTMULsr6fLKoxP5kvyRSaHVU7kdw7wXh1+Jcc97WzWUwz+4AXiH87S5nORIXErwHQngwuzYNqTg5ysBRBS1wB6aF2uR1hCnJqzjpKRhQcKajZUGuGKErnMYcQfhPP5wUgzQrG2/r9GNhQPaQnLqlwGz/2Qu3GA6zDdAjsA6OUOqBxiAr+Aw6D4TAoHNIOWJMYuS5t8B+VplzbNsCj+AOCwZwgVUma3X614T7A==</EncryptionKey>
    <DocumentList>
        <Document>
            <FormCode schemaVersion="1-0" systemCode="JPK_VAT (1)">JPK_VAT</FormCode>
            <FileName>JPK-VAT-TEST-0001.xml</FileName>
            <ContentLength>1204</ContentLength>
            <HashValue algorithm="SHA-256" encoding="Base64">aftBgKWtITHRS9vprd9BH7nsK2nVSx2tO3GEvYpaZAU=</HashValue>
            <FileSignatureList filesNumber="1">
                <Packaging>
                    <SplitZip mode="zip" type="split" />
                </Packaging>
                <Encryption>
                    <AES block="16" mode="CBC" padding="PKCS#7" size="256">
                        <IV bytes="16" encoding="Base64">MTIzNDU2Nzg5MDEyMzQ1Ng==</IV>
                    </AES>
                </Encryption>
                <FileSignature>
                    <OrdinalNumber>1</OrdinalNumber>
                    <FileName>JPK-VAT-TEST-0001.xml.zip.aes</FileName>
                    <ContentLength>800</ContentLength>
                    <HashValue algorithm="MD5" encoding="Base64">5YnivEH4gz5Wg5E8M2XwAQ==</HashValue>
                </FileSignature>
            </FileSignatureList>
        </Document>
    </DocumentList>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="id-95078f826380f6915d27e121f6a9cd56">
        <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-1" Type="" URI="">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
                        <ds:XPath>not(ancestor-or-self::ds:Signature)</ds: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>Hxu4zfNo1pVpYH4bPC8iWCHQ9cSRUAjnh9oT/+LPy/s=</ds:DigestValue>
            </ds:Reference>
            <ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#xades-id-95078f826380f6915d27e121f6a9cd56">
                <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>DxMMdtoKxR0ZxyTmKoKSeWc9OM+/OSVbVaVcCI5delA=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue Id="value-id-95078f826380f6915d27e121f6a9cd56">mvVYHNIt34mpSbpoW6kFWtdbEq2l5BDwesbyy6WN6v/r+qQWRG1KrMqa32XYaKDC2odtPtydCJ6ShI2Mq+oG/0TYNLWNtxZf1uWIa7xjv9F3CofwEVnHfNxoIFTnEElQGeYQ4dxAXZ2ZVD3TCf3ZR7Wqd4HGABEOb3bR8+NwIC+NgGr6ORIXRDcSaQ0GdBPhuA5ekFQEXn1ps5LCPC6C9Gn842IsGXWToXxx/YOR9VVMBuL5yN4jFK4dyZNObKrtS4qPvQylhiCLW9RaCW0BmlqkOjJMy8F1aMzQzxlbu/tuTbdZh/+M4JO2BDO22530ko9Hkz4R4Is1jfZjm6qksQ==</ds:SignatureValue>
        <ds:KeyInfo>
            <ds:X509Data>
                <ds:X509Certificate>MIIDnjCCAoagAwIBAgIEVyxkyDANBgkqhkiG9w0BAQUFADCBkDELMAkGA1UEBhMCUEwxFDASBgNVBAgTC21hem93aWVja2llMREwDwYDVQQHEwhXYXJzemF3YTEeMBwGA1UEChMVTWluaXN0ZXJzdHdvIEZpbmFuc293MSAwHgYDVQQLExdEZXBhcnRhbWVudCBJbmZvcm1hdHlraTEWMBQGA1UEAxMNanBrLm1mLmdvdi5wbDAeFw0xNjA1MDYwOTMyNTZaFw0yMDA1MDUwOTMyNTZaMIGQMQswCQYDVQQGEwJQTDEUMBIGA1UECBMLbWF6b3dpZWNraWUxETAPBgNVBAcTCFdhcnN6YXdhMR4wHAYDVQQKExVNaW5pc3RlcnN0d28gRmluYW5zb3cxIDAeBgNVBAsTF0RlcGFydGFtZW50IEluZm9ybWF0eWtpMRYwFAYDVQQDEw1qcGsubWYuZ292LnBsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApDhZPQCL8GGe6/rTGP3GT7kSV2tqWVh1QE0XQjoG57QLCowNiROtjzwNsx4bo3TjBjavhmpCmnOCmIIwoPBcSoZslxRyBlbFyE4u5OAGxaiB6gSoapYyfqNxqybiVpSFk8kXUhHswbGY6755Dd9/EuK+R1o8xkkriyHJL6mba1ojppEBEqb0TqxZGUkOAc5DgFmIqgBNqXlQZi2LcdIaRl5xO/vupOWF+Dc5lzV9KcPgWpDyYCJU8PLEIzei4J3HoNYsM9fy3tRAxEeds4+6S+CcOE5rq91HJw+CA2xjZ90olXpuXcxYRwf7PlMP6s4dkVaaAGcrTiPhaDVshChOXwIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQAELmvPmWik0fY6QE++OpqImT/QA4ojqXOsAkmG9QMFoKKcO7dZQm47INz8Ut0y8qKlNtvylGAVa6sQ62krtnnXJNVEnFrU9uS4eNXs4ZC2TqqC/ni8keiXJFzhm59AAgaj/a+isfZ9xXCT6hCWxuRpJJVsyWGrmDgUC5qFlJ3dlHsHdAi7ZLvvQ48EoFU/6HH/RbAsSiWzL5UV6VZi5fBq0kWr0edsgUp9yDVPcGaGPctSsvH9/3znY1WEPbnqfb8sjyMzrd1WXDVAqy2Ng7xrB4YqVFXCgce0tVFVFEOChUF1pUKQ8eFzS4WtevxBFV9kUZvMV3ul/Wj1AKp4YH32</ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
        <ds:Object>
            <xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#id-95078f826380f6915d27e121f6a9cd56">
                <xades:SignedProperties Id="xades-id-95078f826380f6915d27e121f6a9cd56">
                    <xades:SignedSignatureProperties>
                        <xades:SigningTime>2017-01-30T12:36:03Z</xades:SigningTime>
                        <xades:SigningCertificate>
                            <xades:Cert>
                                <xades:CertDigest>
                                    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                                    <ds:DigestValue>kPpw/0EDtMXdBvRnqCrP/fD502I=</ds:DigestValue>
                                </xades:CertDigest>
                                <xades:IssuerSerial>
                                    <ds:X509IssuerName>CN=jpk.mf.gov.pl,OU=Departament Informatyki,O=Ministerstwo Finansow,L=Warszawa,ST=mazowieckie,C=PL</ds:X509IssuerName>
                                    <ds:X509SerialNumber>1462527176</ds:X509SerialNumber>
                                </xades:IssuerSerial>
                            </xades:Cert>
                        </xades:SigningCertificate>
                    </xades:SignedSignatureProperties>
                    <xades:SignedDataObjectProperties>
                        <xades:DataObjectFormat ObjectReference="#r-id-1">
                            <xades:MimeType>text/xml</xades:MimeType>
                        </xades:DataObjectFormat>
                    </xades:SignedDataObjectProperties>
                </xades:SignedProperties>
            </xades:QualifyingProperties>
        </ds:Object>
    </ds:Signature>
</InitUpload>
0
  1. bazując na dokumentacji, strony od 4 i 5 masz wygenerować plik z metadanymi, który wygląda np. tak
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<InitUpload xmlns="http://e-dokumenty.mf.gov.pl">
  <DocumentType>JPKAH</DocumentType>
  <Version>01.02.01.20160617</Version>
  <EncryptionKey algorithm="RSA" mode="ECB" padding="PKCS#1" encoding="Base64">B2wIgtcmfYdWgbDcl0DP+hFaYJY7mEpVTwV1IwwHn3noHNKC2bgfpHO3Zy0wQ4fKx6GgJj3mYnMi0cr3DaOzlUxncm0ORngjmrb4LjH9kevTgGGjbAglbPYDP5a/03hoxm8Y9K8nNDV+T365Jh+F/pMs+vKTInh0e+40sp6xm843nxY6xlSDgQA81rEHHRFkq8d2SaMXFkgUFiJrJNxxd/n9AMF7QykbzdRmhs4SZwo4kWibTJ4MqcJ2um0OpZnrqcby6r9SAFnZtmxDbFxLsT9rgc/43zfBbHXQh1Ar+ed8v3CpYiYUIKDUxir+Ix1t+31IwJj52qAUul5SMoivYw==</EncryptionKey>
  <DocumentList>
      <Document>
          <FormCode systemCode="JPK_VAT (2)" schemaVersion="1-0">JPK_VAT</FormCode>
          <FileName>JPK_VAT_2017_01.xml</FileName>
          <ContentLength>306110</ContentLength>
          <HashValue algorithm="SHA-256" encoding="Base64">VS4ae4+ruQbUEUCXKq9MbtRj0YMZra7iEpv6xA1mHqY=</HashValue>
          <FileSignatureList filesNumber="1">
              <Packaging>
                  <SplitZip type="split" mode="zip"/>
              </Packaging>
              <Encryption>
                  <AES size="256" block="16" mode="CBC" padding="PKCS#7">
                      <IV bytes="16" encoding="Base64">5jWM5g5+92C8dRjrrYYoRQ==</IV>
                  </AES>
              </Encryption>
              <FileSignature>
                  <OrdinalNumber>1</OrdinalNumber>
                  <FileName>JPK_VAT_2017_01.xml.000.eas</FileName>
                  <ContentLength>21456</ContentLength>
                  <HashValue algorithm="MD5" encoding="Base64">I6U8aBqABX2ixvKOTqNmHA==</HashValue>
              </FileSignature>
          </FileSignatureList>
      </Document>
  </DocumentList>
</InitUpload>

a następnie musisz go podpisać. Do tego musisz mieć certyfikat kwalifikowany, np. taki więcej np. tu.

Po podpisaniu pliku z metadanymi dostajesz coś takiego jak w swoim powyższym poście. Tego pliku już nie da się zmienić bo wtedy to co było podpisane nie zgadza się z tym co jest w pliku (ogólnie rzecz biorąc).

Nie musisz sam wykupować podpisu (chociaż 300zł to chyba nie majątek, a się przyda) - może Ci ten plik (do testów) podpisać ktoś z podpisem (np. zaprzyjaźniona księgowa). Nie ważne czy podpisywał będziesz aplikacją z podpisu czy sam napiszesz - certyfikat kwalifikowany musisz mieć aby podpisać plik.

Jak porównasz sobie plik z meta niepodpisany i podpisany to zauważysz, że niepodpisany jest częścią podpisanego. Jak nie chcesz się bawić w generowanie plików z metadanymi, podpisywanie i wysyłanie to masz darmowy program do wysyłania deklaracji od ministerstwa, który działa (przynajmniej ten nowy w wersji 2.0 :p).

Jeśli planujesz samodzielnie podpisywać pliki z metadanymi (bez korzystania z aplikacji od podpisu) to życzę Ci powodzenia - ja próbowałem to napisać w c# ale stwierdziłem, że czas jaki na to poświęcę nie jest wart srebrników, które mógłbym zarobić.

0

Dziękuje za wyjaśnienia.
Nie wiem jak jeszcze będę musiał to zrobić i dlatego chciałem się dopytać.
I jeżeli mogę, to chciałbym jeszcze pociągnąć temat, oczywiście licząc na Twoją pomoc ?

Tak zauważyłem że plik nie podpisany jest częścią podpisanego.
Bo to co wkleiłeś, czyli ten plik metadanych (metoda InitUploadSigned), to jest jakimś tam opisem plików, które będą przekazywane w następnym kroku do MF.
No i to na podstawie tego pliku powstaje ten podpis ?

I ten podpis trzeba dokleić do tego przygotowanego pliku metadanych (InitUploadSigned) jako dodatkową struktura ds:Signature, dobrze rozumiem ?
I ten podpis to jest ta wartość, którą trzeba wstawić do tego pola SignatureValue (to co widać w tym moim porzednim poście)? ale chyba nie, bo to by było za proste ?
No bo ten soft podpisu cyfrowgo to nie zwaraca chyba tej struktury ds:Signature ?

No i kolejne pytanie co wstawić w pole X509Certificate ? Bo tego to też nie bardzo jakoś moge doczytać.

Z góry dzięki za pomoc
Paweł

0
Paweł napisał(a):

Bo to co wkleiłeś, czyli ten plik metadanych (metoda InitUploadSigned), to jest jakimś tam opisem plików, które będą przekazywane w następnym kroku do MF.

dokładnie - jest tam lista plików do wysyłki.
Tu jest zaszyfrowany klucz, którego używasz do szyfrowania poszczególnych paczek. Zaszyfrowany jest kluczem publicznym z certyfikatu, który udostępnia ministerstwo

<EncryptionKey algorithm="RSA" mode="ECB" padding="PKCS#1" encoding="Base64">B2wIgtcmfYdWgbDcl0DP+hFaYJY7mEpVTwV1IwwHn3noHNKC2bgfpHO3Zy0wQ4fKx6GgJj3mYnMi0cr3DaOzlUxncm0ORngjmrb4LjH9kevTgGGjbAglbPYDP5a/03hoxm8Y9K8nNDV+T365Jh+F/pMs+vKTInh0e+40sp6xm843nxY6xlSDgQA81rEHHRFkq8d2SaMXFkgUFiJrJNxxd/n9AMF7QykbzdRmhs4SZwo4kWibTJ4MqcJ2um0OpZnrqcby6r9SAFnZtmxDbFxLsT9rgc/43zfBbHXQh1Ar+ed8v3CpYiYUIKDUxir+Ix1t+31IwJj52qAUul5SMoivYw==</EncryptionKey>

Tu jest nazwa pliku XML źródłowego, jego rozmiar, oraz skrót SHA-256 pliku zakodowany w BASE64.

          <FormCode systemCode="JPK_VAT (2)" schemaVersion="1-0">JPK_VAT</FormCode>
          <FileName>JPK_VAT_2017_01.xml</FileName>
          <ContentLength>306110</ContentLength>
          <HashValue algorithm="SHA-256" encoding="Base64">VS4ae4+ruQbUEUCXKq9MbtRj0YMZra7iEpv6xA1mHqY=</HashValue>

Potem jest lista plików wysyłanych - ilość, oraz sposób pakowania i podziału

           <FileSignatureList filesNumber="1">
              <Packaging>
                  <SplitZip type="split" mode="zip"/>
              </Packaging>

Sposób szyfrowania poszczególnych paczek

              <Encryption>
                  <AES size="256" block="16" mode="CBC" padding="PKCS#7">
                      <IV bytes="16" encoding="Base64">5jWM5g5+92C8dRjrrYYoRQ==</IV>
                  </AES>
              </Encryption>

i na koniec lista poszczególnych paczek z ich nazwą, rozmiarem oraz skrótem MD5 zakodowanym w BASE64

              <FileSignature>
                  <OrdinalNumber>1</OrdinalNumber>
                  <FileName>JPK_VAT_2017_01.xml.000.eas</FileName>
                  <ContentLength>21456</ContentLength>
                  <HashValue algorithm="MD5" encoding="Base64">I6U8aBqABX2ixvKOTqNmHA==</HashValue>
              </FileSignature>
          </FileSignatureList> 

No i to na podstawie tego pliku powstaje ten podpis ?

Tak podpis powstaje na podstawie tego pliku

I ten podpis trzeba dokleić do tego przygotowanego pliku metadanych (InitUploadSigned) jako dodatkową struktura ds:Signature, dobrze rozumiem ?
I ten podpis to jest ta wartość, którą trzeba wstawić do tego pola SignatureValue (to co widać w tym moim porzednim poście)? ale chyba nie, bo to by było za proste ?
No bo ten soft podpisu cyfrowgo to nie zwaraca chyba tej struktury ds:Signature ?

Soft od podpisu wypluwa Ci gotowy podpisany plik - nic nie trzeba z nim więcej robić. Dostajesz XML jak w Twoimpoście

No i kolejne pytanie co wstawić w pole X509Certificate ? Bo tego to też nie bardzo jakoś moge doczytać.
to uzupełnia soft do podpisu.

Ty masz wygenerować plik do podpisu, podpisać go możesz zewnętrznym programem, który dostajesz z kartą z certyfikatem (z doświadczenia program od karty X może nie zadziałać z kartą Y więc najlepiej używać tego, który zaleca dostawca karty z certyfikatem). Jeśli chciałbyś sam napisać program do podpisywania to ja spędziłem nad tym kilka dni i nie znalazłem działającego darmowego rozwiązania dla c# a płatne kosztowały tyle, że stwierdziłem, że dla 2-3 klientów to mi się nijak nie opłaca. Czas też kosztuje (ale coś się zawsze człowiek nauczy nowego :p ). Zostałem przy podpisywaniu zewnętrznym softem i tyle.

0

Wow dzięki za wyjaśnienia!!!
Naprawdę jest to przydatne,
Ale, mam jeszcze jedno pytanie tak do potwierdzenia :)
Czyli ten soft podpisujący do tego pliku metadanych z metodą ze struktura <InitUpload>...</InitUpload>
przed jakby znacznikiem zamykającym </InitUpload>
doklei strukturę ds:Signature...</ds:Signature> ?
To tak jest ?
Pozdrawiam
Paweł

0

działa to tak

  1. przygotowujesz plik XML z metadanymi paczki, który wygląda mniej więcej jak w tym moim poście
  2. w sofcie od podpisu elektronicznego podpisujesz plik z pkt. 1
  3. ten soft generuje Ci gotowy plik, który trzeba wysłać
    po podpisaniu pliku nic tam więcej nie dopisujesz. Nawet nie wolno Ci tego zrobić bo jak coś zmienisz w pliku podpisanym to potem dostaniesz błąd, że podpis nie zgadza się z zawartością.
0

Witaj
OK
Tak to rozumiem.

Tylko jeszcze chciałem dopytać w poprzednim moim poście czy ten właśnie plik:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<InitUpload xmlns="http://e-dokumenty.mf.gov.pl">
  <DocumentType>JPKAH</DocumentType>
  <Version>01.02.01.20160617</Version>
  <EncryptionKey algorithm="RSA" mode="ECB" padding="PKCS#1" encoding="Base64">B2wIgtcmfYdWgbDcl0DP+hFaYJY7mEpVTwV1IwwHn3noHNKC2bgfpHO3Zy0wQ4fKx6GgJj3mYnMi0cr3DaOzlUxncm0ORngjmrb4LjH9kevTgGGjbAglbPYDP5a/03hoxm8Y9K8nNDV+T365Jh+F/pMs+vKTInh0e+40sp6xm843nxY6xlSDgQA81rEHHRFkq8d2SaMXFkgUFiJrJNxxd/n9AMF7QykbzdRmhs4SZwo4kWibTJ4MqcJ2um0OpZnrqcby6r9SAFnZtmxDbFxLsT9rgc/43zfBbHXQh1Ar+ed8v3CpYiYUIKDUxir+Ix1t+31IwJj52qAUul5SMoivYw==</EncryptionKey>
  <DocumentList>
      <Document>
          <FormCode systemCode="JPK_VAT (2)" schemaVersion="1-0">JPK_VAT</FormCode>
          <FileName>JPK_VAT_2017_01.xml</FileName>
          <ContentLength>306110</ContentLength>
          <HashValue algorithm="SHA-256" encoding="Base64">VS4ae4+ruQbUEUCXKq9MbtRj0YMZra7iEpv6xA1mHqY=</HashValue>
          <FileSignatureList filesNumber="1">
              <Packaging>
                  <SplitZip type="split" mode="zip"/>
              </Packaging>
              <Encryption>
                  <AES size="256" block="16" mode="CBC" padding="PKCS#7">
                      <IV bytes="16" encoding="Base64">5jWM5g5+92C8dRjrrYYoRQ==</IV>
                  </AES>
              </Encryption>
              <FileSignature>
                  <OrdinalNumber>1</OrdinalNumber>
                  <FileName>JPK_VAT_2017_01.xml.000.eas</FileName>
                  <ContentLength>21456</ContentLength>
                  <HashValue algorithm="MD5" encoding="Base64">I6U8aBqABX2ixvKOTqNmHA==</HashValue>
              </FileSignature>
          </FileSignatureList>
      </Document>
  </DocumentList>
</InitUpload>

po podpisie wygląda tak ? :

 <?xml version="1.0" encoding="UTF-8"?>
<InitUpload xmlns="http://e-dokumenty.mf.gov.pl">
    <DocumentType>JPK</DocumentType>
    <Version>01.02.01.20160617</Version>
    <EncryptionKey algorithm="RSA" encoding="Base64" mode="ECB" padding="PKCS#1">RpBLkg/Y4O+iQV01AkszhFfMSyJlUQh1JYQq623AOPgNahGema1SqB1CRW+T0Mg06n7mMkbjTldR1m7X5wIKN1qcpmLIN2vrCQ9zOsP3pmmp9qs75eTMULsr6fLKoxP5kvyRSaHVU7kdw7wXh1+Jcc97WzWUwz+4AXiH87S5nORIXErwHQngwuzYNqTg5ysBRBS1wB6aF2uR1hCnJqzjpKRhQcKajZUGuGKErnMYcQfhPP5wUgzQrG2/r9GNhQPaQnLqlwGz/2Qu3GA6zDdAjsA6OUOqBxiAr+Aw6D4TAoHNIOWJMYuS5t8B+VplzbNsCj+AOCwZwgVUma3X614T7A==</EncryptionKey>
    <DocumentList>
        <Document>
            <FormCode schemaVersion="1-0" systemCode="JPK_VAT (1)">JPK_VAT</FormCode>
            <FileName>JPK-VAT-TEST-0001.xml</FileName>
            <ContentLength>1204</ContentLength>
            <HashValue algorithm="SHA-256" encoding="Base64">aftBgKWtITHRS9vprd9BH7nsK2nVSx2tO3GEvYpaZAU=</HashValue>
            <FileSignatureList filesNumber="1">
                <Packaging>
                    <SplitZip mode="zip" type="split" />
                </Packaging>
                <Encryption>
                    <AES block="16" mode="CBC" padding="PKCS#7" size="256">
                        <IV bytes="16" encoding="Base64">MTIzNDU2Nzg5MDEyMzQ1Ng==</IV>
                    </AES>
                </Encryption>
                <FileSignature>
                    <OrdinalNumber>1</OrdinalNumber>
                    <FileName>JPK-VAT-TEST-0001.xml.zip.aes</FileName>
                    <ContentLength>800</ContentLength>
                    <HashValue algorithm="MD5" encoding="Base64">5YnivEH4gz5Wg5E8M2XwAQ==</HashValue>
                </FileSignature>
            </FileSignatureList>
        </Document>
    </DocumentList>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="id-95078f826380f6915d27e121f6a9cd56">
        <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-1" Type="" URI="">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
                        <ds:XPath>not(ancestor-or-self::ds:Signature)</ds: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>Hxu4zfNo1pVpYH4bPC8iWCHQ9cSRUAjnh9oT/+LPy/s=</ds:DigestValue>
            </ds:Reference>
            <ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#xades-id-95078f826380f6915d27e121f6a9cd56">
                <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>DxMMdtoKxR0ZxyTmKoKSeWc9OM+/OSVbVaVcCI5delA=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue Id="value-id-95078f826380f6915d27e121f6a9cd56">mvVYHNIt34mpSbpoW6kFWtdbEq2l5BDwesbyy6WN6v/r+qQWRG1KrMqa32XYaKDC2odtPtydCJ6ShI2Mq+oG/0TYNLWNtxZf1uWIa7xjv9F3CofwEVnHfNxoIFTnEElQGeYQ4dxAXZ2ZVD3TCf3ZR7Wqd4HGABEOb3bR8+NwIC+NgGr6ORIXRDcSaQ0GdBPhuA5ekFQEXn1ps5LCPC6C9Gn842IsGXWToXxx/YOR9VVMBuL5yN4jFK4dyZNObKrtS4qPvQylhiCLW9RaCW0BmlqkOjJMy8F1aMzQzxlbu/tuTbdZh/+M4JO2BDO22530ko9Hkz4R4Is1jfZjm6qksQ==</ds:SignatureValue>
        <ds:KeyInfo>
            <ds:X509Data>
                <ds:X509Certificate>MIIDnjCCAoagAwIBAgIEVyxkyDANBgkqhkiG9w0BAQUFADCBkDELMAkGA1UEBhMCUEwxFDASBgNVBAgTC21hem93aWVja2llMREwDwYDVQQHEwhXYXJzemF3YTEeMBwGA1UEChMVTWluaXN0ZXJzdHdvIEZpbmFuc293MSAwHgYDVQQLExdEZXBhcnRhbWVudCBJbmZvcm1hdHlraTEWMBQGA1UEAxMNanBrLm1mLmdvdi5wbDAeFw0xNjA1MDYwOTMyNTZaFw0yMDA1MDUwOTMyNTZaMIGQMQswCQYDVQQGEwJQTDEUMBIGA1UECBMLbWF6b3dpZWNraWUxETAPBgNVBAcTCFdhcnN6YXdhMR4wHAYDVQQKExVNaW5pc3RlcnN0d28gRmluYW5zb3cxIDAeBgNVBAsTF0RlcGFydGFtZW50IEluZm9ybWF0eWtpMRYwFAYDVQQDEw1qcGsubWYuZ292LnBsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApDhZPQCL8GGe6/rTGP3GT7kSV2tqWVh1QE0XQjoG57QLCowNiROtjzwNsx4bo3TjBjavhmpCmnOCmIIwoPBcSoZslxRyBlbFyE4u5OAGxaiB6gSoapYyfqNxqybiVpSFk8kXUhHswbGY6755Dd9/EuK+R1o8xkkriyHJL6mba1ojppEBEqb0TqxZGUkOAc5DgFmIqgBNqXlQZi2LcdIaRl5xO/vupOWF+Dc5lzV9KcPgWpDyYCJU8PLEIzei4J3HoNYsM9fy3tRAxEeds4+6S+CcOE5rq91HJw+CA2xjZ90olXpuXcxYRwf7PlMP6s4dkVaaAGcrTiPhaDVshChOXwIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQAELmvPmWik0fY6QE++OpqImT/QA4ojqXOsAkmG9QMFoKKcO7dZQm47INz8Ut0y8qKlNtvylGAVa6sQ62krtnnXJNVEnFrU9uS4eNXs4ZC2TqqC/ni8keiXJFzhm59AAgaj/a+isfZ9xXCT6hCWxuRpJJVsyWGrmDgUC5qFlJ3dlHsHdAi7ZLvvQ48EoFU/6HH/RbAsSiWzL5UV6VZi5fBq0kWr0edsgUp9yDVPcGaGPctSsvH9/3znY1WEPbnqfb8sjyMzrd1WXDVAqy2Ng7xrB4YqVFXCgce0tVFVFEOChUF1pUKQ8eFzS4WtevxBFV9kUZvMV3ul/Wj1AKp4YH32</ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
        <ds:Object>
            <xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#id-95078f826380f6915d27e121f6a9cd56">
                <xades:SignedProperties Id="xades-id-95078f826380f6915d27e121f6a9cd56">
                    <xades:SignedSignatureProperties>
                        <xades:SigningTime>2017-01-30T12:36:03Z</xades:SigningTime>
                        <xades:SigningCertificate>
                            <xades:Cert>
                                <xades:CertDigest>
                                    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                                    <ds:DigestValue>kPpw/0EDtMXdBvRnqCrP/fD502I=</ds:DigestValue>
                                </xades:CertDigest>
                                <xades:IssuerSerial>
                                    <ds:X509IssuerName>CN=jpk.mf.gov.pl,OU=Departament Informatyki,O=Ministerstwo Finansow,L=Warszawa,ST=mazowieckie,C=PL</ds:X509IssuerName>
                                    <ds:X509SerialNumber>1462527176</ds:X509SerialNumber>
                                </xades:IssuerSerial>
                            </xades:Cert>
                        </xades:SigningCertificate>
                    </xades:SignedSignatureProperties>
                    <xades:SignedDataObjectProperties>
                        <xades:DataObjectFormat ObjectReference="#r-id-1">
                            <xades:MimeType>text/xml</xades:MimeType>
                        </xades:DataObjectFormat>
                    </xades:SignedDataObjectProperties>
                </xades:SignedProperties>
            </xades:QualifyingProperties>
        </ds:Object>
    </ds:Signature>
</InitUpload>

Czy właśnie to jest efekt działania tego softu ? (może już teraz dobrze to przekazałem:) )
i to ten plik się już wysyła ?

0

Inaczej - wejdź sobie na stronę http://www.mf.gov.pl/krajowa-administracja-skarbowa/dzialalnosc/jednolity-plik-kontrolny ściągnij Przykład JPK-VAT-TEST-0001.ZIP wskazany w specyfikacji.zip ( 10 KB ) i tam masz w archiwum plik InitUpload.xml to jest plik, który twój soft musi wygenerować natomiast plik enveloped.xades to jest plik, który dostaniesz po podpisaniu softem od podpisu i to jest plik, który następnie wysyłasz w InitUploadSigned

0

Witam,
To chciałem napisać w moim poprzednim poście, ale chyba źle to ująłem.
Ale ok, dzięki potwierdzasz mi to w swojej ostatniej odpowiedzi :)
Nie mogę jednak przejść weryfikacji podpisu na bramce testowej MF:
Otrzymuje odpowiedź

{"Message":"Podpis negatywnie zweryfikowany","Code":120,"RequestId":"oqX76TlL5yw="}

Tylko, że klucze i certyfikat generuje sobie taki dla siebie testowy w konsoli

openssl req -new -keyout mykey.key -out mycertreq.csr -nodes -sha1 -newkey rsa:2048
openssl x509 -req -in mycertreq.csr -signkey mykey.key -out mycertreq.crt

a pewnie tak nie mozna :) ?

i potem generuje 'signatureValue'

		$node_si = $dom->getElementsByTagName('SignedInfo')->item(0)->C14N();
		$node_si = preg_replace("/[\t\n\r]/","",$node_si);

		$privateKey = openssl_pkey_get_private('file://'."mykey.key");

		$actualDigest = null;
		openssl_sign(
			$node_si, 
			$actualDigest, 
			$privateKey, 
			'sha256WithRSAEncryption' //'sha1WithRSAEncryption'
		);
		#echo '|'.$actualDigest.'|';		
		$actualDigestEncoded = base64_encode($actualDigest);
		$signatureValue = $actualDigestEncoded;

		$get['signatureValue']=$signatureValue;
		$xml_env = $this->jpk_xml_enveloping($get);

Można skorzystać tak z tego klucza mykey.pem ?
Czy to trzeba mieć taki klucz z zakupionego certyfikatu ?
Pozdrawiam

0

http://www.mf.gov.pl/documents/764034/5134536/Specyfikacja+Interfejsów+usług+JPK+wersja+2.2.pdf strona 11 enableValidateQualifiedSignature ustaw na false i zobacz czy przejdzie. Na pewno nie dostaniesz pozytywnej weryfikacji podpisu przy własnym certyfikacie bo on nie jest kwalifikowany.

0

Witam
Próbowałem już tak zrobić, ale dostawałem to samo
{"Message":"Podpis negatywnie zweryfikowany","Code":120,"RequestId":"Ob7hwHdlGNY="}

A to zapytanie, http code i odpowiedz

https://test-e-dokumenty.mf.gov.pl/api/Storage/InitUploadSigned?enableValidateQualifiedSignature=false
http_code:400{"Message":"Podpis negatywnie zweryfikowany","Code":120,"RequestId":"Ob7hwHdlGNY="}

A w jakim celu na stronie MF przy tej bramce testowej piszą ze udostępniaja certyfikat ssl : Certyfikat ssl.zip ?
Z tego można, trzeba skorzystać ?

No i po co piszą o tych przykładach:

dwa przykładowe pliki żądania w postaci XML podpisane certyfikatem niekwalifikowanym (self-signed) w formacie XAdES-BES.

?
Pozdrawiam

0

Też utknąłem dokładnie w tym miejscu co Ty Paweł, nie wiem skąd pobrać certyfikaty. Udało Ci się rozwiązać ten problem?

0

Witam
Nie udało mi się rozwiązać problemu. Nie wiem też skąd pobrać certyfikaty. Na razie zabrałem się na sprawdzenie co może aplikacja do JPK z MF. A Tobie Daniel1992 udało się ?

0

Za pomocą tych certyfikatów a dokładniej klucza publicznego, szyfrujesz 256 bitowy klucz którego używasz do szyfrowania pliku jpk w AES256, zresztą tak jak w dokumentacji

klucz szyfrujący jest szyfrowany z wykorzystaniem algorytmu asymetrycznego RSA,
z wykorzystaniem certyfikatu klucza publicznego udostępnionego przez Ministerstwo
Finansów,

0

Bardzo dobry opis jak wygenorwać xades-bes jest tutaj: http://blog.gadawski.pl/2016/07/29/xades-bes-algorytm-zorientowany-na-php/
sam z niego korzystałem, pisząc swoje rozwiazanie.

0

Po rozmowie z Panem z MFu dowiedziałem się że nie mają czegoś takiego jak testowe certyfikaty, trzeba mieć wyrobiony certyfikat i tyle.

0

ja [CIACH!], przecież wam to od pierwszego postu tłumacz...

0

Witam. Podepnę się pod temat. Co prawda napisałem klienta w c# i działał jednak parę dni temu wracam do jpk i okazuje się, że już nie działa. Czytam dok MF i okazuje się, że od 3 kwietnia coś zmienili w Microsofcie obsługę ssl już nie działa a konkretnie dostaję najpierw kod 120 a później 412 czyli AES_DECR_ERROR. Co ciekawe wcześniejsze nrref mają cały czas 120 np. ten "33ddd33e03a1c76c0000004e7538b602" wysłany właśnie timestamp: "2017-04-03T1230.2775337+00:00". Wysłany z dnia "2017-05-29T1226.0000000+00:00" np.: "5421d96a0266ba280000004d62fa14ca" już ma błąd "Dokument nieprawidłowo zaszyfrowany". Podmieniłem cert MF i dalej to samo, mało tego piszą w dok, że nie będzie możliwa komunikacją z Azure z systemów takich ja np. XP - nie wspieranych przez MS a przecież już W7 jest nie wspierany. Coś Wiecie o tym, jakieś sugestie? Zaczynam myśleć o pośrednim kliencie właśnie w PHP tylko jak do tego podejść, nie nakażę klientom zakupu kompów na winX bo mnie wykopią i zmienią dostawcę.
Pozdrawiam Sławek.

1
nojeks napisał(a):

Witam. Podepnę się pod temat. Co prawda napisałem klienta w c# i działał jednak parę dni temu wracam do jpk i okazuje się, że już nie działa. Czytam dok MF i okazuje się, że od 3 kwietnia coś zmienili w Microsofcie obsługę ssl już nie działa a konkretnie dostaję najpierw kod 120 a później 412 czyli AES_DECR_ERROR. Co ciekawe wcześniejsze nrref mają cały czas 120 np. ten "33ddd33e03a1c76c0000004e7538b602" wysłany właśnie timestamp: "2017-04-03T1230.2775337+00:00". Wysłany z dnia "2017-05-29T1226.0000000+00:00" np.: "5421d96a0266ba280000004d62fa14ca" już ma błąd "Dokument nieprawidłowo zaszyfrowany". Podmieniłem cert MF i dalej to samo, mało tego piszą w dok, że nie będzie możliwa komunikacją z Azure z systemów takich ja np. XP - nie wspieranych przez MS a przecież już W7 jest nie wspierany. Coś Wiecie o tym, jakieś sugestie? Zaczynam myśleć o pośrednim kliencie właśnie w PHP tylko jak do tego podejść, nie nakażę klientom zakupu kompów na winX bo mnie wykopią i zmienią dostawcę.
Pozdrawiam Sławek.

Już wyjaśnione:), okazało się, że oprócz klucza MF (nazwa pliku np. "klucz-publiczny.pem") identyczną nazwę musi mieć certyfikat MF z rozszerzeniem .cer zainstalowany w systemie, nie wiem jak by to było gdyby nie był zainstalowany w magazynie certów. Masakra, w życiu bym na to nie wpadł. Pozdrawiam, może komuś się przyda.

1 użytkowników online, w tym zalogowanych: 0, gości: 1