wysyłka plików JPK w PHP

0

Tworzymy program do wysyłki plików JPK na serwer Ministerstwa.

Potrzebujemy ogarnąć temat szyfrowania i wysyłki plików JPK na serwer e-dokumenty.mf.gov.pl

  1. Przygotowanie pliku do wysyłki (pakowanie zipem, i tworzenie pliku InitUpload.xml), tak jak to pokazane tutaj na 6 stronie: https://www.finanse.mf.gov.pl/documents/766655/6120636/specyfikacja_interfejsow_uslug_JPK_wersja_2_3.pdf

  2. Inicjacja połączenia i przesłanie pliku.

Wykonywał ktoś tutaj coś takiego w php?

Niestety jest to dość niejasno opisane w dokumentacji. W jaki sposób prawidłowo zaszyfrować plik?

0

Nikt tutaj nie wykonywał wysyłki plików JPK w phpie?

0

Powoli brniemy przez temat sami, jest problem z zaszyfrowaniem stringu algorytmem asymetrycznym RSA z wykorzystaniem certyfikatu klucza publicznego od MF.

Długość klucza Key Size 256 bits / 32 bytes
Tryb szyfru Cipher Mode ECB (Electronic Codebook)
Dopełnienie Padding PKCS#1
Rozmiar bloku Block Size 256 bytes

Używamy do tego phpseclib, ale coś nie nie działa. Wygląda na to, że klucz publiczny od MF jest za długi.

Używany klucz:
https://www.finanse.mf.gov.pl/documents/766655/6120636/JPKMFTest_klucz_publiczny_do_szyfrowania.pem

Kod:

set_include_path('/home/serwer/www/phpseclib/');
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);

$privatekey = file_get_contents('klucz.pem');
$rsa->loadKey($privatekey);

$plaintext = 'test szyfrowany';

echo $ciphertext = $rsa->encrypt($plaintext);

Robił ktoś takie szyfrowanie?

0

Klucz od ministerstwa wygląda tak:

