NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
maxy obr
Člen
Avatar
maxy obr:17.8.2016 12:17

Potřebuji řetězec podepsat algoritmem SHA256withRSA. Myslel jem, že se jedná prostě o jednu funkci jako například u hashe (md5 a pod). Ale asi to tak není nemůžu ani pořádně nic najít. Mohl by mi to tedy prosím někdo objasnit.

 
Odpovědět
17.8.2016 12:17
Avatar
maxy obr
Člen
Avatar
maxy obr:17.8.2016 13:15

Ještě doplním, že jde tedy o funkci v javě ale potřebuji nějakou alternativu pro PHP.

 
Nahoru Odpovědět
17.8.2016 13:15
Avatar
doMík
Člen
Avatar
doMík:18.8.2016 20:27

Nejsem javista, ale po nahlédnutí dokumentace mi to připomíná php funkci opensll_sign()

$retezec = 'tvuj retezec';
$podpis = '';
$pk = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
// ...
-----END RSA PRIVATE KEY-----
EOD;

openssl_sign($retezec, $podpis, $pk, "SHA256");

//v $podpis by nyní měl být podpis v binární formě.
//pro obvyklý výstup je potřeba ještě převést
$output = base64_encode($podpis);

nešla by použít? případně koukni ještě do dokumentace PHP tam toho bude určitě víc :)

 
Nahoru Odpovědět
18.8.2016 20:27
Avatar
maxy obr
Člen
Avatar
Odpovídá na doMík
maxy obr:19.8.2016 10:09

Díky to vypadá, že bude ono. Ale pracuji s certifikátama a podpisama poprvé a nejsem z toho úplně moudrej. Mám k tomu tento zip se souborama a nejsem si jistej kterez z nich a jak použít. (jsou jen testovací :-) ) Mám tedy otevřít soubor ca.cer jeho obsah použít jako podpis a nebo certifikát v souboru cer.pem? A $pk (doufam ze myslis private key :D ) je tedy v souboru crl.pem? a jako poslední parametr uvádíš SHA256 ale ve specifikaci je can be one of OPENSSL_PKCS1_PAD­DING, OPENSSL_SSLV23_P­ADDING, OPENSSL_PKCS1_O­AEP_PADDING, OPENSSL_NO_PADDING.
Možná to píšu celé blbě tak prosím o vysvětlení a opravu. Hodně mi to pomůže :-)

 
Nahoru Odpovědět
19.8.2016 10:09
Avatar
doMík
Člen
Avatar
doMík:19.8.2016 13:00

Private key by měl jít vytáhnout z souborů .pem ovšem jestli do těch tvých dobře koukam obsahuje pouze klíč veřejný..

Ano $pk je private key.

Ten poslední parametr "SHA256" tam musí být pokud to chceš mít SHA256 :D nejsemsi jistý co všechno se s tím dá ještě dělat jiného a jinak, ale tohle je vyzkousene že funguje :)

 
Nahoru Odpovědět
19.8.2016 13:00
Avatar
maxy obr
Člen
Avatar
Odpovídá na doMík
maxy obr:19.8.2016 13:48

Pochopil jsem tedy správně, že podpis to dole mezi -----BEGIN CERTIFICATE----- a -----END CERTIFICATE-----
pokud tu funkci použiju vypíše chybu openssl_sign() expects parameter 4 to be long tedy chybu 4. parametru ale je to divný tam asi chyba nebude, stejnou hlásí i pokud tam dám něco podle specifikace PHP, pokud ten parametr odstaním úplně chyba je supplied key param cannot be coerced into a private key. POkud tam tedy dávám správně podpis měl bych si asi prověřit ten pk co :D

 
Nahoru Odpovědět
19.8.2016 13:48
Avatar
doMík
Člen
Avatar
doMík:19.8.2016 14:43

To je certifikát samotný. Kousek nad tím máš public key a private key který potřebuješ tam nevidím.

Tak to nevím pokud to zapíšu takto

<?php
$retezec = 'tvuj retezec';
$podpis = '';
$pk = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
MIIBOQIBAAJBAMPrNeoR+OvJIDtCr8mSWXmr0SllhyeBD+qOqOeUcf1akGDOWdYJ
Wk2p92JtMM2RWVcV8+3UHxa/GsuD9f2y970CAwEAAQJAXQZ77Q5nkR1Irpq1eRKC
ZaFNiUhp6jn/4rGmRX9YuKDJKtuL5eEfzUL4NWbbYwe+oIfn6IQ7F2pC+66ygP+I
yQIhAOFNIwM32G1+6C6w+qXXE6ynOheroNwVgFOT9SQx6eC/AiEA3p0qUfuW1zN2
ZfxNVcDPb1ApMC82NcutjmuFSpmiioMCIHojHv/3nlR9n9DwEHEnD3thjJSYbjPh
VBf69cIRbQBxAiBdnydvNynm84O1vHghumcC32mTFCfuU+x32wxBpX9QVQIgBewC
ekhKtep8NFvelVEOgJMbymg+AlbYdY/cB+Da2g4=
-----END RSA PRIVATE KEY-----
EOD;

