2017-05-09 5 views
7

Ich versuche, eine RRSIG Validierung zu machen, ich versuche, die openssl lib in PHP zu verwenden. Aber ich habe ein Problem, den öffentlichen Schlüssel an die openssl_verify Funktion zu übergeben.Validieren Sie RRSIG mit PHP mit openssl

Dies ist ein Basiscode, Verwenden der Net/DNS2-Bibliothek, um eine DNS-Abfrage mit DNSSEC-Option. und erhalten Sie die DNSKEY und 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; 

ich diese Fehlermeldungen erhalten,

bei der Verwendung von:

$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 

so habe ich versucht, das Hinzufügen der BEGIN/END-Header

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

Und bekam diese Fehlermeldungen,

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 

So scheint es, dass ich füttere die Funktion das falsche Format, ich google noch, aber jede Hilfe wäre willkommen.

Schließlich möchte ich mit der Unterschrift bestätigen:

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

Hast du look @ http://php.net/manual/en/function.openssl-verify.php. Sie haben schöne Beispiele –

+0

Ja, ich habe @E_p, mein Problem ist, wie den Schlüssel, den ich von der DNS-Abfrage an die Funktion, übergeben, egal welches Format ich versuche, bekomme ich Fehler über das Schlüsselformat in irgendeiner Weise falsch ist. – Rabin

+0

Ist es möglich, dass, wenn Sie Schlüssel erhalten, es zusätzlichen Leerraum oder etwas in sich hat, das dieses Problem verursachen kann? –

Antwort

0

PHP_EOL Plattform spezifisch ist, nicht sicher, welche Plattform Sie diesen Code zu test auf, sondern versuchen, die konstant mit '\n' explizit zu ersetzen. Sehen Sie, ob das hilft.

+0

Hat das nicht anders gemacht. – Rabin

2

Kurze Antwort:

Wenn Sie nur die Möglichkeit, in PHP benötigen, können Sie nur https://github.com/metaregistrar/php-dnssec-validator verwenden.

Lange Antwort:

Der Grund, warum Sie nicht die Schlüsseldaten geladen werden, da sie in einem etwas anderen Format ist. Nach rfc3110:

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

Während öffentlicher RSA-Schlüssel ein wenig komplexer ist - abgesehen von den Exponenten und Modul, können Sie es mit den richtigen OID as such (2nd answer) Präfix müssen.

Danach ist der Prozess ein wenig knorrig:

  1. Holen Sie sich das RRSIG Aufzeichnung der Signatur und Schlüsselanhänger zu bekommen (um festzustellen, welcher Schlüssel zu verwenden)

  2. Mit den öffentlichen Schlüssel von der korrigieren Sie DNSKEY RR, um die Signatur zu überprüfen.

ist auch ein Verfahren beschrieben here (in Python)

+0

Danke der 3. Link zu den anderen SO Post war sehr informativ. auch ich stieß auf die Python-Implementierung, aber ich habe es nicht verstanden, das letzte Bit, das definiert, wie Sie bestimmen können, ob es eine gültige Signatur war, ist sehr vage, auch PHP hat Probleme mit so langen Zahlen arbeiten, so dass der Grund ist Ich wollte den Build in openssl lib verwenden, der in der Lage sein sollte, den Job zu erledigen. Kannst du mir helfen zu verstehen, wie man die zurückgegebene RRSIG seziert und wer sie komponiert hat? – Rabin