dnssec-creatkey
changeset 31 1cea07056124
parent 30 5ac92c1ffdf9
child 32 d1addc2ec712
equal deleted inserted replaced
30:5ac92c1ffdf9 31:1cea07056124
     1 #!/usr/bin/perl -w
     1 #!/usr/bin/perl -w
     2 
     2 
     3 use strict;
     3 use strict;
     4 use FindBin;
     4 use FindBin;
       
     5 
       
     6 sub del_double {
       
     7     my %all;
       
     8     grep { $all{$_} = 0 } @_;
       
     9     return ( keys %all );
       
    10 }
     5 
    11 
     6 # liest die Konfiguration ein
    12 # liest die Konfiguration ein
     7 my @configs = ( "$FindBin::Bin/dnstools.conf", "/etc/dnstools.conf" );
    13 my @configs = ( "$FindBin::Bin/dnstools.conf", "/etc/dnstools.conf" );
     8 my %config;
    14 my %config;
     9 
    15 
    33 my @manu;
    39 my @manu;
    34 my @index;
    40 my @index;
    35 my $zone;
    41 my $zone;
    36 my $keyname;
    42 my $keyname;
    37 
    43 
    38 
       
    39 # prueft ob eingaben in ARGV domains sind und gibt sie in die liste @manu
    44 # prueft ob eingaben in ARGV domains sind und gibt sie in die liste @manu
    40 for (@ARGV) {
    45 for (@ARGV) {
    41     chomp( my $zone = `idn --quiet "$_"` );
    46     chomp( my $zone = `idn --quiet "$_"` );
    42 
    47 
    43     if ( -d "$master_dir/$zone" ) {
    48     if ( -d "$master_dir/$zone" ) {
    49 }
    54 }
    50 
    55 
    51 # prueft ob zonen mit schluesselmaterial ueber index- und keycounterdatei
    56 # prueft ob zonen mit schluesselmaterial ueber index- und keycounterdatei
    52 # verfuegen.
    57 # verfuegen.
    53 # legt .index.ksk an falls nicht und gibt die entsprechende zone in die
    58 # legt .index.ksk an falls nicht und gibt die entsprechende zone in die
    54 # liste @change 
    59 # liste @change
    55 while (<$master_dir/*>) {
    60 while (<$master_dir/*>) {
    56     chomp( $zone = $_ );
    61     chomp( $zone = $_ );
    57 
    62 
    58     if (-f "$zone/.index.zsk" and
    63     if (    -f "$zone/.index.zsk"
    59         -f "$zone/.index.ksk" and
    64         and -f "$zone/.index.ksk"
    60         -f "$zone/.keycounter") {
    65         and -f "$zone/.keycounter" )
       
    66     {
    61         next;
    67         next;
    62     }
    68     }
    63 
    69 
    64     while (<$zone/*>) {
    70     while (<$zone/*>) {
    65         if (m#^K#) {
    71         if (m#^K#) {
    66             my $file_in_zone = $_;
    72             my $file_in_zone = $_;
    67 
    73 
    68             open (KEY,$_) or die "$_: $!\n";
    74             open( KEY, $_ ) or die "$_: $!\n";
    69             for (<KEY>) {
    75             for (<KEY>) {
    70                 if (m#DNSKEY.257#) {
    76                 if (m#DNSKEY.257#) {
    71                     $file_in_zone =~ s#(/.*/)(.*).key#$2#;
    77                     $file_in_zone =~ s#(/.*/)(.*).key#$2#;
    72 
    78 
    73                     open (INDEX, ">$zone/.index.ksk") or die;
    79                     open( INDEX, ">$zone/.index.ksk" ) or die;
    74                     print INDEX "$file_in_zone\n";
    80                     print INDEX "$file_in_zone\n";
    75                     close (INDEX);
    81                     close(INDEX);
    76 
    82 
    77                     $zone =~ s#($master_dir/)(.*)#$2#;
    83                     $zone =~ s#($master_dir/)(.*)#$2#;
    78                     push( @change, $zone );
    84                     push( @change, $zone );
    79 
    85 
    80                 }
    86                 }
    81             }
    87             }
    82             close (KEY);
    88             close(KEY);
    83         }
    89         }
    84     }
    90     }
    85 }
    91 }
    86 
       
    87 
    92 
    88 # gibt alle zonen mit abgelaufenen keycounter in die liste @change
    93 # gibt alle zonen mit abgelaufenen keycounter in die liste @change
    89 while (<$master_dir/*>) {
    94 while (<$master_dir/*>) {
    90     chomp( $zone = $_ );
    95     chomp( $zone = $_ );
    91     my $key;
    96     my $key;
   103         push( @change, $zone );
   108         push( @change, $zone );
   104     }
   109     }
   105 }
   110 }
   106 
   111 
   107 #erzeugt zsks
   112 #erzeugt zsks
   108 for ( @change, @manu ) {
   113 for ( &del_double( @change, @manu ) ) {
   109     $zone = $_;
   114     $zone = $_;
   110 
   115 
   111     chdir "$master_dir/$zone" or die "$master_dir/$zone: $!\n";
   116     chdir "$master_dir/$zone" or die "$master_dir/$zone: $!\n";
   112     $keyname = `dnssec-keygen -a RSASHA1 -b 512 -n ZONE $zone`;
   117     $keyname = `dnssec-keygen -a RSASHA1 -b 512 -n ZONE $zone`;
   113 
   118 
   137     print KC "0";
   142     print KC "0";
   138     close(KC);
   143     close(KC);
   139 }
   144 }
   140 
   145 
   141 #erzeugt ksks
   146 #erzeugt ksks
   142 for (@manu) {
   147 for ( &del_double(@manu) ) {
   143     $zone = $_;
   148     $zone = $_;
   144 
   149 
   145     chdir "$master_dir/$zone" or die "$master_dir/$zone: $!\n";
   150     chdir "$master_dir/$zone" or die "$master_dir/$zone: $!\n";
   146     $keyname = `dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $zone`;
   151     $keyname = `dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $zone`;
   147 
   152 
   148     print "creat new KSK for $zone? (no): ";
   153     print "creat new KSK for $zone? (no): ";
   149     unless (<STDIN> =~ m/^yes/) {
   154     unless ( <STDIN> =~ m/^yes/ ) {
   150         next;
   155         next;
   151     }
   156     }
   152 
   157 
   153     unless ( -f ".index.ksk" ) {
   158     unless ( -f ".index.ksk" ) {
   154         @index = ();
   159         @index = ();
   174     print "$keyname (KSK) creat for $zone \n";
   179     print "$keyname (KSK) creat for $zone \n";
   175 }
   180 }
   176 
   181 
   177 # loescht alle unbenoetigten schluessel, fuegt die schluessel in
   182 # loescht alle unbenoetigten schluessel, fuegt die schluessel in
   178 # die zone-datei
   183 # die zone-datei
   179 for ( @change, @manu ) {
   184 for ( &del_double( @change, @manu ) ) {
   180     $zone = $_;
   185     $zone = $_;
   181     my @old_zone_content = ();
   186     my @old_zone_content = ();
   182     my @new_zone_content = ();
   187     my @new_zone_content = ();
   183     my @kkeylist         = ();
   188     my @kkeylist         = ();
   184     my @zkeylist         = ();
   189     my @zkeylist         = ();
   199     @old_zone_content = <ZONE>;
   204     @old_zone_content = <ZONE>;
   200     close(ZONE);
   205     close(ZONE);
   201 
   206 
   202     # kuerzt die schluessel-bezeichnung aus der indexdatei auf die id um sie
   207     # kuerzt die schluessel-bezeichnung aus der indexdatei auf die id um sie
   203     # besser vergleichen zu koennen.
   208     # besser vergleichen zu koennen.
   204     for (@kkeylist, @zkeylist) {
   209     for ( @kkeylist, @zkeylist ) {
   205         chomp;
   210         chomp;
   206         s#K.*\+.*\+(.*)#$1#;
   211         s#K.*\+.*\+(.*)#$1#;
   207     }
   212     }
   208 
   213 
   209     # filtert alle schluessel aus der zonedatei
   214     # filtert alle schluessel aus der zonedatei
   229                 # schluessel die in der indexdatei standen, werden an die
   234                 # schluessel die in der indexdatei standen, werden an die
   230                 # zonedatei angehangen.
   235                 # zonedatei angehangen.
   231                 if ( $file =~ /.*key/ ) {
   236                 if ( $file =~ /.*key/ ) {
   232 
   237 
   233                     $file =~ s#/.*/(K.*)#$1#;
   238                     $file =~ s#/.*/(K.*)#$1#;
   234                     push @new_zone_content, "\$INCLUDE \"$file\"\t\t; dnssec-zsk\n" ;
   239                     push @new_zone_content,
       
   240                         "\$INCLUDE \"$file\"\t\t; dnssec-zsk\n";
   235 
   241 
   236                     last;
   242                     last;
   237                 }
   243                 }
   238             }
   244             }
   239         }
   245         }
   245                 # schluessel die in der indexdatei standen, werden an die
   251                 # schluessel die in der indexdatei standen, werden an die
   246                 # zonedatei angehangen.
   252                 # zonedatei angehangen.
   247                 if ( $file =~ /.*key/ ) {
   253                 if ( $file =~ /.*key/ ) {
   248 
   254 
   249                     $file =~ s#/.*/(K.*)#$1#;
   255                     $file =~ s#/.*/(K.*)#$1#;
   250                     push @new_zone_content, "\$INCLUDE \"$file\"\t\t; dnssec-ksk\n" ;
   256                     push @new_zone_content,
       
   257                         "\$INCLUDE \"$file\"\t\t; dnssec-ksk\n";
   251 
   258 
   252                     last;
   259                     last;
   253                 }
   260                 }
   254             }
   261             }
   255         }
   262         }