当前位置: 首页 > 知识库问答 >
问题:

使用openssl使用PHP验证RRSIG

夏侯昆琦
2023-03-14

我正在尝试进行RRSIG验证,我正在尝试使用PHP中的openssl库。但是我在将公钥传递到openssl\u verify函数时遇到了问题。

这是一个基本代码,使用Net/DNS2库使用DNSSEC选项进行DNS查询。并获得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个答案

赏星河
2023-03-14

PHP\u EOL是特定于平台的,不确定在哪个平台上测试此代码,但尝试显式地用'\n'替换常量。看看这是否有帮助。

韦锦程
2023-03-14

简短答复:

如果您只需要PHP中的功能,可以使用https://github.com/metaregistrar/php-dnssec-validator .

长答覆:

无法加载关键数据的原因是它的格式稍有不同。根据rfc3110:

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

RSA公钥要复杂一点——除了指数和模之外,还需要在它前面加上正确的OID(第二个答案)。

在这之后,过程有点粗糙:

>

使用正确的DNSKEY RR中的公钥验证签名。

这里也描述了一个过程(在python中)

 类似资料:
  • 我正在用以下组件构建自己的证书链: 根证书是自签名证书,中间证书由根证书和用户由中间证书签名。 现在我想验证一个用户证书是否有其根证书的锚。 具有 验证是可以的。在下一步中,我将使用 验证结果显示 什么是错的?

  • 我在应用程序中用戴伟的加密技术创建了一个ECDSA密钥对(secp128r1)。签名和验证按预期工作。我没有将消息本身添加到签名中,以最小化签名长度(正好是32个字节)。 但是,当我使用openssl创建签名时: 显然,OpenSSL将消息本身放在签名中,导致更大的签名(例如39字节)。如果我设置< code > CryptoPP::SignatureVerificationFilter::PUT

  • 我想验证C中的签名,这是我在Java中签名的随机签名。 以下是我用于签名的Java代码: 现在我想用C验证签名,我需要C代码等于以下Java代码: 到目前为止,我所尝试的: 此方法返回0,但我确信随机是用正确的键签名的,并且该方法需要返回1...我想我的验证用的C代码有问题。也许你们中的一个知道如何做对。 --解决--

  • 我尝试制作一个Perl-Script来验证SMIME消息"手动"。我真的试了很多,但没有用。 大多数情况下,验证会放置“签名长于密钥”或只是给出错误的返回。 如果我在控制台用OpenSSL做这件事,它就像一个魅力。 它生成并验证msg.txt 我把它改短了。 现在我尝试用非常简单的Perl来展示它。我简化了MIME处理,只使用msg.txt中的内联值。 我跳过了剩下的。它相当于msg.txt中的签

  • 我正在尝试使用加密来验证open-ssl签名,这是open-ssl部分: 现在在我的C代码中: 但是我总是收到验证失败的消息

  • 我正在编写一些代码,试图对一些数据进行签名。在将openssl生成的私钥转换为Java密钥库之后,我将Java签名类与SHA256withRSA一起使用。我试图确认openssl中Java类返回的签名,但由于某些原因,我无法让openssl进行验证。我最终需要在iOS Swift 3中实现这个签名验证,但在找到库之前,我想尝试根据openssl标准检查Java签名。 例如,我从我们的登录服务器得到