Initial commit
[apache2-cn.git] / carnet-generate-ssl
1 #!/bin/sh
2 set -e
3
4 TMPFILE=`tempfile -d /var/tmp -p apache2-cn`
5 TMPFILE2=`tempfile -d /var/tmp -p apache2-cn`
6
7 trap "rm -f $TMPFILE $TMPFILE2" 1 2 15;
8
9 CONFDIR="$1"
10 FQDN="$2"
11 WEBMASTER="$3"
12 DOMAIN="$4"
13
14 sslcrt=/etc/ssl/certs
15 sslkey=/etc/ssl/private
16 A2CNDIR=$(dirname $0)
17
18 if [ -z "$4" ]; then
19   echo "Usage: $0 <confdir> <fqdn> <email> <org>"
20   echo
21   echo "        confdir is ignored"
22   echo "        fqdn    is the fully qualified name of the web server"
23   echo "        email   address that will appear in the certificate"
24   echo "        org     is the organization name"
25   exit 2
26 fi
27
28 # XXX validate the arguments
29
30 export RANDFILE=/dev/urandom
31 cd /etc/ssl
32
33 if [ ! -f ${sslkey}/ca.key ]; then
34 # CA
35 openssl genrsa -out $sslkey/ca.key 1024
36 cat <<EOF > $TMPFILE
37 [ req ]
38 default_bits           = 1024
39 default_keyfile        = ca.pem
40 distinguished_name     = req_distinguished_name
41 attributes             = req_attributes
42 prompt                 = no
43
44 [ req_distinguished_name ]
45 C                      = HR
46 O                      = $DOMAIN
47 CN                     = $FQDN CA
48 emailAddress           = $WEBMASTER
49
50 [ req_attributes ]
51
52 EOF
53 openssl req -config $TMPFILE -new -key ${sslkey}/ca.key -out ${sslkey}/ca.csr
54 cat >$TMPFILE <<EOT
55 extensions = x509v3
56 [ x509v3 ]
57 subjectAltName   = email:copy
58 basicConstraints = CA:true,pathlen:0
59 nsComment        = "CARNet apache2-cn package generated custom CA certificate"
60 nsCertType       = sslCA
61 EOT
62 openssl x509 -extfile $TMPFILE -days 3651 -signkey ${sslkey}/ca.key \
63   -in ${sslkey}/ca.csr -req -out ${sslcrt}/ca.pem
64 openssl x509 -noout -modulus -in ${sslcrt}/ca.pem | \
65   read mod1
66 openssl rsa -noout -modulus -in ${sslkey}/ca.key | \
67   read mod2
68 if [ "$mod1" != "$mod2" ]; then
69   echo "Moduli for CA keys don't match."
70   exit 1
71 fi
72 cd ${sslcrt}
73 ln -sf ca.pem $(openssl x509 -hash -noout -in ca.pem)
74
75 KEYS="${KEYS}
76  - ${sslcrt}/ca.pem"
77 KEYS="${KEYS}
78  - ${sslkey}/ca.key"
79
80 fi # CA
81
82 # server
83 openssl genrsa -out ${sslkey}/apache2.key 1024
84 echo 01 > "$TMPFILE2"
85 sed "s/HOST/$FQDN/g; s/DOMAIN/$DOMAIN/g; s/WEBMASTER/$WEBMASTER/g" \
86   <  $A2CNDIR/templates/openssl.cnf > "$TMPFILE"
87 openssl req -config "$TMPFILE" -new -nodes \
88   -key ${sslkey}/apache2.key -out ${sslkey}/apache2.csr
89 openssl x509 -extfile "$TMPFILE" -days 3650 \
90   -CAserial "$TMPFILE2" -CA ${sslcrt}/ca.pem -CAkey ${sslkey}/ca.key \
91   -in ${sslkey}/apache2.csr -req -out ${sslcrt}/apache2.pem
92 # verify
93 openssl x509 -noout -modulus -in ${sslcrt}/apache2.pem | read mod1
94 openssl rsa -noout -modulus -in ${sslkey}/apache2.key | read mod2
95 if [ "$mod1" != "$mod2" ]; then
96   echo "Moduli for server keys don't match."
97   exit 1
98 fi
99
100 KEYS="${KEYS}
101  - ${sslcrt}/apache2.pem"
102 KEYS="${KEYS}
103  - ${sslkey}/apache2.key"
104
105 cd ${sslcrt}
106 ln -sf apache2.pem $(openssl x509 -hash -noout -in apache2.pem)
107  
108 rm -f $TMPFILE $TMPFILE2
109
110 echo "Successfully generated server key pairs:"
111 echo "$KEYS"
112 echo