-----BEGIN CERTIFICATE-----
MIIGQjCCBSqgAwIBAgIQNW5duJ7xtvmwd5qObmTdljANBgkqhkiG9w0BAQUFADB3MQswCQYDVQQG
EwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVt
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRswGQYDVQQDExJDZXJ0dW0gTGV2ZWwgSVYgQ0EwHhcN
MTYwNjE1MDU0MTU4WhcNMTkwNjE1MDU0MTU4WjCBvjELMAkGA1UEBhMCUEwxHjAcBgNVBAoMFU1p
bmlzdGVyc3R3byBGaW5hbnNvdzEjMCEGA1UECwwaRGVwYXJ0YW1lbnQgSW5mb3JtYXR5emFjamkx
ETAPBgNVBAcMCFdhcnN6YXdhMRQwEgYDVQQIDAttYXpvd2llY2tpZTEjMCEGA1UEAwwadGVzdC1l
LWRva3VtZW50eS5tZi5nb3YucGwxHDAaBgkqhkiG9w0BCQEWDWpwa0BtZi5nb3YucGwwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6K/2lXWopQyScTXwXduIfWyk+8ZqrGLhUll1F0J7l
6gfyYx3rLzqAeFIn9tJSS8v1PKj6EQ61lEDZcLcbxsAzK3nYWHhn31Er4/9jrr02jy9TW+DH9jSN
hbeuEO7sEzv3S3wc+/vUSKAW1p5KDcykLD5gfj/79yF68NaG/p+a7rDS0au0Xuj/HMxpRzYa4p+Y
PHoPJRLCVIhcElxB6w29YRJBqjp+bhe3yhWzMzLEozP8HJKEdYRX8OmvvMgKFxDVlxMSogZlZCw2
H7b3Q89dE+Up8EGqXSHSY3N0w3S1WMcWeRI5jcjqcbBBArGPq1DOydn0wh5VqcDtotDGeM/LAgMB
AAGjggKAMIICfDAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFM1KRsoDZZDmMRAagsalHF7RUM8f
MB0GA1UdDgQWBBTnE41tuST6qUvjgrXYaE/sbbPGwjAOBgNVHQ8BAf8EBAMCBPAwYQYIKwYBBQUH
AQEEVTBTMCEGCCsGAQUFBzABhhVodHRwOi8vb2NzcC5jZXJ0dW0ucGwwLgYIKwYBBQUHMAKGImh0
dHA6Ly9yZXBvc2l0b3J5LmNlcnR1bS5wbC9sNC5jZXIwggE9BgNVHSAEggE0MIIBMDCCASwGCiqE
aAGG9ncCAgQwggEcMCUGCCsGAQUFBwIBFhlodHRwczovL3d3dy5jZXJ0dW0ucGwvQ1BTMIHyBggr
BgEFBQcCAjCB5TAgFhlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMAMCAQEagcBVc2FnZSBvZiB0
aGlzIGNlcnRpZmljYXRlIGlzIHN0cmljdGx5IHN1YmplY3RlZCB0byB0aGUgQ0VSVFVNIENlcnRp
ZmljYXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IChDUFMpIGluY29ycG9yYXRlZCBieSByZWZlcmVu
Y2UgaGVyZWluIGFuZCBpbiB0aGUgcmVwb3NpdG9yeSBhdCBodHRwczovL3d3dy5jZXJ0dW0ucGwv
cmVwb3NpdG9yeS4wHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMBEGCWCGSAGG+EIBAQQE
AwIFoDAsBgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vY3JsLmNlcnR1bS5wbC9sNC5jcmwwGAYDVR0R
BBEwD4ENanBrQG1mLmdvdi5wbDANBgkqhkiG9w0BAQUFAAOCAQEAxno58NJnSvAD3eBWI8D2dVPQ
T8Heqg+dvH1okrrBPLg6OV0E+V/KYzWqFoOAFUsmVBw/B2P17brKecwyYCrHOK0aQsvsIeaABBkx
aMhBjkFVz0R4FJtA1/l3lbVRpSAKRHyqw3P7TOzJuAG+kzNxvs0GYOAMhKvUO/ZvghJsYXM4wQ8F
LTNOyrRwdy0OuV8f5ahHU9zWH7cEiaMsnn9bIE4clkY/kTm8b2nOsoadH83YV0MrmPKRCleLE1QW
7Ytj9b+exAXLoB5D2NJqiLJD+LX8Y7CGMWGGLOPwonN9stRew5pRVPhY4j8RCLn0Cpuay3rBoOWs
9mzRTV3IiZZFbw==
-----END CERTIFICATE-----

Gdy generuje sam inny, dowolny 256,512,1024, 2048 bitowy klucz to phpseclib zwraca poprawnie wynik szyfrowania.
W momencie użycia powyższego klucza od MF dostaję blank page.

0

W momencie użycia powyższego klucza od MF dostaję blank page.

Nie obrywasz jakimś wyjątkiem?

0
Patryk27 napisał(a):

W momencie użycia powyższego klucza od MF dostaję blank page.

Nie obrywasz jakimś wyjątkiem?

Nic nie zwraca żadnych komunikatów

0

Pokaż rezultat:

var_dump($rsa->encrypt($plaintext));
0

var_dump($rsa->encrypt($plaintext));
zwraca
bool(false)


To przykładowy kod:
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();

$plaintext = 'test test';