openssl_sign($retezec, $podpis, $pk, "SHA256");

echo base64_encode($podpis);

funguje to bez problémů a vypíše podpis "vJYfk6WSEqtDSZ9Gcfok­gpQPgJ0o4hlQD5AD­TC83psRPCHFEL­Zn9Bl65f8eEIaJ­luGfw91KzhgOD­piE5nRLIjg=="
Max jestli se funkčnost neliší verzí PHP...

(použitý klíč je náhodný RSA private key vygenerovaný prvním online generátorem který mi přišel pod ruku)

 
Nahoru Odpovědět
19.8.2016 14:43
Avatar
maxy obr
Člen
Avatar
maxy obr:22.8.2016 10:23

Takže raději pro jistotu. $podpis je v souboru ca.cer.pem a konkrétně

00:cd:8d:c9:1­c:79:aa:2c:14:88:c­b:b1:2f:24:36:
27:dd:07:d7:9­5:da:9f:fb:2e:37:46:6c:c­1:28:af:
41:13:a2:97:1­a:f6:20:9b:25:f8:f0:27:8­7:37:4d:
18:c5:c8:cb:e­5:ee:9b:54:45:c­0:79:76:02:b1:b0:
e5:18:d5:c2:f­1:83:59:32:10:a­e:34:5d:39:cb:cc:
81:ec:7c:93:a­8:85:58:93:18:e­e:b3:12:b7:95:3a:
7e:44:20:88:5­d:15:e1:3f:42:bc:2c:e7:3­a:03:93:
db:51:b3:d4:6­6:14:d1:81:e4:e6:77:82:b­c:e4:db:
a5:6f:b0:36:7­7:4e:f3:8b:f7:c7:3c:a2:8­7:4e:bb:
a1:2e:30:4d:6­3:ad:c2:4d:a0:5b:a1:9f:8­6:3a:51:
a3:bc:7b:bc:f­5:ce:a9:f3:10:82:89:68:d­2:36:8e:
9d:6a:0b:22:5­b:50:a1:17:86:21:30:8d:8­1:fe:1e:
80:98:e2:8f:a­d:bb:93:16:2b:c8:58:4e:6­1:b9:4e:
ca:ac:95:84:e­d:ef:4b:b2:04:6f:e8:89:d­a:85:9e:
7e:68:44:36:0­4:4b:e0:f7:b4:44:b2:65:a­4:87:e8:
49:87:13:68:8­1:ed:f8:5c:47:41:a3:0b:8­6:6b:21:
c0:98:21:e2:1­c:e3:8c:0c:27:1e:3e:d3:8­c:b4:a5:
09:b9

Co se týče toho posledního parametru, vážně vždycky vyhodí chybu co jsem psal. Pokud ho odstaním funkce funguje. Nedalo by se to jednoduše vyřešit takto?
openssl_sign($re­tezec, $podpis, $pk);
$podpis = hash('sha256'­,$podpis)
$podpis = base64_encode($pod­pis);

Editováno 22.8.2016 10:23
 
Nahoru Odpovědět
22.8.2016 10:23
Avatar
maxy obr
Člen
Avatar
Odpovídá na doMík
maxy obr:22.8.2016 10:31

Obecně je nutné aby se RSA klíč přiřazoval přímo nebo na něm nezáleží a můžu si vygenerovat jaký chci. Jediné co jsem dohledal je, že by měl mít 2048 bit.

 
Nahoru Odpovědět
22.8.2016 10:31
Avatar
maxy obr
Člen
Avatar
Odpovídá na maxy obr
maxy obr:22.8.2016 12:44

Jo a s tím SHA256 je to opravdu verzí PHP
These constants were added in 5.4.8.
OPENSSL_ALGO_RMD160, OPENSSL_ALGO_SHA224, OPENSSL_ALGO_SHA256, OPENSSL_ALGO_SHA384, OPENSSL_ALGO_SHA512

 
Nahoru Odpovědět
22.8.2016 12:44
Avatar
doMík
Člen
Avatar
doMík:22.8.2016 13:01

V případě, že chceš podepsat svůj řetězec podpis tvého souboru tě nemusí moc zajímat protože potřebuješ udělat podpis nový pro ten řetězec takže $podpis na začátku necháš prázdný a potom si z něj přečteš hotový podpis pro tvůj řetězec. :)

