OPAY / Techninė informacija / Web API / Skaitmeninis duomenų pasirašymas / Asimetrinis pasirašymas ir parašo tikrinimas

Asimetrinis pasirašymas ir parašo tikrinimas

Privataus rakto ir SSL sertifikato generavimas

Šiems  raktams  generuoti  OPAY  siūlo  naudoti  OpenSSL  programinę  įrangą
(https://www.openssl.org/).

Privatus raktas generuojamas komandinėje eilutėje įvedant komandą:

openssl genrsa -out privkey.pem 2048

Esamoje direktorijoje jums bus sugeneruotas tekstinis failas pavadinimu privkey.pem, kurio viduje rasite privatų raktą. Skaičius 2048 komandoje reiškia rakto ilgį bitais. Pagal saugumo reikalavimus taikomus šią dieną, tai trumpiausias rekomenduojamas rakto ilgis.

SSL sertifikatas generuojamas komandinėje eilutėje įvedant komandą:

openssl req -new -x509 -key privkey.pem -out cacert.pem -days 3650

Komandoje nurodytas privataus rakto failo pavadinimas (privkey.pem). Taip pat nurodytas tekstinio failo, kuris turi būti sukurtas ir į jį įrašytas SSL sertifikatas, pavadinimas (cacert.pem). Skaičius 3650 nurodo kiek dienų nuo sugeneravimo šis sertifikatas turi galioti. Pasibaigus šiam laikui reikėtų sugeneruoti naują sertifikatą ir jį pateikti OPAY. Pasibaigus sertifikato galiojimui OPAY sistema ir toliau tikrina Pardavėjo siunčiamas užklausas su pasibaigusio galiojimo sertifikatu. Sertifikato galiojimo pasibaigimas technine prasme jokios įtakos neturi. Kokį sertifikato galiojimo laiką nustatyti ir kada atnaujinti sertifikatą sprendžia Pardavėjas.

Įvedus SSL sertifikato generavimo komandą jūsų bus paprašyta suvesti įmonės duomenis. Pvz.:

Įmonės duomenys

Pasirašymas

Pasirašant  parametrus,  iš  visų  siuntimui  paruoštų  parametrų  (neįtraukiant  parametrų password_signature ir rsa_signature) reikia suformuoti pasirašymo eilutę ir ją pasirašyti.

// Pasirašymo / parašo tikrinimo eilutė
$string = 'paramName1Parametras 1paramName2Parametras 2paramName3Parametras ąč';
// Privatus raktas nuskaitomas iš failo ir priskiriamas kintamajam
$privateKey = file_get_contents(‘privkey.pem’);
// sukuriam privataus rakto resursą
$pkeyid = openssl_get_privatekey($privateKey);
if ($pkeyid !== false) {
    // pasirašome pasirašymo eilutę
    if (openssl_sign($string, $signature, $pkeyid) === true) { // jeigu pasirašyti pavyko
        // gautą parašą paverčiame į base64 koduotė eilutę
        if (($signature = base64_encode($signature)) !== false) { // jeigu paversti į base64 pavyko
            // rezultatą išvalome nuo naujos eilutės simbolių
            $signature = preg_replace("/[\r\n\t]*/", "", $signature); // gaunam reikiamą parašą
            // atlaisvinam atmintį nuo privataus rakto
            openssl_free_key($pkeyid);
        } else {
            // Klaida: base64 kodavimas nepavyko
        }
    } else {
        // Klaida: pasirašyti nepavyko
    }
} else {
// Klaida: neteisingo formato raktas
}

Gautas asimetrinis parašas pridedamas kaip rsa_signature parametras prie paruoštų siuntimui parametrų, kurie siunčiami į OPAY. Pageidautina, kad prieš siunčiant paruoštus parametrus į OPAY, parametrai dar būtų užkoduoti ir siunčiami kap vienas parametras enocoded (Žiūrėti skiltyje Duomenų kodavimas siekiant išvengti galimų iškraipymų).

Parašo tikrinimas

Parašas tikrinamas iš visų gautų parametrų (neįtraukiant parametrų password_signature ir rsa_signature) suformuojant pasirašymui / parašo tikrinimui skirtą eilutę. OPAY siunčia parametrus užkoduotus į vieną parametrą encoded, todėl norimiems parametrams gauti, reikės išsikoduoti encoded parametro reikšmę (Žiūrėti skiltyje Duomenų kodavimas siekiant išvengti galimų iškraipymų).

// Pasirašymo / parašo tikrinimo eilutė
$string = 'paramName1Parametras 1paramName2Parametras 2paramName3Parametras ąč';
// Gautą parametro rsa_signature priskiriam kintamajam
$signature = $arrayOfParameters['rsa_signature'];
// OPAY sertifikatas nuskaitomas iš failo ir priskiriamas kintamajam
$certificate = file_get_contents('OPAYcert.pem');
// sukuriam viešojo rakto resursą
$pubkeyid = openssl_pkey_get_public($certificate);
if ($pubkeyid !== false) {
  // tikriname parašą
  $ok = openssl_verify($string, base64_decode($signature), $pubkeyid);
  openssl_free_key($pubkeyid); // atlaisvinam atmintį nuo sertifikato
  if ($ok === 1) {
  // Duomenų autentifikacija pavyko - SĖKMĖ
  } else if ($ok === 0) {
  // Duomenys neatitinka parašo - NESĖKMĖ
  } else {
  // Klaida: Parašo tikrinimas nepavyko
  }
} else {
// Klaida: neteisingo formato raktas
}