$public_key = '-----BEGIN CERTIFICATE-----
MIIGQjCCBSqgAwIBAgIQNW5duJ7xtvmwd5qObmTdljANBgkqhkiG9w0BAQUFADB3MQswCQYDVQQG
EwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVt
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRswGQYDVQQDExJDZXJ0dW0gTGV2ZWwgSVYgQ0EwHhcN
MTYwNjE1MDU0MTU4WhcNMTkwNjE1MDU0MTU4WjCBvjELMAkGA1UEBhMCUEwxHjAcBgNVBAoMFU1p
bmlzdGVyc3R3byBGaW5hbnNvdzEjMCEGA1UECwwaRGVwYXJ0YW1lbnQgSW5mb3JtYXR5emFjamkx
ETAPBgNVBAcMCFdhcnN6YXdhMRQwEgYDVQQIDAttYXpvd2llY2tpZTEjMCEGA1UEAwwadGVzdC1l
LWRva3VtZW50eS5tZi5nb3YucGwxHDAaBgkqhkiG9w0BCQEWDWpwa0BtZi5nb3YucGwwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6K/2lXWopQyScTXwXduIfWyk+8ZqrGLhUll1F0J7l
6gfyYx3rLzqAeFIn9tJSS8v1PKj6EQ61lEDZcLcbxsAzK3nYWHhn31Er4/9jrr02jy9TW+DH9jSN
hbeuEO7sEzv3S3wc+/vUSKAW1p5KDcykLD5gfj/79yF68NaG/p+a7rDS0au0Xuj/HMxpRzYa4p+Y
PHoPJRLCVIhcElxB6w29YRJBqjp+bhe3yhWzMzLEozP8HJKEdYRX8OmvvMgKFxDVlxMSogZlZCw2
H7b3Q89dE+Up8EGqXSHSY3N0w3S1WMcWeRI5jcjqcbBBArGPq1DOydn0wh5VqcDtotDGeM/LAgMB
AAGjggKAMIICfDAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFM1KRsoDZZDmMRAagsalHF7RUM8f
MB0GA1UdDgQWBBTnE41tuST6qUvjgrXYaE/sbbPGwjAOBgNVHQ8BAf8EBAMCBPAwYQYIKwYBBQUH
AQEEVTBTMCEGCCsGAQUFBzABhhVodHRwOi8vb2NzcC5jZXJ0dW0ucGwwLgYIKwYBBQUHMAKGImh0
dHA6Ly9yZXBvc2l0b3J5LmNlcnR1bS5wbC9sNC5jZXIwggE9BgNVHSAEggE0MIIBMDCCASwGCiqE
aAGG9ncCAgQwggEcMCUGCCsGAQUFBwIBFhlodHRwczovL3d3dy5jZXJ0dW0ucGwvQ1BTMIHyBggr
BgEFBQcCAjCB5TAgFhlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMAMCAQEagcBVc2FnZSBvZiB0
aGlzIGNlcnRpZmljYXRlIGlzIHN0cmljdGx5IHN1YmplY3RlZCB0byB0aGUgQ0VSVFVNIENlcnRp
ZmljYXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IChDUFMpIGluY29ycG9yYXRlZCBieSByZWZlcmVu
Y2UgaGVyZWluIGFuZCBpbiB0aGUgcmVwb3NpdG9yeSBhdCBodHRwczovL3d3dy5jZXJ0dW0ucGwv
cmVwb3NpdG9yeS4wHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMBEGCWCGSAGG+EIBAQQE
AwIFoDAsBgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vY3JsLmNlcnR1bS5wbC9sNC5jcmwwGAYDVR0R
BBEwD4ENanBrQG1mLmdvdi5wbDANBgkqhkiG9w0BAQUFAAOCAQEAxno58NJnSvAD3eBWI8D2dVPQ
T8Heqg+dvH1okrrBPLg6OV0E+V/KYzWqFoOAFUsmVBw/B2P17brKecwyYCrHOK0aQsvsIeaABBkx
aMhBjkFVz0R4FJtA1/l3lbVRpSAKRHyqw3P7TOzJuAG+kzNxvs0GYOAMhKvUO/ZvghJsYXM4wQ8F
LTNOyrRwdy0OuV8f5ahHU9zWH7cEiaMsnn9bIE4clkY/kTm8b2nOsoadH83YV0MrmPKRCleLE1QW
7Ytj9b+exAXLoB5D2NJqiLJD+LX8Y7CGMWGGLOPwonN9stRew5pRVPhY4j8RCLn0Cpuay3rBoOWs
9mzRTV3IiZZFbw==
-----END CERTIFICATE-----';

$rsa->loadKey($public_key);
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
echo $ciphertext = $rsa->encrypt($plaintext);

var_dump($rsa->encrypt($plaintext));

0

No to najwyraźniej coś masz nie tak ;-p
Odpal xdebug'a i prześledź co się dzieje wewnątrz metody encrypt (a w zasadzie to encryptBinary).

