-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


I have attached a slightly updated CA.pl that I find more convienient
then the standard one:

- - It writes private keys into newkey.pem (rather than putting them
in with the CSR).

- - It checks the return value from openssl before printing success 
messages.

- - It adds -newreq-nopw to generate a request and private key without a 
PEM passphrase.

This makes CA.pl suck a bit less :)

Regards,
Damien Miller

- --
| "Bombay is 250ms from New York in the new world order" - Alan Cox
| Damien Miller - http://www.ilogic.com.au/~dmiller
| Email: [EMAIL PROTECTED] (home) -or- [EMAIL PROTECTED] (work)


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.0 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE39BxnormJ9RG1dI8RAsqaAKC99BcKmgK5t4qg1lQC5hVdOmac0gCgla0X
JyV1mKj6Lv6A7/Xm1qQ+TOs=
=Qcw6
-----END PGP SIGNATURE-----
#!/usr/local/bin/perl
#
# CA - wrapper around ca to make it easier to use ... basically ca requires
#      some setup stuff to be done before you can use it and this makes
#      things easier between now and when Eric is convinced to fix it :-)
#
# CA -newca ... will setup the right stuff
# CA -newreq ... will generate a certificate request 
# CA -sign ... will sign the generated request and output 
#
# At the end of that grab newreq.pem and newcert.pem (one has the key 
# and the other the certificate) and cat them together and that is what
# you want/need ... I'll make even this a little cleaner later.
#
# 12-Jan-96 tjh    Added more things ... including CA -signcert which
#                  converts a certificate to a request and then signs it.
# 10-Jan-96 eay    Fixed a few more bugs and added the SSLEAY_CONFIG
#                  environment variable so this can be driven from
#                  a script.
# 25-Jul-96 eay    Cleaned up filenames some more.
# 11-Jun-96 eay    Fixed a few filename missmatches.
# 03-May-96 eay    Modified to use 'ssleay cmd' instead of 'cmd'.
# 18-Apr-96 tjh    Original hacking
#
# Tim Hudson
# [EMAIL PROTECTED]
#

# 27-Apr-98 snh    Translation into perl, fix existing CA bug.
#
# Steve Henson
# [EMAIL PROTECTED]

# 01-Oct-99 djm    Cleaned up, added error checking and -newreq-nopw
#
# Damien Miller <[EMAIL PROTECTED]>

# default openssl.cnf file has setup as per the following
# demoCA ... where everything is stored

$DAYS="-days 365";
$REQ="openssl req $SSLEAY_CONFIG";
$CA="openssl ca $SSLEAY_CONFIG";
$VERIFY="openssl verify";
$X509="openssl x509";

$CATOP="./demoCA";
$CAKEY="cakey.pem";
$CACERT="cacert.pem";

$DIRMODE = 0700;

$RET = 0;

foreach (@ARGV) {
        if ( /^(-\?|-h|-help)$/ ) {
            print STDERR "usage: CA 
-newcert|-newreq|-newreq-nopw|-newca|-sign|-verify\n";
            exit 0;
        } elsif (/^-newcert$/) {
            # create a certificate
            system ("$REQ -new -x509 -keyout newkey.pem -out newreq.pem $DAYS");
            check_return($?, "Certificate is in newreq.pem, private key is in 
newkey.pem");
        } elsif (/^-newreq$/) {
            # create a certificate request
            system ("$REQ -new -keyout newkey.pem -out newreq.pem $DAYS");
            check_return($?, "Request is in newreq.pem, private key is in 
newkey.pem");
        } elsif (/^-newreq-nopw$/) {
            # create a certificate request
            system ("$REQ -new -nodes -keyout newkey.pem -out newreq.pem $DAYS");
            check_return($?, "Request is in newreq.pem, private key is in 
newkey.pem");
        } elsif (/^-newca$/) {
                # if explictly asked for or it doesn't exist then setup the
                # directory structure that Eric likes to manage things 
            $NEW="1";
            if ( "$NEW" || ! -f "${CATOP}/serial" ) {
                # create the directory hierarchy
                mkdir $CATOP, $DIRMODE;
                mkdir "${CATOP}/certs", $DIRMODE;
                mkdir "${CATOP}/crl", $DIRMODE ;
                mkdir "${CATOP}/newcerts", $DIRMODE;
                mkdir "${CATOP}/private", $DIRMODE;
                open OUT, ">${CATOP}/serial";
                print OUT "01\n";
                close OUT;
                open OUT, ">${CATOP}/index.txt";
                close OUT;
            }
            if ( ! -f "${CATOP}/private/$CAKEY" ) {
                print "CA certificate filename (or enter to create)\n";
                $FILE = <STDIN>;

                chop $FILE;

                # ask user for existing CA certificate
                if ($FILE) {
                    cp_pem($FILE,"${CATOP}/private/$CAKEY", "PRIVATE");
                    cp_pem($FILE,"${CATOP}/$CACERT", "CERTIFICATE");
                    $RET=$?;
                } else {
                    print "Making CA certificate ...\n";
                    system ("$REQ -new -x509 -keyout " .
                        "${CATOP}/private/$CAKEY -out ${CATOP}/$CACERT $DAYS");
                    $RET=$?;
                }
            }
        } elsif (/^-xsign$/) {
            system ("$CA -policy policy_anything -infiles newreq.pem");
            $RET=$?;
        } elsif (/^(-sign|-signreq)$/) {
            system ("$CA -policy policy_anything -out newcert.pem " .
                                                        "-infiles newreq.pem");
            check_return($?, "Signed certificate is in newcert.pem");
        } elsif (/^-signcert$/) {
            system ("$X509 -x509toreq -in newreq.pem -signkey newreq.pem " .
                                                                "-out tmp.pem");
            system ("$CA -policy policy_anything -out newcert.pem " .
                                                        "-infiles tmp.pem");
            check_return($?, "Signed certificate is in newcert.pem\n");
        } elsif (/^-verify$/) {
            if (shift) {
                foreach $j (@ARGV) {
                    system ("$VERIFY -CAfile $CATOP/$CACERT $j");
                    $RET=$? if ($? != 0);
                }
                exit $RET;
            } else {
                    system ("$VERIFY -CAfile $CATOP/$CACERT newcert.pem");
                    $RET=$?;
                    exit 0;
            }
        } else {
            print STDERR "Unknown arg $_\n";
            print STDERR "usage: CA 
-newcert|-newreq|-newreq-nopw|-newca|-sign|-verify\n";
            exit 1;
        }
}

exit $RET;

sub cp_pem {
my ($infile, $outfile, $bound) = @_;
open IN, $infile;
open OUT, ">$outfile";
my $flag = 0;
while (<IN>) {
        $flag = 1 if (/^-----BEGIN.*$bound/) ;
        print OUT $_ if ($flag);
        if (/^-----END.*$bound/) {
                close IN;
                close OUT;
                return;
        }
}
}

sub check_return($$) {
        my $retval = shift;
        my $success = shift;
        
        if ($retval) {
                print "\nError - openssl returned $retval\n";
        } else {
                print "\n$success\n";
        }
        exit($retval);
}

        

Reply via email to