[dns-operations] Checking for signatures of a certain DNSKEY within a zone
Klaus Darilion
klaus.mailinglists at pernau.at
Wed Jul 7 20:59:41 UTC 2021
Hi Tony!
Am 06.07.2021 um 18:00 schrieb Tony Finch:
> Klaus Darilion <klaus.mailinglists at pernau.at> wrote:
>>
>> dig ... axfr | grep RRSIG | grep $KEYID
>>
>> This worked fine for long time but when having keys with the same keyid this
>> obviously does not work anymore.
>
> If it is one of your zones then your key management software should ensure
> that all the key IDs are different, i.e. if there is an ID collision when
> generating a key, throw it away and regenerate it. This is important for
> verification performance (and, I would guess, less risk of encountering
> bugs).
Indeed, I was thinking too complex. I just implemented it as you
suggested and it works. Problem solved. Thanks
reards
Klaus
PS: Also thank for for the Perl code - I archived it. I am afraid I will
need it some day ;-)
>> So I want to change my code to additionally check if the signature can
>> be verified with the respective public key. Are there any tools (bash,
>> php ...) which accepts single RRSIG RR and single DNSKEY RR and does
>> the validation?
>
> Each signature covers the entire RRset, so you need all the DNSKEY
> records.
>
> Dunno if there's an easier tool, but it's not too bad with Net::DNS.
> I tried this out with ac.uk which is signed with both zsk and ksk, and
> cam.ac.uk which is signed with just ksk.
>
> #!/usr/bin/perl
>
> use 5.10.0;
>
> use warnings;
> use strict;
>
> use Net::DNS;
> use Net::DNS::SEC;
> use Net::DNS::SEC::Keyset;
>
> my (@key, at sig);
>
> my $resolver = Net::DNS::Resolver->new();
> $resolver->dnssec(1);
>
> my $reply = $resolver->send(@ARGV, 'DNSKEY')
> or die $resolver->errorstring;
>
> for my $rr ($reply->answer) {
> push @sig, $rr if $rr->type eq 'RRSIG';
> push @key, $rr if $rr->type eq 'DNSKEY';
> }
>
> for my $rr (@key, @sig) {
> $rr->print;
> }
>
> die "no DNSKEY RRset found" unless @key;
> die "no RRSIG(DNSKEY) found" unless @sig;
>
> my $keyset = Net::DNS::SEC::Keyset->new(\@key, \@sig)
> or die Net::DNS::SEC::Keyset->keyset_err;
>
> for my $key (@key) {
> my $id = $key->keytag;
> my $ok = $keyset->verify($id);
> my $err = Net::DNS::SEC::Keyset->keyset_err;
> printf "key %d %s verify %s %s\n",
> $id, $key->sep ? "ksk" : "zsk",
> $ok ? "ok" : "fail", $err;
> }
>
> Tony.
>
More information about the dns-operations
mailing list