如何在PHP中验证DNSSEC?

Chr*_* R. 6 php

我一直试图找到一种方法来验证PHP(oa1)中的DNS记录,但已经很短.

我可以使用此库验证整个域,但不能验证单个记录:https://github.com/metaregistrar/php-dnssec-validator

此外,该库仅允许验证一小部分TLD.

还有另外一个库可以为我处理这个问题,或者我应该研究一下其他的东西吗?

我也发现了这个:http://www.phpclasses.org/package/9031-PHP-Validate-DNSSEC-keys-and-calculate-the-DS-record.html

但我不知道如何在他们的验证功能中使用密钥.

请帮忙!

UPDATE

所以,我最终使用了这个......

exec('host -t RRSIG ' . $domain, $output);
Run Code Online (Sandbox Code Playgroud)

以最小的麻烦返回RRSIG或缺少RRSIG.

bis*_*hop 2

PHP 引擎有一组固定的支持的 DNS 记录类型,全部由type参数定义dns_get_record。您可以通过查看实现 DNS 查询的引擎代码来仔细检查此列表。

不幸的是,该预定义列表中没有任何 DNSSEC 记录。因此,您需要依赖库或外部工具。

我会使用Net_DNS2,因为它支持许多DNSSEC RR。例子:

$google = new \Net_DNS2_Resolver(['nameservers' => ['8.8.8.8', '8.8.4.4']]);
$google->dnssec = true;
try {
    $result = $google->query('kyhwana.org', 'SSHFP');
} catch(\Net_DNS2_Exception $ex) {
    die($ex->getMessage());
}

foreach ($result->answer as $answer) {
    if ($answer instanceof \Net_DNS2_RR_SSHFP) {
        printf(
            '%s %d %s %s %d %d %s' . PHP_EOL,
            $answer->name,
            $answer->ttl,
            $answer->class,
            $answer->type,
            $answer->algorithm,
            $answer->fp_type,
            $answer->fingerprint
        );
    } else if ($answer instanceof \Net_DNS2_RR_RRSIG) {
        printf('Signed by %s: %s' . PHP_EOL, $answer->signname, $answer->signature);
    }
}
Run Code Online (Sandbox Code Playgroud)

另外:如果您的域使用 ECDSA 算法或 SHA-256 指纹(如上面的示例),那么您需要最新的 Net_DNS2 代码来修复问题 #39