udělal sem malý experiment poslední parametr "SHA256" způsobuje problém u verzí PHP nižších než PHP 5.2 pokud požíváš PHP nižší než 5.2 tak pokud nemáš vážný důvod pro zachování této verze uděláš nejlíp když si ho aktualizuješ momentálně je nejnovější PHP 7,ale pokud necheš zas tak velký skok tak asi PHP 5.4 nebo PHP 5.6 to sou docela dobré verze. (o zpětnou kompatibilitu se nemusíš bát ta je téměř 100% a málo kdy na nějaký problém narazíš. třeba v PHP 7 třeba už nefungují ovladače databáze mysql_* ale ty už by se dávno neměli používat a tak. nové verze zrychlují a přidávají novou funkčnost).
co se tvého řešení týče

openssl_sign($retezec, $podpis, $pk);
 //ano skutečně funguje vyhodí ti binární podpis, ale v jaké podobě sem nenašel (možná sha1)

$podpis = hash('sha256',$podpis)
//tímto vytvoříš nedefinovatelný sha256, který má ale uplně jinou hodnotu než při použití parametru "SHA256"

$podpis = base64_encode($podpis);
//tato funkce je použitá pro převod z binárního řetězce na textový, funkce hash() už textový řetězec vrací..

Ne není nutné přiřazovat klíč. Pomocí funkce openssl_pkey_new() si můžeš na základě zadaných parametrů vygenerovat dvojici Private_KEY a Public_KEY kdykoliv potřebuješ.
může mít hodnoty 512(málo), 1024(slabší standart), 2048 a 4096.
Pokud si budeš takhle generovat nové klíče, všechny ostatní soubory pak nebudeš potřebovat. ovšem je otázka jestli to nebude vadit? Protože tvůj certifikát je ověřován a podepsán důvěryhodnou autoritou jejíž certifikát má uživatel někde nainstalovaný čímž uživateluv PC ověří pravost tvého cerifikátu a pomocí Public key který je v tvém certifikátu, který si nainstaluje ověřuje pravost tvých podpisů u souborů co mu posíláš. (jestli to nějak pochopitelně vysvětluji)
A nebo bez certifikátů musíš uživateli nějak doručit i tvůj Pubilc key protože tvůj podpis je moc hezký ale pokud nemá uživatel jak ověřit jeho pravost je celkem k ničemu.(tohle druhé je např. ten případ když si to budeš gerovat sám) :)

 
Nahoru Odpovědět
22.8.2016 13:01
Avatar
doMík
Člen
Avatar
Odpovídá na maxy obr
doMík:22.8.2016 13:02

:D než sem to všechno ozkoušel a sepsal už si si to našel sám koukám :D

 
Nahoru Odpovědět
22.8.2016 13:02
Avatar
maxy obr
Člen
Avatar
Odpovídá na doMík
maxy obr:22.8.2016 13:31

Verzi PHP bych neřešil je to komplikovanější. :D Přesunul jsem to na localhost. Pokud se parametr nevyplní opravdu to defaultně doplní sha1. Koukám, že jsem tu funkci chápal špatně. Vkládám tedy řetězec který chci podepsat, prázdnou proměnou do které se mi podpis vloží, private key (který si vygeneruji), a algoritmus. Ověřovat pravost právě musím. Proto sem z toho teď zmatenej. Jak dochází k tomu ověření, kam zmizely všechny certifikáty když nic z toho nepoužívám? :D
Edit: Private key mu posílám společně s ostatními údaji.

Editováno 22.8.2016 13:34
 
Nahoru Odpovědět
22.8.2016 13:31
Avatar
maxy obr
Člen
Avatar
Odpovídá na maxy obr
maxy obr:22.8.2016 14:45

Jinak sem docela otravnej takže pokud by si věděl o nějakém českém zdroji kde to můžu nastudovat tak mi ho prosím pošli. Já nic kloudnýho nenašel.

 
Nahoru Odpovědět
22.8.2016 14:45
Avatar
doMík
Člen
Avatar
Odpovídá na maxy obr
doMík:22.8.2016 15:15

Psal sem pokud je to možné :D

Ano přesně tak funguje. :)

Certifikát by ti byl dobrý pokud by obsahoval i private key ale ty máš "veřejný" certifikát který se dává uživatelům a skrz něj ověřují pravost tvých podpisů atd. :D a ano je možnost je opravdu vypustit a fungovat i bez něj. akorát je potřeba dávat trochu víc pozor aby vřejný klíč který nějakým způsobem předáváš uživateli nikdo nepodvrhl.
!! Private key nikomu nedávaš ten si schováš někam tajně !!

Napíšu ti jednoduchý příklad, na ověření předpokládejme, že jak klient tak server jsou v PHP a používáš certifikát (princip je většinou dost podobný všude)

<?php  /* klient */
//načtení dat ze serveru
$url = "http://www.tvujserver.com/rozhrani.php";
$url =  urlencode($url);
$nacteni = file_get_contents($url)
$data = json_decode($nacteni);

