2017-05-09 5 views
7

RRSIGの検証をしようとしていますが、私はPHPでopenssl libを使用しようとしています。しかし、公開鍵をopenssl_verify関数に渡すのに問題があります。opensslを使ってPHPでRRSIGを検証

これは、DNSSECオプションを使用してDNSクエリを実行するためにNet/DNS2ライブラリを使用する の基本コードです。 とDNSKEYと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; 

私は、このエラーメッセージは、

使用して取得:私はBEGIN/ENDヘッダに

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

を追加しようとしたし、このエラーメッセージを得た、

$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 

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 

私は機能に間違ったフォーマットを与えているようですが、まだ私はグーグルではありますが、どんな助けも歓迎されます。

最終的に私が署名を検証したい:

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

(Pythonで)hereを説明し、あなたがhttp://php.net/manual/en/function.openssl-verify.php @見たのもあります。彼らは素晴らしい例を持っています –

+0

はい私は@E_pをしました、私の問題は、どのような形式を試しても、何らかの方法で間違っているキー形式についてのエラーを取得するには、DNSクエリから取得するキーを関数に渡す方法です。 – Rabin

+0

キーを取得すると余分な空白やその中に何か問題が発生する可能性はありますか? –

答えて

0

PHP_EOLは、あなたが上でこのコードをテストしているのかわからプラットフォームプラットフォーム固有のではなく、明示的に'\n'で定数を交換してみてください。それが役立つかどうかを見てください。

+0

違いはありませんでした。 – Rabin

2

短い答えは:あなただけのPHPの機能が必要な場合は

、あなただけhttps://github.com/metaregistrar/php-dnssec-validatorを使用することができます。

ロング回答:

それがわずかに異なるフォーマットでありますので、あなたがKEYデータをロードすることができない理由はあります。 rfc3110によると:

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

RSA公開鍵は、もう少し複雑ですに対し - 脇指数とモジュラスから、あなたは正しいOID as such (2nd answer)を前に付けする必要があります。プロセスは少し危ないであることを後

  1. (使用するキーを決定するために)署名と鍵タグを取得するRRSIGレコードを取得

  2. から公開キーを使用し署名を検証するDNSKEY RRを修正してください。

プロセスが

+0

他のSOへの3番目のリンクをありがとう、非常に有益でした。また、私はPythonの実装に出くわしましたが、私はそれを理解していませんでした、あなたはそれが有効な署名だったかどうかを決定する方法を定義する最後のビットは非常に曖昧ですまた、PHPもこのような長い番号で動作しているので、私は、仕事をすることができるはずのopenssl libでビルドを使いたかったのです。あなたは返されたRRSIGを解剖する方法と、それを作った人を解剖する方法を理解するのを助けることができますか? – Rabin

関連する問題