0

Tylko że to nie jest klucz publiczny używany przez phpseclib ale certyfikat który oni udostępniają. Wystarczy że sobie to sparsujesz tak:

$data = file_get_contents('klucz.pem');
$cainfo = openssl_x509_parse($data);

var_dump($caifno);

I będziesz miał jak na dłoni co tam jest.

Tymczasem phpseclib generuje coś takiego:

$rsa = new Crypt_RSA();
extract($rsa->createKey());

var_dump($publickey, $privatekey);

i phpseclib generuje to:

-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3Ms8ex4edWbL9oUcldjqEgJ7G S62C3v7yd4tCgt9ujuINeeW/3d2RgRQWtJCHN8iwU7YEQ1QN6B8dMrZN4Qn+JtfE UWlJjoKdkpM8j4GkhkR+Dx7NhRjH/uK3m2IiAZDVGefUL2/WuBeOCKFppRAOXB7r G1I+SsOB+UYW9idk4wIDAQAB -----END PUBLIC KEY-----

-----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQC3Ms8ex4edWbL9oUcldjqEgJ7GS62C3v7yd4tCgt9ujuINeeW/ 3d2RgRQWtJCHN8iwU7YEQ1QN6B8dMrZN4Qn+JtfEUWlJjoKdkpM8j4GkhkR+Dx7N hRjH/uK3m2IiAZDVGefUL2/WuBeOCKFppRAOXB7rG1I+SsOB+UYW9idk4wIDAQAB AoGAV9JCmhW6vEK43H9I9Pt1V/m0o4i52AgAncmS98J3S6+xTBaIfe7k/ZCsSaor sraaPXUTx31jOPtylvOtky3zNJP1J1HYWYhfBZpfib8qtdRrGoZft070gNg/rBdr HOlCWg2d7yI4BnMKuz0O00fSuFWgAQjwN8i4OAauqf8IO9kCQQDmD2WZHQCa2AW4 G4QYXHL3iOH25/JwSFUERjREt8AT/qjUKO7tbo2fmClFcDaLLXTFxy93HduPLdxx vp4/uOuHAkEAy9rEVtyIsw+X7oDpOmk/35L/kSjqlyqndxU83rXircAJvVMJVoNt XSnGh4MrmWiRQbn1DDnKVSy8wNkSoZoqxQJBAMPtvPMHViqJa2V+WaN9qJPTyc3D gB/MGkuHlqAndbgRm6sEKWegTZDrv8pZZLpnPhnqJyxlC0YHIsTkOFXAoSUCQChp dgLCNVdKABSH+bRaqQ7pVUCxm8/b5Nb2ntqHtCg9qbCehXthEo0levXiSwJeeG1P MAT8b9/yvnh8j/T5WwECQBdbJ/tzYXIzpXlfesOPPuVZhUa5XhhDJOVC7IzQlQr8 RmAy7aZUgWOj16cpcOMEchdQg0ufxgme6vmgWm+CV34= -----END RSA PRIVATE KEY-----

Czyli to co udostępniają to nie to czego potrzebujesz mając na uwadze wykorzystanie phpseclib.

0

Chodzi oto że muszę zaszyfrować stringa certyfikatem (podanym poniżej) i użyć następującej specyfikacji algorytmu RSA:

  • Key Size - 256 bits / 32 bytes
  • Cipher Mode - ECB (Electronic Codebook)
  • Padding - PKCS#1
  • Block Size - 256 bytes

$string = '5e72b0e0c4b073d602a26e895888246ba51640c9d889761d08d96b303b23ff58';