//přiřazení hodnot
$podepsanytext = $data->{'data'};
$podpis = $data->{'signature'};

//Načtení veřejného klíče z lokálně uloženého certifikátu (tohle mužeš použit to tvůj certifikát obsahuje)
$pub_key_id = openssl_pkey_get_public("file://path/to/file/ca.cer.pem");

//ověření pravosti
$ok = openssl_verify($podepsanytext, $podpis, $pub_key_id);

if($ok = 1)  { echo ("Podpis je v pořádku"); }
else if ($ok = 0)  { echo ("Podpis neodpovídá textu, pravděpodobně se jedná o podvržená data"); }
else { echo ("ověření pravsti selhalo"); }
<?php /* server */
$retezec;
//some code... & set value $retezec

$podpis = '';
$pk = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
// RSA PRIVATE KEY který musí být dvojicí s veřejným klíčem který má u sebe klient - je možné ho i načítat ze souboru ale na to máš špatné soubory
-----END RSA PRIVATE KEY-----
EOD;

openssl_sign($retezec, $podpis, $pk, "SHA256");

$output = array (
    'data' => $retezec,
    'signature' => base64_encode($podpis)
);

$json = json_encode($output);
echo $json;

:)
ono s těmi certifikáty je to bezpečnější :) a snad je to nějak srozumitelně napsané :D

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
22.8.2016 15:15
Avatar
maxy obr
Člen
Avatar
Odpovídá na doMík
maxy obr:23.8.2016 11:35

Díky moc, řekněme, že už to tak nějak chápu. :D Narazil jsem ještě na jednu věc v dokumentaci.

Certifikát i s privátním klíčem je publikován ve formátu PKCS#12/PFX, heslo 'eet', soubor
01000004.p12

Pracoval jsi někdy s tímto formátem? Jak z toho ty údaje mám dostat? :)

 
Nahoru Odpovědět
23.8.2016 11:35
Avatar
maxy obr
Člen
Avatar
Odpovídá na maxy obr
maxy obr:24.8.2016 13:21

Tak jo pomocí funkce openssl_pkcs12_r­ead() dostanu ze souborů .p12 jak PK tak certifikát. Tím se dostáváme zas o kus dál :D

 
Nahoru Odpovědět
24.8.2016 13:21
Avatar
maxy obr
Člen
Avatar
Odpovídá na doMík
maxy obr:24.8.2016 14:45

Díky moc, tohle téma je vyřešený. Ještě bych ale doplnil jednu věc co mi není jasná. Mám teď z podpisu udělat hash sha1.
Dekóduju si tedy zpět - $podpis = base64_decode($pod­pis)
zaheshuju - $podpis = sha1($podpis)
a následně mám $podpis hexadecimálně zakódovat, na to jsem si našel funkci chunk_split($pod­pis,aktuální kódování,16) Problém mám v tom, že nevím co zadat do druhého parametru. Jak zjistím jaké mám aktuální kódování? Nebo jaké má kódování řetězec po zaheshování sha1.

 
Nahoru Odpovědět
24.8.2016 14:45
Avatar
doMík
Člen
Avatar
Odpovídá na maxy obr
doMík:24.8.2016 17:04

Promin za kratší odpověď sem na telefonu aktuální kódování zpravidla odpovídá kódování souboru php, vhodným řešením je pomocí funkce mb_internal_en­coding() nastavit kódování pro používané interní "stringy" a pak budeš mít jistotu jaké kódování se uvnitř používá takže i jaké nastavit do této funkce :)

 
Nahoru Odpovědět
24.8.2016 17:04
Avatar
maxy obr
Člen
Avatar
Odpovídá na doMík
maxy obr:25.8.2016 10:32

Tohle je další věc v které mám trochu zmatek ale nejsou to 2 různé věci? Možná jsem to neměl pojmenovat jako kódování ale soustava. Potřebuji převést řetězec do 16kové soustavy a k tomu potřebuji znát aktuální soustavu.

Editováno 25.8.2016 10:33
 
Nahoru Odpovědět
25.8.2016 10:32
Avatar
maxy obr
Člen
Avatar
Odpovídá na maxy obr
maxy obr:25.8.2016 13:48

Tak ten samotnej hash SHA1 je v 16kové soustavě.

 
Nahoru Odpovědět
25.8.2016 13:48
Avatar
maxy obr
Člen
Avatar
Odpovídá na doMík
maxy obr:14.9.2016 9:54

Podařilo se mi to tak nějak dát dohromady. Momentálně volám SOAP funkci která mi vrací odpověď. Ale vypisuji to pouze takto:

$result = $client->OdeslaniTrzby($param);
print_r($result);

