dnssec-keytool.pl
branchhs12
changeset 64 86418a892c76
parent 61 991f8f1593dc
child 66 c44bc1c8e396
equal deleted inserted replaced
63:fe2c4391758e 64:86418a892c76
    12 
    12 
    13 MAIN: {
    13 MAIN: {
    14     my @zone;
    14     my @zone;
    15     my $do;
    15     my $do;
    16 
    16 
    17     my %conf     = read_conf();
    17     my %conf = read_conf();
    18     ($do, @zone) = read_argv($conf{master_dir});
    18     ($do, @zone) = read_argv($conf{master_dir});
    19 
    19 
    20     # completed the program, if not a valid zones was handed over
    20     # completed the program, if not a valid zones was handed over
    21     unless (@zone) { exit; }
    21     unless (@zone) { exit; }
    22 
    22 
    23     if ($do eq "rm") { rm_keys($conf{master_dir}, @zone); exit; }
    23     if ($do eq "rm") { rm_keys($conf{master_dir}, @zone); exit; }
    24 #    if ($do eq "ck") { &ck_zone; }
    24     if ($do eq "ck") { ck_zone($conf{master_dir}, @zone); }
    25     if ($do eq "ksk") { creat_ksk($conf{master_dir}, @zone); }
    25     if ($do eq "ksk") { creat_ksk($conf{master_dir}, @zone); }
    26 
    26 
    27     creat_zsk($conf{master_dir}, @zone);
    27     creat_zsk($conf{master_dir}, @zone);
    28 #    &post_creat;
    28     post_creat($conf{master_dir}, @zone);
    29 }
    29 }
    30 
    30 
    31 sub read_conf {
    31 sub read_conf {
    32 
    32 
    33     # read configuration
    33     # read configuration
    41         die "Can't open config (searched: @conffile)\n";
    41         die "Can't open config (searched: @conffile)\n";
    42     }
    42     }
    43     while (<CONFIG>) {
    43     while (<CONFIG>) {
    44         chomp;
    44         chomp;
    45         s/#.*//;
    45         s/#.*//;
    46         s/\t//g;
       
    47         s/\s//g;
    46         s/\s//g;
    48 
    47 
    49         next unless length;
    48         next unless length;
    50         my ($cname, $ccont) = split(/\s*=\s*/, $_, 2);
    49         my ($cname, $ccont) = split(/\s*=\s*/, $_, 2);
    51         $return{$cname} = $ccont;
    50         $return{$cname} = $ccont;
    53     close(CONFIG);
    52     close(CONFIG);
    54     return %return;
    53     return %return;
    55 }
    54 }
    56 
    55 
    57 sub read_argv ($) {
    56 sub read_argv ($) {
       
    57 
    58     # evaluate argv or print the help
    58     # evaluate argv or print the help
    59     my $master_dir = $_[0];
    59     my $master_dir = $_[0];
    60 
    60 
    61     my $arg = shift @ARGV;
    61     my $arg = shift @ARGV;
    62     my $zone;
    62     my $zone;
    63     my $do;    # return
    63     my $do;      # return
    64     my @zone;  # return
    64     my @zone;    # return
    65 
    65 
    66     if (!defined $arg) {
    66     if (!defined $arg) {
    67         print " usage: dnssec-keytool <option> zone\n";
    67         print " usage: dnssec-keytool <option> zone\n";
    68         print "   -z  created a new ZSK\n";
    68         print "   -z  created a new ZSK\n";
    69         print "   -k  created a new ZSK and KSK\n";
    69         print "   -k  created a new ZSK and KSK\n";
    92     }
    92     }
    93     return ($do, @zone);
    93     return ($do, @zone);
    94 }
    94 }
    95 
    95 
    96 sub rm_keys (@) {
    96 sub rm_keys (@) {
       
    97 
    97     # deletes all the keys were handed over -rm in argv
    98     # deletes all the keys were handed over -rm in argv
    98     my ($master_dir, @zone) = @_;
    99     my ($master_dir, @zone) = @_;
    99     my @new_zone_content;
   100     my @new_zone_content;
   100     my @old_zone_content;
   101     my @old_zone_content;
   101 
   102 
   122         }
   123         }
   123         if (-e "$zpf/keyset-$zone.") {
   124         if (-e "$zpf/keyset-$zone.") {
   124             unlink "$zpf/keyset-$zone." and $ep = 1;
   125             unlink "$zpf/keyset-$zone." and $ep = 1;
   125         }
   126         }
   126 
   127 
   127         for (glob("$zpf/K$zone*")) { 
   128         for (glob("$zpf/K$zone*")) {
   128             chomp($_);
   129             chomp($_);
   129             unlink ("$_");
   130             unlink("$_");
   130         }
   131         }
   131 
   132 
   132         if ($ep == 1) {
   133         if ($ep == 1) {
   133             print " * $zone: removed key-set\n";
   134             print " * $zone: removed key-set\n";
   134         }
   135         }
   141         for (@old_zone_content) {
   142         for (@old_zone_content) {
   142             unless (m#\$INCLUDE.*\"K$zone.*\.key\"#) {
   143             unless (m#\$INCLUDE.*\"K$zone.*\.key\"#) {
   143                 push @new_zone_content, $_;
   144                 push @new_zone_content, $_;
   144             }
   145             }
   145         }
   146         }
   146    
   147 
   147         my $fh = File::Temp->new(DIR => "$zpf")
   148         {
   148             or die "Can't create tmpdir: $!\n";
   149             my $fh = File::Temp->new(DIR => "$zpf")
   149         print $fh join "" => @new_zone_content, "";
   150               or die "Can't create tmpdir: $!\n";
   150         rename($fh->filename => "$zpf/$zone")
   151             print $fh join "" => @new_zone_content, "";
   151             or die "Can't rename " . $fh->filename . " to $zpf/$zone: $!\n";
   152             rename($fh->filename => "$zpf/$zone")
       
   153               or die "Can't rename " . $fh->filename . " to $zpf/$zone: $!\n";
       
   154         }
       
   155 
   152     }
   156     }
   153 }
   157 }
   154 
   158 
   155 sub creat_ksk {
   159 sub creat_ksk {
   156     my ($master_dir, @zone) = @_;
   160     my ($master_dir, @zone) = @_;
   159 
   163 
   160     for (@zone) {
   164     for (@zone) {
   161         my $zone = $_;
   165         my $zone = $_;
   162         my $zpf  = "$master_dir/$zone";
   166         my $zpf  = "$master_dir/$zone";
   163 
   167 
   164         $keyname = `cd $zpf && dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $zone`;
   168         $keyname =
   165 
   169           `cd $zpf && dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $zone`;
   166         unless (-f ".index.ksk") { @index = (); }
   170 
       
   171         unless (-f "$zpf/.index.ksk") { @index = (); }
   167         else {
   172         else {
   168             open(INDEX, ".index.ksk") or die "$zpf/.index.ksk: $!\n";
   173             open(INDEX, "$zpf/.index.ksk") or die "$zpf/.index.ksk: $!\n";
   169             @index = <INDEX>;
   174             @index = <INDEX>;
   170             close(INDEX);
   175             close(INDEX);
   171         }
   176         }
   172 
   177 
   173         push @index, $keyname;
   178         push @index, $keyname;
   174         if (@index > 2) { shift(@index); }
   179         if (@index > 2) { shift(@index); }
   175 
   180 
   176         open(INDEX, ">.index.ksk") or die "$zpf/.index.ksk: $!\n";
   181         {
   177         print INDEX @index;
   182             my $fh = File::Temp->new(DIR => "$zpf")
   178         close(INDEX);
   183               or die "Can't create tmpdir: $!\n";
       
   184             print $fh join "" => @index, "";
       
   185             rename($fh->filename => "$zpf/.index.ksk")
       
   186               or die "Can't rename "
       
   187               . $fh->filename
       
   188               . " to $zpf/.index.ksk: $!\n";
       
   189         }
   179 
   190 
   180         chomp($keyname);
   191         chomp($keyname);
   181         print " * $zone: new KSK $keyname\n";
   192         print " * $zone: new KSK $keyname\n";
   182 
       
   183         print "!! THE KSK must be published !! \n";
   193         print "!! THE KSK must be published !! \n";
   184 
   194 
   185     }
   195     }
   186 }
   196 }
   187 
   197 
   194         my $zone = $_;
   204         my $zone = $_;
   195         my $zpf  = "$master_dir/$zone";
   205         my $zpf  = "$master_dir/$zone";
   196 
   206 
   197         $keyname = `cd $zpf && dnssec-keygen -a RSASHA1 -b 512 -n ZONE $zone`;
   207         $keyname = `cd $zpf && dnssec-keygen -a RSASHA1 -b 512 -n ZONE $zone`;
   198 
   208 
   199         unless (-f ".index.zsk") { @index = (); }
   209         unless (-f "$zpf/.index.zsk") {
       
   210             @index = ();
       
   211         }
   200         else {
   212         else {
   201             open(INDEX, ".index.zsk") or die "$zpf/.index.zsk: $!\n";
   213             open(INDEX, "$zpf/.index.zsk") or die "$zpf/.index.zsk: $!\n";
   202             @index = <INDEX>;
   214             @index = <INDEX>;
   203             close(INDEX);
   215             close(INDEX);
   204         }
   216         }
   205 
   217 
   206         push @index, $keyname;
   218         push @index, $keyname;
   207         if (@index > 2) { shift(@index); }
   219         if (@index > 2) { shift(@index); }
   208 
   220 
   209         open(INDEX, ">.index.zsk") or die "$zpf/.index.zsk: $!\n";
   221         {
   210         print INDEX @index;
   222             my $fh = File::Temp->new(DIR => "$zpf")
   211         close(INDEX);
   223               or die "Can't create tmpdir: $!\n";
   212 
   224             print $fh join "" => @index, "";
       
   225             rename($fh->filename => "$zpf/.index.zsk")
       
   226               or die "Can't rename "
       
   227               . $fh->filename
       
   228               . " to $zpf/.index.zsk: $!\n";
       
   229         }
   213         chomp($keyname);
   230         chomp($keyname);
   214         print " * $zone: new ZSK $keyname\n";
   231         print " * $zone: new ZSK $keyname\n";
   215 
   232 
   216         open(KC, ">.keycounter") or die "$zpf/keycounter: $!\n";
   233         open(KC, ">$zpf/.keycounter") or die "$zpf/keycounter: $!\n";
   217         print KC "0";
   234         print KC "0";
   218         close(KC);
   235         close(KC);
   219 
       
   220     }
   236     }
   221 }
   237 }
   222 
   238 
   223 sub ck_zone {
   239 sub ck_zone {
   224     our @zones;
   240     my ($master_dir, @zone) = @_;
   225     our $master_dir;
   241 
   226     my $zone;
   242     for (@zone) {
   227 
   243         my $zone = $_;
   228     for (@zones) {
   244         my $zpf  = "$master_dir/$zone";
   229         $zone = $_;
       
   230         my $zpf = "$master_dir/$zone";
       
   231         my $keyfile;
   245         my $keyfile;
   232         my @content;
   246         my @content;
   233         my @keylist;
   247         my @keylist;
   234 
   248 
   235         for (<$zpf/*>) {
   249         for (<$zpf/*>) {
   236             if (m#(K$zone.*\.key)#) {
   250             if (m#(K$zone.*\.key)#) {
   237                 $keyfile = $1;
   251                 $keyfile = $1;
   238                 open(KEYFILE, "<$zpf/$keyfile");
   252                 open(KEYFILE, "<", "$zpf/$keyfile")
       
   253                   or die "$zpf/$keyfile: $!\n";
   239                 @content = <KEYFILE>;
   254                 @content = <KEYFILE>;
   240                 close(KEYFILE);
   255                 close(KEYFILE);
   241                 for (@content) {
   256                 for (@content) {
   242                     if (m#DNSKEY.257#) {
   257                     if (m#DNSKEY.257#) {
   243                         push @keylist, $keyfile;
   258                         push @keylist, $keyfile;
   244                     }
   259                     }
   245                 }
   260                 }
   246             }
   261             }
   247         }
   262         }
   248 
   263 
   249         open(INDEX, ">.index.ksk") or die "$zpf/.index.ksk: $!\n";
   264         open(INDEX, ">$zpf/.index.ksk") or die "$zpf/.index.ksk: $!\n";
   250         for (@keylist) {
   265         for (@keylist) {
   251             s#\.key##;
   266             s#\.key##;
   252             print INDEX "$_\n";
   267             print INDEX "$_\n";
   253         }
   268         }
   254         close(INDEX);
   269         close(INDEX);
   255 
   270 
   256         print " * $zone: new .index.ksk created\n";
   271         print " * $zone: new .index.ksk created\n";
   257 
       
   258         if (-f "$zpf/.index.zsk") {
   272         if (-f "$zpf/.index.zsk") {
   259             unlink("$zpf/.index.zsk") or die "$zpf/.index.zsk: $!\n";
   273             unlink("$zpf/.index.zsk") or die "$zpf/.index.zsk: $!\n";
   260         }
   274         }
   261     }
   275     }
   262 }
   276 }
   263 
   277 
   264 sub post_creat {
   278 sub post_creat {
   265     our @zones;
   279     my ($master_dir, @zone) = @_;
   266     our $master_dir;
   280     for (@zone) {
   267 
       
   268     for (@zones) {
       
   269         my $zone = $_;
   281         my $zone = $_;
   270         `touch $master_dir/$zone/$zone`;
   282         `touch $master_dir/$zone/$zone`;
   271 
   283         &kill_useless_keys($zone, $master_dir);
   272         &kill_useless_keys($zone);
   284         &key_to_zonefile($zone, $master_dir);
   273         &key_to_zonefile($zone);
   285     }
   274     }
       
   275 
       
   276 }
   286 }
   277 
   287 
   278 sub kill_useless_keys {
   288 sub kill_useless_keys {
   279 
   289 
   280     # the function deletes all keys that are not available in the zone
   290     # the function deletes all keys that are not available in the zone
   281     # of index.zsk
   291 
   282     our $master_dir;
   292     my $zone       = $_[0];
   283     my $zone    = $_[0];
   293     my $master_dir = $_[1];
   284     my @keylist = ();
   294     my @keylist    = ();
   285     my $zpf     = "$master_dir/$zone";
   295     my $zpf        = "$master_dir/$zone";
   286 
   296 
   287     open(INDEX, "<$zpf/.index.zsk") or die "$zpf/.index.zsk: $!\n";
   297     open(INDEX, "<$zpf/.index.zsk") or die "$zpf/.index.zsk: $!\n";
   288     @keylist = <INDEX>;
   298     @keylist = <INDEX>;
   289     close(INDEX);
   299     close(INDEX);
   290     open(INDEX, "<$zpf/.index.ksk") or die "$zpf/.index.ksk: $!\n";
   300     open(INDEX, "<$zpf/.index.ksk") or die "$zpf/.index.ksk: $!\n";
   297         s#K.*\+.*\+(.*)#$1#;
   307         s#K.*\+.*\+(.*)#$1#;
   298     }
   308     }
   299 
   309 
   300     # reviewed every key file (KSK, ZSK), whether they are described in
   310     # reviewed every key file (KSK, ZSK), whether they are described in
   301     # the respective index file. if not they will be deleted.
   311     # the respective index file. if not they will be deleted.
   302     for ( glob("$master_dir/$zone/K*")) {
   312     for (glob("$master_dir/$zone/K*")) {
   303         chomp;
   313         chomp;
   304         my $file     = $_;
   314         my $file     = $_;
   305         my $rm_count = 1;
   315         my $rm_count = 1;
   306         my $keyname;
   316         my $keyname;
   307         for (@keylist) {
   317         for (@keylist) {
   308             if ($file =~ /$_/) { $rm_count = 0; }
   318             if ($file =~ /$_/) { $rm_count = 0; }
   309         }
   319         }
   310         if ($rm_count == 1) {
   320         if ($rm_count == 1) {
   311             unlink "$file";
   321             unlink "$file";
   312             if ($file =~ /$zpf\/(.*\.key)/) {
   322             if ($file =~ /$zpf\/(.*\.key)/) {
   313                 print " * $zone: Schluessel $1 entfernt \n";
   323                 print " * $zone: Key $1 removed \n";
   314             }
   324             }
   315         }
   325         }
   316     }
   326     }
   317 }
   327 }
   318 
   328 
   319 sub key_to_zonefile {
   329 sub key_to_zonefile {
   320 
   330 
   321     # the function added all keys to the indexfile
   331     # the function added all keys to the indexfile
   322     our $master_dir;
   332     my $zone       = $_[0];
   323     my $zone = $_[0];
   333     my $master_dir = $_[1];
   324     my $zpf  = "$master_dir/$zone";
   334     my $zpf        = "$master_dir/$zone";
   325     my @old_content;
   335     my @old_content;
   326     my @new_content = ();
   336     my @new_content = ();
   327 
   337 
   328     open(ZONEFILE, "<$zpf/$zone");
   338     open(ZONEFILE, "<$zpf/$zone");
   329     @old_content = <ZONEFILE>;
   339     @old_content = <ZONEFILE>;
   341     open(ZONEFILE, ">$zpf/$zone") or die "$zpf/$zone: $!\n";
   351     open(ZONEFILE, ">$zpf/$zone") or die "$zpf/$zone: $!\n";
   342     print ZONEFILE @new_content;
   352     print ZONEFILE @new_content;
   343     close(ZONEFILE);
   353     close(ZONEFILE);
   344 }
   354 }
   345 
   355 
   346 
       
   347 __END__
   356 __END__
   348 
   357 
   349 =pod
   358 =pod
   350 
   359 
   351 =head1 NAME
   360 =head1 NAME
   355 =head1 SYNOPSIS
   364 =head1 SYNOPSIS
   356 
   365 
   357 dnssec-keytool <option> zone
   366 dnssec-keytool <option> zone
   358 
   367 
   359 =head1 DESCRIPTION
   368 =head1 DESCRIPTION
       
   369 
       
   370 kommt bald