Package: dnssec-tools
Version: 1.7-3
Severity: important
File: /usr/share/perl5/Net/DNS/SEC/Tools/keyrec.pm
Tags: patch

When RFC5011 KSK revocation is enabled (the default), at some point after
KSK keys have been revoked, zonesigner fails with the following error:

    dnssec-signzone: fatal: revoked KSK is not self signed

The problem is that zonesigner is not passing a -k argument to dnssec-signzone
with the revoked key. This appears to be because keyrec_keypaths() (from
Net::DNS::SEC::Tools::keyrec) is not finding the kskrev keypaths, which have
an additional level of indirection in their keyrec signing sets.

The attached patch attempts to correct this problem.


-- System Information:
Debian Release: 6.0.4
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: i386 (i686)

Kernel: Linux 2.6.32-5-openvz-686 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages dnssec-tools depends on:
ii  bind9utils       1:9.7.3.dfsg-1~squeeze4 Utilities for BIND
ii  libnet-dns-perl  0.66-2                  Perform DNS queries from a Perl sc
ii  libnet-dns-sec-p 0.16-1                  DNSSEC extension to NET::DNS
ii  libtimedate-perl 1.2000-1                collection of modules to manipulat
ii  perl             5.10.1-17squeeze3       Larry Wall's Practical Extraction 

Versions of packages dnssec-tools recommends:
ii  bind9            1:9.7.3.dfsg-1~squeeze4 Internet Domain Name Server

dnssec-tools suggests no packages.

-- Configuration Files:
/etc/dnssec-tools/dnssec-tools.conf changed [not included]

-- no debconf information
--- /usr/share/perl5/Net/DNS/SEC/Tools/keyrec.pm        2010-06-25 
08:42:00.000000000 -0700
+++ keyrec.pm   2012-03-31 18:09:37.000000000 -0700
@@ -704,15 +704,50 @@
        foreach my $kn (split /[\s,]/, $keylist)
        {
                #
-               # Verify that this key exists and is the right type.
+               # Verify that this key exists.
                #
                next if(!defined($keyrecs{$kn}));
-               next if($keyrecs{$kn}{'keyrec_type'} ne $krt);
 
                #
-               # Push the key's path onto the path list.
+               # Maybe follow another level of indirection for kskrev sets.
                #
-               push @paths, $keyrecs{$kn}{'keypath'};
+               if ($krt eq "kskrev" && $keyrecs{$kn}{'set_type'} eq $krt) {
+                       my $sset = $kn;
+
+                       #
+                       # Get and verify the key list.
+                       #
+                       next if(!defined($keyrecs{$sset}{'keys'}));
+                       my $keylist = $keyrecs{$sset}{'keys'};
+
+                       #
+                       # Get the key's paths and add 'em to the path array.
+                       #
+                       foreach my $kn (split /[\s,]/, $keylist)
+                       {
+                               #
+                               # Verify that this key exists and is the right 
type.
+                               #
+                               next if(!defined($keyrecs{$kn}));
+                               next if($keyrecs{$kn}{'keyrec_type'} ne $krt);
+
+                               #
+                               # Push the key's path onto the path list.
+                               #
+                               push @paths, $keyrecs{$kn}{'keypath'};
+                       }
+               }
+               else {
+                       #
+                       # Verify that this key is the right type.
+                       #
+                       next if($keyrecs{$kn}{'keyrec_type'} ne $krt);
+
+                       #
+                       # Push the key's path onto the path list.
+                       #
+                       push @paths, $keyrecs{$kn}{'keypath'};
+               }
        }
 
        #

Reply via email to