Подтвердите RRSIG с помощью PHP, используя openssl

Я пытаюсь сделать RRSIG Проверка, я пытаюсь использовать OpenSSL lib в PHP. Но у меня проблема с передачей открытого ключа openssl_verify функция.

Это базовый код, использующий библиотеку Net/DNS2 для выполнения DNS-запроса с опцией DNSSEC. и получите 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;

Я получаю это сообщение об ошибке,

когда используешь:

$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

поэтому я попытался добавить заголовки BEGIN/END

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

И получил это сообщение об ошибке,

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');

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 как таковой (2-й ответ).

После этого процесс немного грубоват:

  1. Получите запись RRSIG, чтобы получить подпись и тэг ключа (чтобы определить, какой ключ использовать)

  2. Используйте открытые ключи из правильного DNSKEY RR для проверки подписи.

Здесь также описан процесс (на python)

PHP_EOL зависит от платформы, не знаю, на какой платформе вы тестируете этот код, но попробуйте заменить константу на '\n' в явном виде. Посмотрите, поможет ли это.

Другие вопросы по тегам