genserv.pl (4921B)
1 #!/usr/bin/env perl 2 #*************************************************************************** 3 # _ _ ____ _ 4 # Project ___| | | | _ \| | 5 # / __| | | | |_) | | 6 # | (__| |_| | _ <| |___ 7 # \___|\___/|_| \_\_____| 8 # 9 # Copyright (C) EdelWeb for EdelKey and OpenEvidence 10 # 11 # This software is licensed as described in the file COPYING, which 12 # you should have received as part of this distribution. The terms 13 # are also available at https://curl.se/docs/copyright.html. 14 # 15 # You may opt to use, copy, modify, merge, publish, distribute and/or sell 16 # copies of the Software, and permit persons to whom the Software is 17 # furnished to do so, under the terms of the COPYING file. 18 # 19 # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 20 # KIND, either express or implied. 21 # 22 # SPDX-License-Identifier: curl 23 # 24 ########################################################################### 25 26 use strict; 27 use warnings; 28 29 use File::Basename; 30 use File::Spec; 31 32 sub opensslfail { 33 die "Missing or broken 'openssl' tool. openssl 1.0.2+ is required. ". 34 "Without it, this script cannot generate the necessary certificates ". 35 "the curl test suite needs for all its TLS related tests."; 36 } 37 38 my $OPENSSL = 'openssl'; 39 if(-f '/usr/local/ssl/bin/openssl') { 40 $OPENSSL = '/usr/local/ssl/bin/openssl'; 41 } 42 43 my $SRCDIR = dirname(__FILE__); 44 my $fh; 45 my $dev_null = File::Spec->devnull(); 46 47 my $KEYSIZE = 'prime256v1'; 48 my $DURATION; 49 my $PREFIX; 50 51 my $CAPREFIX = shift @ARGV; 52 if(!$CAPREFIX) { 53 print "Usage: genserv.pl <caprefix> [<prefix> ...]\n"; 54 exit 1; 55 } elsif(! -f "$CAPREFIX-ca.cacert" || 56 ! -f "$CAPREFIX-ca.key") { 57 58 if($OPENSSL eq basename($OPENSSL)) { # has no dir component 59 # find openssl in PATH 60 my $found = 0; 61 foreach(File::Spec->path()) { 62 my $file = File::Spec->catfile($_, $OPENSSL); 63 if(-f $file) { 64 $OPENSSL = $file; 65 $found = 1; 66 last; 67 } 68 } 69 if(!$found) { 70 opensslfail(); 71 } 72 } 73 74 print "$OPENSSL\n"; 75 system("$OPENSSL version"); 76 77 $PREFIX = $CAPREFIX; 78 $DURATION = 6000; 79 80 if(system("$OPENSSL genpkey -algorithm EC -pkeyopt ec_paramgen_curve:$KEYSIZE -pkeyopt ec_param_enc:named_curve " . 81 "-out $PREFIX-ca.key -pass pass:secret") != 0) { 82 opensslfail(); 83 } 84 system("$OPENSSL req -config $SRCDIR/$PREFIX-ca.prm -new -key $PREFIX-ca.key -out $PREFIX-ca.csr -passin pass:secret 2>$dev_null"); 85 system("$OPENSSL x509 -sha256 -extfile $SRCDIR/$PREFIX-ca.prm -days $DURATION " . 86 "-req -signkey $PREFIX-ca.key -in $PREFIX-ca.csr -out $PREFIX-ca.raw-cacert"); 87 system("$OPENSSL x509 -in $PREFIX-ca.raw-cacert -text -nameopt multiline > $PREFIX-ca.cacert"); 88 system("$OPENSSL x509 -in $PREFIX-ca.cacert -outform der -out $PREFIX-ca.der"); 89 system("$OPENSSL x509 -in $PREFIX-ca.cacert -text -nameopt multiline > $PREFIX-ca.crt"); 90 91 print "CA root generated: $PREFIX $DURATION days $KEYSIZE\n"; 92 } 93 94 $DURATION = 300; 95 96 open($fh, '>>', "$CAPREFIX-ca.db") and close($fh); # for revoke server cert 97 98 while(@ARGV) { 99 $PREFIX = shift @ARGV; 100 $PREFIX =~ s/\.prm$//; 101 102 # pseudo-secrets 103 system("$OPENSSL genpkey -algorithm EC -pkeyopt ec_paramgen_curve:$KEYSIZE -pkeyopt ec_param_enc:named_curve " . 104 "-out $PREFIX.keyenc -pass pass:secret"); 105 system("$OPENSSL req -config $SRCDIR/$PREFIX.prm -new -key $PREFIX.keyenc -out $PREFIX.csr -passin pass:secret 2>$dev_null"); 106 system("$OPENSSL pkey -in $PREFIX.keyenc -out $PREFIX.key -passin pass:secret"); 107 108 system("$OPENSSL pkey -in $PREFIX.key -pubout -outform DER -out $PREFIX.pub.der"); 109 system("$OPENSSL pkey -in $PREFIX.key -pubout -outform PEM -out $PREFIX.pub.pem"); 110 system("$OPENSSL x509 -sha256 -extfile $SRCDIR/$PREFIX.prm -days $DURATION " . 111 "-req -CA $CAPREFIX-ca.cacert -CAkey $CAPREFIX-ca.key -CAcreateserial -in $PREFIX.csr > $PREFIX.crt 2>$dev_null"); 112 113 # revoke server cert 114 if(open($fh, '>', "$CAPREFIX-ca.cnt")) { 115 print $fh '01'; 116 close($fh); 117 } 118 system("$OPENSSL ca -config $SRCDIR/$CAPREFIX-ca.cnf -revoke $PREFIX.crt 2>$dev_null"); 119 120 # issue CRL 121 system("$OPENSSL ca -config $SRCDIR/$CAPREFIX-ca.cnf -gencrl -out $PREFIX.crl 2>$dev_null"); 122 system("$OPENSSL x509 -in $PREFIX.crt -outform der -out $PREFIX.der"); 123 124 # concatenate all together now 125 open($fh, '>', "$PREFIX.pem") and close($fh); 126 chmod 0600, "$PREFIX.pem"; 127 if(open($fh, '>>', "$PREFIX.pem")) { 128 my $fi; 129 print $fh do { local $/; open $fi, '<', $_ and <$fi> } for("$SRCDIR/$PREFIX.prm", "$PREFIX.key", "$PREFIX.crt"); 130 close($fh); 131 } 132 133 print "Certificate generated: CA=$CAPREFIX ${DURATION}days $KEYSIZE $PREFIX\n"; 134 }