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