#!/usr/bin/perl # Copyright (C) 2007, 2009 Free Software Foundation # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # generate-cacerts.pl generates a gkeytool keystore named 'cacerts' # from OpenSSL's certificate bundle. # First extract each of OpenSSL's bundled certificates into its own # aliased filename. chomp($file=@ARGV[0]); $file = "/etc/pki/tls/cert.pem" unless $file ne ""; open(CERTS, $file); @certs = ; close(CERTS); $pem_file_number = 0; $writing_cert = 0; foreach $cert (@certs) { if ($cert eq "-----BEGIN CERTIFICATE-----\n") { if ($writing_cert != 0) { die "$file is malformed."; } $pem_file_number++; # Numbering each file guarantees that cert aliases will be # unique. $pem_file_name = "$pem_file_number$cert_alias.pem"; $writing_cert = 1; open(PEM, ">$pem_file_name"); print PEM $cert; } elsif ($cert eq "-----END CERTIFICATE-----\n") { $writing_cert = 0; print PEM $cert; close(PEM); } elsif ($cert =~ /Issuer: /) { # Generate an alias using the OU and CN attributes of the # Issuer field if both are present, otherwise use only the CN # attribute. The Issuer field must have either the OU or the # CN attribute. $_ = $cert; if ($cert =~ /OU=/) { s/Issuer:.*?OU=//; # Remove other occurrences of OU=. s/OU=.*CN=//; # Remove CN= if there were not other occurrences of OU=. s/CN=//; } elsif ($cert =~ /CN=/) { s/Issuer:.*CN=//; } s/\W//g; tr/A-Z/a-z/; $cert_alias = $_ } else { if ($writing_cert == 1) { print PEM $cert; } } } # Check that the correct number of .pem files were produced. @pem_files = <*.pem>; if (@pem_files != $pem_file_number) { die "Number of .pem files produced does not match". " number of certs read from $file."; } # Now store each cert in the 'cacerts' file using gkeytool. $certs_written_count = 0; foreach $pem_file (@pem_files) { system "yes | gkeytool@gcc_suffix@ -import -alias `basename $pem_file .pem`". " -keystore cacerts -storepass '' -file $pem_file". " 2>&1 >/dev/null"; unlink($pem_file); $certs_written_count++; } # Check that the correct number of certs were added to the keystore. if ($certs_written_count != $pem_file_number) { die "Number of certs added to keystore does not match". " number of certs read from $file."; }