Asi to není úplně správné řešení, nemá se například volat nějaká funkce která se při odpovědi vrací?
Podle specifikace by se měla odpověď vracet jako XML. Pokud je to tak jak si myslím, jak zjistím kterou funkci vrací. Pokud je to jinak tak prosím o vysvětlení.
Díky :-)

 
Nahoru Odpovědět
14.9.2016 9:54
Avatar
ja13
Člen
Avatar
ja13:21.9.2016 14:26

Ahoj Maxy_obr :-)

taky začínám řešit stejný problém. Potřebuji si na svém eshopu zprovoznit záležitosti kolem eet. Nejsem úplně zběhlý v tom, co po nás chtějí s těmi certifikáty a šifrováním... :-)

Mohu Tě poprosit o nějaký funkční kód, který bych mohl použít?
Děkuji.

 
Nahoru Odpovědět
21.9.2016 14:26
Avatar
ja13
Člen
Avatar
ja13:21.9.2016 20:03

Mám tento kód a pracuji s PHP 5.2. Nevím jak mám správně zašifrovat a podepsat řetězec. Dole v kódu je generovaný PKP, který mi to píše, ale potřeboval bych z toho dostat "správný PKP" (též níže). Za jakoukoliv pomoc děkuji.

potřebuji SHA256withRSA

$cert_info = array();
if (! $cert_store = file_get_contents ( "certifikaty/01000003.p12" )) {
echo "Error: Unable to read the cert file<br />" ;
exit;
}

if ( openssl_pkcs12_read ( $cert_store , $cert_info , "eet" )) {
echo "Certificate Information<br />" ;
print_r ( $cert_info );
} else {
echo "Error: Unable to read the cert store.<br />" ;
exit;
}

// řetězec, který chceme podepsat
$retezec = 'CZ1212121218|273|/5546/RO24|0/6460/ZQ42|2016-08-05T00:30:12+02:00|34113.00';
// podpis
$podpis = '';
// podpisový klíč - privátní
$pk = $cert_info['pkey'];

// funkce, která nám vytvoří podpis
openssl_sign($retezec, $podpis, $pk, "SHA256");
$podpis = hash('SHA256',$podpis);
$podpis = base64_encode($podpis);



$binary_signature = "";
$algo = "SHA256";
openssl_sign($retezec, $binary_signature, $pk, $algo);
print(base64_encode($binary_signature) ."\n");


Generovaný PKP:
ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NQ==



echo "Správný PKP:<br />";
echo "D84gY6RlfUi8dWdhL1zn0LE0s+aqLohtIxY0y88GoG5Ak8pBEH3/Ff2aFW7H6fvRxDMKsvM/VIYtUQxoDEctVGMSU/JDf9Vd0eQwgfLm683p316Sa4BUnVrIsHzwMyYkjpn66I072G2AvOUP4X5UiIYtHTwyMVyp+N/zzay3D7Q619ylDb6puN2iIlLsu+GNSB9DvsQbiLXPH6iK0R9FpR15v2y+0Uhh8NNJKl7O8Us9jbgokrA9gze+erQbhmwTm2nn2+7JGrPDqhyhwWZNLUziGSbC99wJpkEnIs0das/4hFNE3DnLvv4MsXwWCLOUZty6t6DAijlCzQj7KFKw0g==";
 
Nahoru Odpovědět
21.9.2016 20:03
Avatar
maxy obr
Člen
Avatar
Odpovídá na ja13
maxy obr:21.9.2016 21:27

Ahoj, nemám teď moc čas se na to kouknout. Ale zarazila mě jedna věc. Tobě funguje funkce openssl_sign s parametrem SHA256 na php 5.2? Podle specifikace by to mělo být až od verze 5.4 viz http://php.net/…re-algos.php

 
Nahoru Odpovědět
21.9.2016 21:27
Avatar
ja13
Člen
Avatar
Odpovídá na maxy obr
ja13:21.9.2016 21:39

No právě, že nefunguje... :-(

Mám tam pod tím tohle:

$podpis = hash('SHA256',$podpis);

Obávám se toho, že budu muset celý systém předělat na PHP 5.4, z čehož úplně nejásám... :-(

A hledám řešení pro PHP 5.2

Chápu, že nemáš čas, ale pokud by sis cokoliv vyšetřil, moc by mi to pomohlo... :-)
Děkuji

 
Nahoru Odpovědět
21.9.2016 21:39
Avatar
maxy obr
Člen
Avatar
maxy obr:21.9.2016 22:04

Tohle jsem ale nevyřešil pouze jsem přešel na vyšší PHP. Tuhle funkci bez toho nerozjedeš a o náhradním řešení nevím.

 
Nahoru Odpovědět
21.9.2016 22:04
Avatar
ja13
Člen
Avatar
Odpovídá na maxy obr
ja13:21.9.2016 22:46

Tušil jsem, že mi to řekneš :-D no nic... už dávám dohromady přesun na PHP 5.4.. :-)

