Logoj0ke.net Open Build Service > Projects > Apache > apache2 > gensslcert
Sign Up | Log In

File gensslcert of Package apache2 (Revision 36)

Currently displaying revision 36, show latest

 
1
#!/bin/bash
2
# Peter Poeml <apache@suse.de>
3
#
4
# Script to generate ssl keys for mod_ssl, without requiring user input
5
# most of it is copied from mkcert.sh of the mod_ssl distribution
6
#
7
# XXX This is just a hack, it won't be able to do anything you want!
8
#
9
10
function usage
11
{
12
    cat <<-EOF
13
    `basename $0` will generate a test certificate "the quick way", i.e. without interaction.
14
    You can change some defaults however.
15
    It will overwrite /root/.mkcert.cfg
16
17
    These options are recognized:       Default:
18
19
    -C  Common name             "$name"
20
    -N  comment             "$comment"
21
    -c  country (two letters, e.g. DE)  $C
22
    -s  state               $ST
23
    -l  city                $L
24
    -o  organisation            "$O"
25
    -u  organisational unit     "$U"
26
    -n  fully qualified domain name $CN (\$FQHOSTNAME)
27
    -e  email address of webmaster  webmaster@$CN
28
    -y      days server cert is valid for   $srvdays
29
    -Y      days CA cert is valid for       $CAdays
30
    -d  run in debug mode           
31
    -h      show usage
32
    EOF
33
}
34
35
36
test -t && { BRIGHT='[01m'; RED='[31m'; NORMAL='[00m'; }
37
function myecho { echo $BRIGHT$@$NORMAL; }
38
function error { echo $RED$@$NORMAL; }
39
function myexit { error something ugly seems to have happened in line $1...; exit $2; }
40
41
r=$ROOT
42
. $r/etc/sysconfig/network/config
43
FQHOSTNAME=`cat /etc/HOSTNAME`
44
45
# defaults
46
  comment="mod_ssl server certificate"
47
     name=
48
        C=XY
49
       ST=unknown
50
        L=unknown
51
        U="web server"
52
    O="SuSE Linux Web Server"
53
       CN=$FQHOSTNAME
54
    email=webmaster@$FQHOSTNAME
55
   CAdays=$((365 * 6))
56
  srvdays=$((365 * 2))
57
58
while getopts C:N:c:s:l:o:u:n:e:y:dh OPT; do
59
    case $OPT in
60
        C) name=$OPTARG-;;
61
        N) comment=$OPTARG;;
62
        c) C=$OPTARG;;
63
        s) ST=$OPTARG;;
64
        l) L=$OPTARG;;
65
        u) U=$OPTARG;;
66
        o) O=$OPTARG;;
67
        n) CN=$OPTARG;;
68
        e) email=$OPTARG;;
69
    y) srvdays=$OPTARG;;
70
    Y) CAdays=$OPTARG;;
71
        d) set -x;;
72
    h) usage; exit 2;;
73
        *) echo unrecognized option: $OPT; usage; exit 2;;
74
    esac
75
done
76
77
GO_LEFT="\033[80D"
78
GO_MIDDLE="$GO_LEFT\033[15C"
79
for i in comment name C ST L U O CN email srvdays CAdays; do 
80
    eval "echo -e $i\"$GO_MIDDLE\" \$$i;"
