2017-05-09 32 views
7

Próbuję wykonać sprawdzanie poprawności RRSIG, Próbuję użyć biblioteki openssl w PHP. Ale mam problem z przekazaniem klucza publicznego do funkcji openssl_verify.Sprawdzanie poprawności RRSIG z PHP przy użyciu openssl

To jest kod bazowy, przy użyciu biblioteki Net/DNS2 do wykonania zapytania DNS z opcją DNSSEC. i uzyskaj DNSKEY i RRSIG.

<?php 

require_once 'Net/DNS2.php'; 

$r = new Net_DNS2_Resolver(array('nameservers' => array('127.0.0.1'))); 
$r->dnssec = true; 

try { 
     $result = $r->query('ip4afrika.nl', 'DNSKEY'); 

} catch(Net_DNS2_Exception $e) { 

     echo "::query() failed: ", $e->getMessage(), "\n"; 
     die(); // 
} 

// print_r($result->answer); 

$public_key_bin = base64_decode($result->answer[0]->key) ; 
$public_key_str = $result->answer[0]->key; //echo $public_key_str; die(); 
// $public_key_res = openssl_x509_parse($public_key_bin); 
$public_key_res = openssl_x509_read($public_key_str); 
// $public_key_res = openssl_pkey_get_public($public_key_str); 

while ($msg = openssl_error_string()) echo $msg . PHP_EOL; 

otrzymuję ten komunikaty o błędach,

przy użyciu:

$public_key_res = openssl_x509_read($public_key_str); 

PHP Warning: openssl_x509_read(): supplied parameter cannot be 
coerced into an X509 certificate! in /src/Net_DNS2-1.4.3/i.php on line 
34 PHP Stack trace: PHP 1. {main}() /src/Net_DNS2-1.4.3/i.php:0 PHP 
2. openssl_x509_read() /src/Net_DNS2-1.4.3/i.php:34 error:0906D06C:PEM routines:PEM_read_bio:no start line 

więc próbowałem dodając BEGIN/nagłówki END

$public_key_str = '-----BEGIN CERTIFICATE-----' . PHP_EOL . $result->answer[0]->key . PHP_EOL . '-----END CERTIFICATE-----' ; 

I got to komunikaty o błędach,

error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 
error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error 
error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib 

Wygląda na to, że karmię funkcję niewłaściwym formatem, nadal googlam, ale jakakolwiek pomoc byłaby miła.

Ostatecznie chciałbym zweryfikować podpis z:

openssl_verify($data, $signature, $public_key_res, 'RSA-SHA256'); 
+0

Czy obejrzysz @ http://php.net/manual/en/function.openssl-verify.php. Mają ładne przykłady: –

+0

Tak, zrobiłem @E_p, mój problem polega na tym, jak przekazać klucz, który otrzymuję z zapytania DNS do funkcji, bez względu na to, jaki format wypróbuję, otrzymuję komunikat o nieprawidłowym formacie klucza w jakiś sposób. – Rabin

+0

Czy to możliwe, że kiedy zdobędziesz klucz, ma dodatkową białą przestrzeń lub coś, co może stworzyć ten problem? –

Odpowiedz

0

PHP_EOL platforma jest specyficzny, nie wiem, co platforma testujesz ten kod na ale spróbuj wymienić stałą z '\n' jawny. Sprawdź, czy to pomaga.

+0

Nic innego się nie zmieniło. – Rabin

2

Krótka odpowiedź:

Jeśli wystarczy zdolność w PHP, możesz po prostu użyć https://github.com/metaregistrar/php-dnssec-validator.

Długi Odpowiedź:

Powodem nie można załadować danych KEY to dlatego, że jest w nieco innej formie. Według rfc3110:

Field    Size 
-----    ---- 
exponent length 1 or 3 octets (see text) 
exponent   as specified by length field 
modulus   remaining space 

Podczas gdy klucze publiczne RSA są nieco bardziej skomplikowane - oprócz wykładnik i moduł, trzeba poprzedzić go z poprawnym OID as such (2nd answer).

Po że proces jest nieco gnarly:

  1. Pobierz rekord RRSIG uzyskać podpis i znacznik klucza (w celu ustalenia, który klucz do użycia)

  2. pomocą klawiszy publicznego od poprawny DNSKEY RR, aby zweryfikować podpis przeciwko.

Jest też proces opisany here (w Pythonie)

+0

Dzięki trzeciemu linkowi do drugiego posta SO było bardzo pouczające. również natknąłem się na implementację Pythona, ale go nie rozumiałem, ostatni fragment, który definiuje jak można określić, czy był to poprawny podpis jest bardzo niejasny, również PHP ma problem z pracą z tak długimi liczbami, więc to jest powód Chciałem użyć kompilacji w bibliotece openssl, która powinna być w stanie wykonać to zadanie. Czy możesz mi pomóc zrozumieć, jak wyczytać zwrócony RRSIG i kto go skomponował? – Rabin