ty jsi asi také přecházel z PHP 5.2 nebo tak něco.... máš nějaké informace, na co si eventuálně dát pozor? nějaké háčky a tak... ;-)
děkuji

 
Nahoru Odpovědět
21.9.2016 22:46
Avatar
maxy obr
Člen
Avatar
maxy obr:21.9.2016 22:50

Nepřecházel :-) já to jen psal na serveru kde je 5.2 a nainstaloval jsem si localhost protože to stejně poběží úplně jinde

 
Nahoru Odpovědět
21.9.2016 22:50
Avatar
ja13
Člen
Avatar
ja13:21.9.2016 22:57

Aaaha :-D no, trochu jiná situace, ale závěr je takový, že musíme přesunout web na vyšší PHP.... předpokládám, že když to bude PHP 5.4, že už mě nic špatného ve věci EET nepotká.... :-) nebo ano?

 
Nahoru Odpovědět
21.9.2016 22:57
Avatar
maxy obr
Člen
Avatar
maxy obr:21.9.2016 23:00

No nevím sám to ještě nemám hotové :D

 
Nahoru Odpovědět
21.9.2016 23:00
Avatar
ja13
Člen
Avatar
Odpovídá na maxy obr
ja13:22.9.2016 13:11

Chápu :-)

doufám, že to nebudu muset posouvat na ještě vyšší PHP :-D ;-)

čas ukáže.. v pátek večer to budu zřejmě přesouvat a pak se pustím do dalšího...

to eet děláš pro sebe nebo pro někoho?

 
Nahoru Odpovědět
22.9.2016 13:11
Avatar
Honza Šustr
Člen
Avatar
Honza Šustr:23.9.2016 0:07

Ahoj všichni,
upravil jsem Váš kód

// funkce, která nám vytvoří podpis
openssl_sign($retezec, $podpis, $pk, "SHA256");
//    >>>>>    $podpis = hash('SHA256',$podpis);
$podpis = base64_encode($podpis);

a dostal jsem se k PKP na konci zdrojáku.
"D84gY6R....zQj7KFKw0g==
ale jestli je opravdu ten správný....
moje PHP je 5.4.6

 
Nahoru Odpovědět
23.9.2016 0:07
Avatar
Honza Šustr
Člen
Avatar
Honza Šustr:23.9.2016 9:44

Ahoj, doplnil jsem kód od výpočet BKP.
Ještě kdyby to šlo to šifrování vymyslet v delphi...
díky za nakopnutí.

<?php
$cert_info = array();
if (! $cert_store = file_get_contents ( "C:\_F\Programes\_XE8_FMX\TestKryptovani/01000003.p12" )) {
echo "Error: Unable to read the cert file<br />" ;
exit;
}

if ( openssl_pkcs12_read ( $cert_store , $cert_info , "eet" )) {
echo "Certificate Information<br />" ;
//print_r ( $cert_info );
} else {
echo "Error: Unable to read the cert store.<br />" ;
exit;
}

// řetězec, který chceme podepsat
$retezec = 'CZ1212121218|273|/5546/RO24|0/6460/ZQ42|2016-08-05T00:30:12+02:00|34113.00';
// podpis
$podpis = '';

// podpisový klíč - privátní
$pk = $cert_info['pkey'];

//**print_r ($pk);
//echo hash('SHA256',$retezec);
//$retezec = hash('SHA256',$retezec);

// funkce, která nám vytvoří podpis
openssl_sign($retezec, $rsa_text, $pk,OPENSSL_ALGO_SHA256);  // "SHA256");

echo '1.  po openssl_sign<br>';
echo $rsa_text.'<br>';

$rsa_text_base64 = base64_encode($rsa_text);

echo '2. po base64_encode  = PKP <br>';
echo $rsa_text_base64.'<br>';

$hash_sha1_base16 = sha1($rsa_text);
//$hash_sha1_base16 =  hash('SHA1',$rsa_text);  //stejný výsledek

echo '3. po SHA1  <br>';
echo $hash_sha1_base16.'<br>';

$hash_sha1_base16 =  chunk_split($hash_sha1_base16,8);

echo '4. po pomlčkách  = BKP <br>';
echo $hash_sha1_base16.'<br>';

?>

výsledky odpovídají vzorové zprávě
zatím

 
Nahoru Odpovědět
23.9.2016 9:44
Avatar
ja13
Člen
Avatar
Odpovídá na Honza Šustr
ja13:23.9.2016 15:31

Ahoj Honzo :-)

skvělý, že ses přidal... půjde nám to určitě lépe :-)
já jsem právě zjistil, že celý problém proč mi to nejde je v tom, že mám PHP 5.2 a to neumí SHA256..

Takže dneska večer přecházím na PHP 5.4 a doufám, že už pak bude vše ok... jen doufám, že nebudu muset moc věcí opravovat.... :-( uvidíme... :-)