81
done
82
83
84
openssl=$r/usr/bin/openssl
85
sslcrtdir=$r/etc/apache2/ssl.crt
86
sslcsrdir=$r/etc/apache2/ssl.csr
87
sslkeydir=$r/etc/apache2/ssl.key
88
sslprmdir=$r/etc/apache2/ssl.prm
89
90
#
91
# CA
92
#
93
echo;myecho creating CA key ...
94
$openssl genrsa -rand $r/var/log/y2log:$r/var/log/messages -out $sslkeydir/${name}ca.key 2048 || myexit $LINENO $?
95
96
cat >$r/root/.mkcert.cfg <<EOT
97
[ req ]
98
default_bits           = 1024
99
default_keyfile        = keyfile.pem
100
distinguished_name     = req_distinguished_name
101
attributes             = req_attributes
102
prompt                 = no
103
output_password        = mypass
104
105
[ req_distinguished_name ]
106
C                      = $C
107
ST                     = $ST
108
L                      = $L
109
O                      = $O
110
OU                     = CA
111
CN                     = $CN
112
emailAddress           = $email
113
114
[ req_attributes ]
115
challengePassword              = $RANDOM$RANDOMA challenge password
116
EOT
117
118
echo;myecho creating CA request/certificate ...
119
$openssl req -config $r/root/.mkcert.cfg -new -x509 -days $CAdays -key $sslkeydir/${name}ca.key -out $sslcrtdir/${name}ca.crt || myexit $LINENO $?
120
121
cp -pv $sslcrtdir/${name}ca.crt $r/srv/www/htdocs/$(echo $name | tr 'a-z' 'A-Z')CA.crt
122
123
#
124
# Server CERT
125
#
126
echo;myecho creating server key ...
127
$openssl genrsa -rand $r/etc/rc.config:$r/var/log/messages -out $sslkeydir/${name}server.key 1024 || myexit $LINENO $?
128
129
cat >$r/root/.mkcert.cfg <<EOT
130
[ req ]
131
default_bits           = 1024
132
default_keyfile        = keyfile.pem
133
distinguished_name     = req_distinguished_name
134
attributes             = req_attributes
135
prompt                 = no
136
output_password        = mypass
137
138
[ req_distinguished_name ]
139
C                      = $C
140
ST                     = $ST
141
L                      = $L
142
O                      = $O
143
OU                     = $U
144
CN                     = $CN
145
emailAddress           = $email
146
147
[ req_attributes ]
148
challengePassword              = $RANDOM$RANDOMA challenge password
149
EOT
150
151
echo;myecho creating server request ...
152
$openssl req -config $r/root/.mkcert.cfg -new -key $sslkeydir/${name}server.key -out $sslcsrdir/${name}server.csr || myexit $LINENO $?
153
154
155
cat >$r/root/.mkcert.cfg <<EOT
156
extensions = x509v3
157
[ x509v3 ]
158
subjectAltName   = email:copy
159
nsComment        = $comment
160
nsCertType       = server
161
EOT
162
163
164
test -f $r/root/.mkcert.serial || echo 01 >$r/root/.mkcert.serial
165
myecho "creating server certificate ..."
166
$openssl x509                   \
167
    -extfile $r/root/.mkcert.cfg            \
168
    -days $srvdays              \
169
    -CAserial $r/root/.mkcert.serial        \
170
    -CA $sslcrtdir/${name}ca.crt        \
171
    -CAkey $sslkeydir/${name}ca.key     \
172
    -in $sslcsrdir/${name}server.csr -req   \
173
    -out $sslcrtdir/${name}server.crt || myexit $LINENO $?
174
175
rm -f $r/root/.mkcert.cfg
176
177
178
179
180
echo;myecho "Verify: matching certificate & key modulus"
181
modcrt=`$openssl x509 -noout -modulus -in $sslcrtdir/${name}server.crt | sed -e 's;.*Modulus=;;' || myexit $LINENO $?`
182
modkey=`$openssl rsa -noout -modulus -in $sslkeydir/${name}server.key | sed -e 's;.*Modulus=;;' || myexit $LINENO $?`
183
184
if [ ".$modcrt" != ".$modkey" ]; then
185
    error "mkcert.sh:Error: Failed to verify modulus on resulting X.509 certificate" 1>&2
186
    myexit $LINENO $?
187
fi
188
189
echo;myecho Verify: matching certificate signature
190
    $openssl verify -CAfile $sslcrtdir/${name}ca.crt $sslcrtdir/${name}server.crt || myexit $LINENO $?
191
if [ $? -ne 0 ]; then
192
    error "mkcert.sh:Error: Failed to verify signature on resulting X.509 certificate" 1>&2
193
    myexit $LINENO $?
194
fi
195
196
197
exit 0
198
199