$certyfikat = '-----BEGIN CERTIFICATE-----
MIIGQjCCBSqgAwIBAgIQNW5duJ7xtvmwd5qObmTdljANBgkqhkiG9w0BAQUFADB3MQswCQYDVQQG
EwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVt
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRswGQYDVQQDExJDZXJ0dW0gTGV2ZWwgSVYgQ0EwHhcN
MTYwNjE1MDU0MTU4WhcNMTkwNjE1MDU0MTU4WjCBvjELMAkGA1UEBhMCUEwxHjAcBgNVBAoMFU1p
bmlzdGVyc3R3byBGaW5hbnNvdzEjMCEGA1UECwwaRGVwYXJ0YW1lbnQgSW5mb3JtYXR5emFjamkx
ETAPBgNVBAcMCFdhcnN6YXdhMRQwEgYDVQQIDAttYXpvd2llY2tpZTEjMCEGA1UEAwwadGVzdC1l
LWRva3VtZW50eS5tZi5nb3YucGwxHDAaBgkqhkiG9w0BCQEWDWpwa0BtZi5nb3YucGwwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6K/2lXWopQyScTXwXduIfWyk+8ZqrGLhUll1F0J7l
6gfyYx3rLzqAeFIn9tJSS8v1PKj6EQ61lEDZcLcbxsAzK3nYWHhn31Er4/9jrr02jy9TW+DH9jSN
hbeuEO7sEzv3S3wc+/vUSKAW1p5KDcykLD5gfj/79yF68NaG/p+a7rDS0au0Xuj/HMxpRzYa4p+Y
PHoPJRLCVIhcElxB6w29YRJBqjp+bhe3yhWzMzLEozP8HJKEdYRX8OmvvMgKFxDVlxMSogZlZCw2
H7b3Q89dE+Up8EGqXSHSY3N0w3S1WMcWeRI5jcjqcbBBArGPq1DOydn0wh5VqcDtotDGeM/LAgMB
AAGjggKAMIICfDAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFM1KRsoDZZDmMRAagsalHF7RUM8f
MB0GA1UdDgQWBBTnE41tuST6qUvjgrXYaE/sbbPGwjAOBgNVHQ8BAf8EBAMCBPAwYQYIKwYBBQUH
AQEEVTBTMCEGCCsGAQUFBzABhhVodHRwOi8vb2NzcC5jZXJ0dW0ucGwwLgYIKwYBBQUHMAKGImh0
dHA6Ly9yZXBvc2l0b3J5LmNlcnR1bS5wbC9sNC5jZXIwggE9BgNVHSAEggE0MIIBMDCCASwGCiqE
aAGG9ncCAgQwggEcMCUGCCsGAQUFBwIBFhlodHRwczovL3d3dy5jZXJ0dW0ucGwvQ1BTMIHyBggr
BgEFBQcCAjCB5TAgFhlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMAMCAQEagcBVc2FnZSBvZiB0
aGlzIGNlcnRpZmljYXRlIGlzIHN0cmljdGx5IHN1YmplY3RlZCB0byB0aGUgQ0VSVFVNIENlcnRp
ZmljYXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IChDUFMpIGluY29ycG9yYXRlZCBieSByZWZlcmVu
Y2UgaGVyZWluIGFuZCBpbiB0aGUgcmVwb3NpdG9yeSBhdCBodHRwczovL3d3dy5jZXJ0dW0ucGwv
cmVwb3NpdG9yeS4wHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMBEGCWCGSAGG+EIBAQQE
AwIFoDAsBgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vY3JsLmNlcnR1bS5wbC9sNC5jcmwwGAYDVR0R
BBEwD4ENanBrQG1mLmdvdi5wbDANBgkqhkiG9w0BAQUFAAOCAQEAxno58NJnSvAD3eBWI8D2dVPQ
T8Heqg+dvH1okrrBPLg6OV0E+V/KYzWqFoOAFUsmVBw/B2P17brKecwyYCrHOK0aQsvsIeaABBkx
aMhBjkFVz0R4FJtA1/l3lbVRpSAKRHyqw3P7TOzJuAG+kzNxvs0GYOAMhKvUO/ZvghJsYXM4wQ8F
LTNOyrRwdy0OuV8f5ahHU9zWH7cEiaMsnn9bIE4clkY/kTm8b2nOsoadH83YV0MrmPKRCleLE1QW
7Ytj9b+exAXLoB5D2NJqiLJD+LX8Y7CGMWGGLOPwonN9stRew5pRVPhY4j8RCLn0Cpuay3rBoOWs
9mzRTV3IiZZFbw==
-----END CERTIFICATE-----';

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