Další věc pak bude sestavit hlavičku a SOAP obálku... ;-)

kdyby jsi něco měl, budu rád, když to poskytneš, abychom mohli pokročit (ale k tomu jsem se ještě nedostal..)
Díky moc za tvůj příspěvek!

 
Nahoru Odpovědět
23.9.2016 15:31
Avatar
maxy obr
Člen
Avatar
maxy obr:23.9.2016 17:32

Jo podepsaná SOAP header je to co bych taky potřeboval :-) Ale nemůžu pořádně ani nikde najít jak by se mělo postupovat.

 
Nahoru Odpovědět
23.9.2016 17:32
Avatar
ja13
Člen
Avatar
ja13:24.9.2016 10:21

Ahoj všichni :-)

tak včera jsme přemigrovali na PHP 5.5 ;-) tento víkend bude asi pracovní :-D

každopádně, funkce hash začala fungovat a zde je můj kód:

$cert_info = array();
//if (! $cert_store = file_get_contents ( "C:\_F\Programes\_XE8_FMX\TestKryptovani/01000003.p12" )) {
if (! $cert_store = file_get_contents ( "certifikaty/01000003.p12" )) {
echo "Error: Unable to read the cert file<br />" ;
exit;
}

if ( openssl_pkcs12_read ( $cert_store , $cert_info , "eet" )) {
echo "Certificate Information<br />" ;
print_r ( $cert_info );
} else {
echo "Error: Unable to read the cert store.<br />" ;
exit;
}


echo "<br><br>";
echo "<br><br>";
echo "<br><br>";


// řetězec, který chceme podepsat
$retezec = 'CZ1212121218|273|/5546/RO24|0/6460/ZQ42|2016-08-05T00:30:12+02:00|34113.00';
// podpis
$podpis = '';
// podpisový klíč - privátní
$pk = $cert_info['pkey'];

// funkce, která nám vytvoří podpis
openssl_sign($retezec, $podpis, $pk, OPENSSL_ALGO_SHA256);
$podpis = base64_encode($podpis);






echo "Generovaný PKP:<br />";
echo $podpis;

echo "<br><br>";
echo strlen($podpis);
echo " / správné číslo je 344 znaků";

echo "<br><br>";
echo "<br><br>";
echo "<br><br>";


echo "Správný PKP:<br />";
echo "D84gY6RlfUi8dWdhL1zn0LE0s+aqLohtIxY0y88GoG5Ak8pBEH3/Ff2aFW7H6fvRxDMKsvM/VIYtUQxoDEctVGMSU/JDf9Vd0eQwgfLm683p316Sa4BUnVrIsHzwMyYkjpn66I072G2AvOUP4X5UiIYtHTwyMVyp+N/zzay3D7Q619ylDb6puN2iIlLsu+GNSB9DvsQbiLXPH6iK0R9FpR15v2y+0Uhh8NNJKl7O8Us9jbgokrA9gze+erQbhmwTm2nn2+7JGrPDqhyhwWZNLUziGSbC99wJpkEnIs0das/4hFNE3DnLvv4MsXwWCLOUZty6t6DAijlCzQj7KFKw0g==";

echo "<br><br>";
echo strlen("D84gY6RlfUi8dWdhL1zn0LE0s+aqLohtIxY0y88GoG5Ak8pBEH3/Ff2aFW7H6fvRxDMKsvM/VIYtUQxoDEctVGMSU/JDf9Vd0eQwgfLm683p316Sa4BUnVrIsHzwMyYkjpn66I072G2AvOUP4X5UiIYtHTwyMVyp+N/zzay3D7Q619ylDb6puN2iIlLsu+GNSB9DvsQbiLXPH6iK0R9FpR15v2y+0Uhh8NNJKl7O8Us9jbgokrA9gze+erQbhmwTm2nn2+7JGrPDqhyhwWZNLUziGSbC99wJpkEnIs0das/4hFNE3DnLvv4MsXwWCLOUZty6t6DAijlCzQj7KFKw0g==");
echo " / správné číslo je 344 znaků";




echo "<br><br>";

$rsa_text = $podpis;

echo '1.  po openssl_sign<br>';
echo $rsa_text.'<br>';

$rsa_text_base64 = base64_encode($rsa_text);

echo '2. po base64_encode  = PKP <br>';
echo $rsa_text_base64.'<br>';

$hash_sha1_base16 = sha1($rsa_text);
//$hash_sha1_base16 =  hash('SHA1',$rsa_text);  //stejný výsledek

echo '3. po SHA1  <br>';
echo $hash_sha1_base16.'<br>';

$hash_sha1_base16 =  chunk_split($hash_sha1_base16,8);

echo '4. po pomlčkách  = BKP <br>';
echo $hash_sha1_base16.'<br>';


