2017-05-09 3 views
7

J'essaie de faire une validation RRSIG, j'essaie d'utiliser la libs openssl en PHP. Mais j'ai un problème pour passer la clé publique à la fonction openssl_verify.Valider RRSIG avec PHP en utilisant openssl

Il s'agit d'un code de base, utilisant la bibliothèque Net/DNS2 pour effectuer une requête DNS avec l'option DNSSEC. et obtenir le DNSKEY et 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; 

Je reçois ce message d'erreur,

lors de l'utilisation:

$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 

donc j'ai essayé d'ajouter BEGIN/en-têtes FIN

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

Et a obtenu ce message d'erreur,

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 

Donc, il semble que je alimente la fonction au mauvais format, je suis toujours googling mais toute aide serait la bienvenue.

Finalement, j'aime valider la signature avec:

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

Avez-vous regardé @ http://php.net/manual/en/function.openssl-verify.php. Ils ont de bons exemples –

+0

Oui j'ai fait @E_p, mon problème est comment passer la clé que je reçois de la requête DNS à la fonction, quel que soit le format que j'essaie, j'obtiens une erreur sur le format de clé étant incorrect d'une certaine façon. – Rabin

+0

Est-il possible que lorsque vous obtenez une clé, il y ait un espace blanc supplémentaire ou quelque chose qui peut créer ce problème? –

Répondre

0

PHP_EOL est plate-forme spécifique, pas sûr de ce que la plate-forme que vous testez ce code sur, mais essayez de remplacer la constante avec '\n' explicitement. Voyez si cela aide.

+0

N'a pas fait de différence. – Rabin

2

Réponse courte:

Si vous avez juste besoin de la capacité en PHP, vous pouvez simplement utiliser https://github.com/metaregistrar/php-dnssec-validator.

Réponse longue:

La raison pour laquelle vous ne pouvez pas charger les données KEY est parce qu'il est dans un format légèrement différent. Selon rfc3110:

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

Alors que les clés publiques RSA sont un peu plus complexe - en dehors de l'exposant et le module, vous devez le préfixe avec le OID correct as such (2nd answer).

Après que le processus est un peu noueux:

  1. Obtenez le record RRSIG pour obtenir la signature et porte-clés (pour déterminer quelle clé utiliser)

  2. Utilisez les clés publiques de la Corrigez DNSKEY RR pour vérifier la signature.

Il y a aussi un processus décrit here (en python)

+0

Merci le troisième lien à l'autre poste SO était très instructif. aussi je suis tombé sur l'implémentation de python, mais je ne l'ai pas compris, le dernier bit qui définit comment vous pouvez déterminer si c'était une signature valide est très vague, PHP a aussi du mal à travailler avec de si longs nombres, donc c'est la raison Je voulais utiliser la construction dans openssl lib, qui devrait être capable de faire le travail. Pouvez-vous m'aider à comprendre comment disséquer le RRSIG retourné et qui a composé? – Rabin