echo "<br><br> správně:<br> 8F8ABFEB-B76E7064-343A1460-6C6E6D86-B0F99C24 <br><br>";

$podpis = strtoupper(chunk_split(sha1(base64_decode($podpis)),8,"-"));

echo $podpis;
 
Nahoru Odpovědět
24.9.2016 10:21
Avatar
ja13
Člen
Avatar
Odpovídá na Honza Šustr
ja13:24.9.2016 10:22

Honzo, co jsem zkoušel ten BKP dle tvého vzoru, tak to vycházelo jinak než je ve vzorové zprávě...

můj by měl být v pořádku i s pomlčkami... :-)

 
Nahoru Odpovědět
24.9.2016 10:22
Avatar
Honza Šustr
Člen
Avatar
Honza Šustr:24.9.2016 15:19

Ahoj,
jasné nedal jsem tam pomlčky, a pak velikost "hexa písmenek", v manuálu ale není ani zmínka zda mají být malá nebo velká. Ale vzor je vzor...

 
Nahoru Odpovědět
24.9.2016 15:19
Avatar
ja13
Člen
Avatar
Odpovídá na Honza Šustr
ja13:24.9.2016 22:35

Ahoj Honzo,

tobě to BKP vyšlo 8F8ABFEB-B76E7064-343A1460-6C6E6D86-B0F99C24?

 
Nahoru Odpovědět
24.9.2016 22:35
Avatar
ja13
Člen
Avatar
ja13:24.9.2016 22:36

Vypadá to, že se již migrace na PHP 5.5 a s tím spojené opravy blíží ke konci... :-)

Pracujete již někdo na hlavičce a obálce?

 
Nahoru Odpovědět
24.9.2016 22:36
Avatar
maxy obr
Člen
Avatar
Odpovídá na ja13
maxy obr:27.9.2016 10:46

Zatím ne a nějakou dobu se k tomu nedostanu.

 
Nahoru Odpovědět
27.9.2016 10:46
Avatar
ja13
Člen
Avatar
Odpovídá na Honza Šustr
ja13:27.9.2016 14:17

Co ty Honzo, nějak jsi pokročil s hlavičkou či obálkou?

 
Nahoru Odpovědět
27.9.2016 14:17
Avatar
ja13
Člen
Avatar
ja13:4.10.2016 18:33

Rozumíte někdo prosím jak správně definovat tuto třídu - xmlseclibs, aby správně podepsala XML soubor pro eet?

 
Nahoru Odpovědět
4.10.2016 18:33
Avatar
ja13
Člen
Avatar
ja13:4.10.2016 21:43

Marně se snažím rozchodit SOAP request, který by mi vrátil XML včetně hlavičky. Nedaří se mi. Prosím o radu. Děkuji

Odkaz na kód:

http://pastebin.com/pbfiBtBD

 
Nahoru Odpovědět
4.10.2016 21:43
Avatar
maxy obr
Člen
Avatar
Odpovídá na ja13
maxy obr:18.10.2016 11:23

Snad nepíšu pozdě ale ta funkce ti nevrátí hlavičku pouze tělo. Nevím zda tam toho není víc ale určitě máš chybu u bkp tam má být base16 ne 64

Editováno 18.10.2016 11:24
 
Nahoru Odpovědět
18.10.2016 11:23
Avatar
ja13
Člen
Avatar
Odpovídá na maxy obr
ja13:18.10.2016 16:08

Nepíšeš pozdě, zatím jsem to odložil, protože nevím co dál... :-(

Ty máš funkci nebo již hotový kód, který Ti vrátí hlavičku?

 
Nahoru Odpovědět
18.10.2016 16:08
Avatar
maxy obr
Člen
Avatar
Odpovídá na ja13
maxy obr:18.10.2016 17:11

Tu hlavičku ti to nebude vracet nikdy, jde to snad jen pomocí nějakejch prográmků ale nevím já je nepoužíval. Tohle už ti ale nějaký výsledek vracet musí ne? Ještě koukám, ten var_dump co máš na konci vyhodí chybu zakomentuj ho.

Editováno 18.10.2016 17:13
 
Nahoru Odpovědět
18.10.2016 17:11
Avatar
ja13
Člen
Avatar
Odpovídá na maxy obr
ja13:18.10.2016 18:21

Nevím co máš na mysli prográmky... ;-) ale musí na to být nějaká knihovna, která to umí... nic externího...

Ty jsi to už nějak vyřešil?

 
Nahoru Odpovědět
18.10.2016 18:21
Avatar
maxy obr
Člen
Avatar
maxy obr:18.10.2016 18:36

Programy které dokáži zachytit tu komunikaci. O žádných knihovnách nevím.
Ano vyřešil ale kód poskytnout nemohu.

 
Nahoru Odpovědět
18.10.2016 18:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 50 zpráv z 50.