|
1 #!/bin/bash |
|
2 |
|
3 # This Source Code Form is subject to the terms of the Mozilla Public |
|
4 # License, v. 2.0. If a copy of the MPL was not distributed with this |
|
5 # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
|
6 |
|
7 ###################################################################################### |
|
8 # Server and client certs and crl generator functions. Generated files placed in a <dir> |
|
9 # directory to be accessible through http://<webserver>/iopr/TestCA.crt directory. |
|
10 # This functions is used for manual webserver configuration and it is not a part of |
|
11 # nss test run. |
|
12 # To create certs use the following command: |
|
13 # sh cert_iopr.sh cert_gen <dir> <cert name> [cert req] |
|
14 # Where: |
|
15 # dir - directory where to place created files |
|
16 # cert name - name of created server cert(FQDN) |
|
17 # cert req - cert request to be used for cert generation. |
|
18 # |
|
19 repAndExec() { |
|
20 echo |
|
21 if [ "$1" = "certutil" -a "$2" = "-R" -o "$2" = "-S" ]; then |
|
22 shift |
|
23 echo certutil -s "$CU_SUBJECT" $@ |
|
24 certutil -s "$CU_SUBJECT" $@ |
|
25 RET=$? |
|
26 else |
|
27 echo $@ |
|
28 $@ |
|
29 RET=$? |
|
30 fi |
|
31 |
|
32 return $RET |
|
33 } |
|
34 |
|
35 setExtData() { |
|
36 extData=$1 |
|
37 |
|
38 fldNum=0 |
|
39 extData=`echo $extData | sed 's/,/ /g'` |
|
40 for extDT in $extData; do |
|
41 if [ $fldNum -eq 0 ]; then |
|
42 eval extType=$extDT |
|
43 fldNum=1 |
|
44 continue |
|
45 fi |
|
46 eval data${fldNum}=$extDT |
|
47 fldNum=`expr $fldNum + 1` |
|
48 done |
|
49 } |
|
50 |
|
51 signCert() { |
|
52 dir=$1 |
|
53 crtDir=$2 |
|
54 crtName=$3 |
|
55 crtSN=$4 |
|
56 req=$5 |
|
57 cuAddParam=$6 |
|
58 extList=$7 |
|
59 |
|
60 if [ -z "$certSigner" ]; then |
|
61 certSigner=TestCA |
|
62 fi |
|
63 |
|
64 extCmdLine="" |
|
65 extCmdFile=$dir/extInFile; rm -f $extCmdFile |
|
66 touch $extCmdFile |
|
67 extList=`echo $extList | sed 's/;/ /g'` |
|
68 for ext in $extList; do |
|
69 setExtData $ext |
|
70 [ -z "$extType" ] && echo "incorrect extention format" && return 1 |
|
71 case $extType in |
|
72 ocspDR) |
|
73 extCmdLine="$extCmdLine -6" |
|
74 cat <<EOF >> $extCmdFile |
|
75 5 |
|
76 9 |
|
77 y |
|
78 EOF |
|
79 break |
|
80 exit 1 |
|
81 ;; |
|
82 AIA) |
|
83 extCmdLine="$extCmdLine -9" |
|
84 cat <<EOF >> $extCmdFile |
|
85 2 |
|
86 7 |
|
87 $data1 |
|
88 0 |
|
89 n |
|
90 n |
|
91 EOF |
|
92 break |
|
93 ;; |
|
94 *) |
|
95 echo "Unsupported extension type: $extType" |
|
96 break |
|
97 ;; |
|
98 esac |
|
99 done |
|
100 echo "cmdLine: $extCmdLine" |
|
101 echo "cmdFile: "`cat $extCmdFile` |
|
102 repAndExec \ |
|
103 certutil $cuAddParam -C -c $certSigner -m $crtSN -v 599 -d "${dir}" \ |
|
104 -i $req -o "$crtDir/${crtName}.crt" -f "${PW_FILE}" $extCmdLine <$extCmdFile 2>&1 |
|
105 return $RET |
|
106 } |
|
107 |
|
108 createSignedCert() { |
|
109 dir=$1 |
|
110 certDir=$2 |
|
111 certName=$3 |
|
112 certSN=$4 |
|
113 certSubj=$5 |
|
114 keyType=$6 |
|
115 extList=$7 |
|
116 |
|
117 echo Creating cert $certName-$keyType with SN=$certSN |
|
118 |
|
119 CU_SUBJECT="CN=$certName, E=${certName}-${keyType}@bogus.com, O=BOGUS NSS, L=Mountain View, ST=California, C=US" |
|
120 repAndExec \ |
|
121 certutil -R -d $dir -f "${PW_FILE}" -z "${NOISE_FILE}" \ |
|
122 -k $keyType -o $dir/req 2>&1 |
|
123 [ "$RET" -ne 0 ] && return $RET |
|
124 |
|
125 signCert $dir $dir $certName-$keyType $certSN $dir/req "" $extList |
|
126 ret=$? |
|
127 [ "$ret" -ne 0 ] && return $ret |
|
128 |
|
129 rm -f $dir/req |
|
130 |
|
131 repAndExec \ |
|
132 certutil -A -n ${certName}-$keyType -t "u,u,u" -d "${dir}" -f "${PW_FILE}" \ |
|
133 -i "$dir/${certName}-$keyType.crt" 2>&1 |
|
134 [ "$RET" -ne 0 ] && return $RET |
|
135 |
|
136 cp "$dir/${certName}-$keyType.crt" $certDir |
|
137 |
|
138 repAndExec \ |
|
139 pk12util -d $dir -o $certDir/$certName-$keyType.p12 -n ${certName}-$keyType \ |
|
140 -k ${PW_FILE} -W iopr |
|
141 [ "$RET" -ne 0 ] && return $RET |
|
142 return 0 |
|
143 } |
|
144 |
|
145 generateAndExportSSLCerts() { |
|
146 dir=$1 |
|
147 certDir=$2 |
|
148 serverName=$3 |
|
149 servCertReq=$4 |
|
150 |
|
151 if [ "$servCertReq" -a -f $servCertReq ]; then |
|
152 grep REQUEST $servCertReq >/dev/null 2>&1 |
|
153 signCert $dir $certDir ${serverName}_ext 501 $servCertReq `test $? -eq 0 && echo -a` |
|
154 ret=$? |
|
155 [ "$ret" -ne 0 ] && return $ret |
|
156 fi |
|
157 |
|
158 certName=$serverName |
|
159 createSignedCert $dir $certDir $certName 500 "$certSubj" rsa |
|
160 ret=$? |
|
161 [ "$ret" -ne 0 ] && return $ret |
|
162 |
|
163 createSignedCert $dir $certDir $certName 501 "$certSubj" dsa |
|
164 ret=$? |
|
165 [ "$ret" -ne 0 ] && return $ret |
|
166 |
|
167 certName=TestUser510 |
|
168 createSignedCert $dir $certDir $certName 510 "$certSubj" rsa |
|
169 ret=$? |
|
170 [ "$ret" -ne 0 ] && return $ret |
|
171 |
|
172 certName=TestUser511 |
|
173 createSignedCert $dir $certDir $certName 511 "$certSubj" dsa |
|
174 ret=$? |
|
175 [ "$ret" -ne 0 ] && return $ret |
|
176 |
|
177 certName=TestUser512 |
|
178 createSignedCert $dir $certDir $certName 512 "$certSubj" rsa |
|
179 ret=$? |
|
180 [ "$ret" -ne 0 ] && return $ret |
|
181 |
|
182 certName=TestUser513 |
|
183 createSignedCert $dir $certDir $certName 513 "$certSubj" dsa |
|
184 ret=$? |
|
185 [ "$ret" -ne 0 ] && return $ret |
|
186 } |
|
187 |
|
188 generateAndExportOCSPCerts() { |
|
189 dir=$1 |
|
190 certDir=$2 |
|
191 |
|
192 certName=ocspTrustedResponder |
|
193 createSignedCert $dir $certDir $certName 525 "$certSubj" rsa |
|
194 ret=$? |
|
195 [ "$ret" -ne 0 ] && return $ret |
|
196 |
|
197 certName=ocspDesignatedResponder |
|
198 createSignedCert $dir $certDir $certName 526 "$certSubj" rsa ocspDR |
|
199 ret=$? |
|
200 [ "$ret" -ne 0 ] && return $ret |
|
201 |
|
202 certName=ocspTRTestUser514 |
|
203 createSignedCert $dir $certDir $certName 514 "$certSubj" rsa |
|
204 ret=$? |
|
205 [ "$ret" -ne 0 ] && return $ret |
|
206 |
|
207 certName=ocspTRTestUser516 |
|
208 createSignedCert $dir $certDir $certName 516 "$certSubj" rsa |
|
209 ret=$? |
|
210 [ "$ret" -ne 0 ] && return $ret |
|
211 |
|
212 certName=ocspRCATestUser518 |
|
213 createSignedCert $dir $certDir $certName 518 "$certSubj" rsa \ |
|
214 AIA,http://dochinups.red.iplanet.com:2561 |
|
215 ret=$? |
|
216 [ "$ret" -ne 0 ] && return $ret |
|
217 |
|
218 certName=ocspRCATestUser520 |
|
219 createSignedCert $dir $certDir $certName 520 "$certSubj" rsa \ |
|
220 AIA,http://dochinups.red.iplanet.com:2561 |
|
221 ret=$? |
|
222 [ "$ret" -ne 0 ] && return $ret |
|
223 |
|
224 certName=ocspDRTestUser522 |
|
225 createSignedCert $dir $certDir $certName 522 "$certSubj" rsa \ |
|
226 AIA,http://dochinups.red.iplanet.com:2562 |
|
227 ret=$? |
|
228 [ "$ret" -ne 0 ] && return $ret |
|
229 |
|
230 certName=ocspDRTestUser524 |
|
231 createSignedCert $dir $certDir $certName 524 "$certSubj" rsa \ |
|
232 AIA,http://dochinups.red.iplanet.com:2562 |
|
233 ret=$? |
|
234 [ "$ret" -ne 0 ] && return $ret |
|
235 |
|
236 generateAndExportCACert $dir "" TestCA-unknown |
|
237 [ $? -ne 0 ] && return $ret |
|
238 |
|
239 certSigner=TestCA-unknown |
|
240 |
|
241 certName=ocspTRUnkownIssuerCert |
|
242 createSignedCert $dir $certDir $certName 531 "$certSubj" rsa |
|
243 ret=$? |
|
244 [ "$ret" -ne 0 ] && return $ret |
|
245 |
|
246 certName=ocspRCAUnkownIssuerCert |
|
247 createSignedCert $dir $certDir $certName 532 "$certSubj" rsa \ |
|
248 AIA,http://dochinups.red.iplanet.com:2561 |
|
249 ret=$? |
|
250 [ "$ret" -ne 0 ] && return $ret |
|
251 |
|
252 certName=ocspDRUnkownIssuerCert |
|
253 createSignedCert $dir $certDir $certName 533 "$certSubj" rsa \ |
|
254 AIA,http://dochinups.red.iplanet.com:2562 |
|
255 ret=$? |
|
256 [ "$ret" -ne 0 ] && return $ret |
|
257 |
|
258 certSigner="" |
|
259 |
|
260 return 0 |
|
261 } |
|
262 |
|
263 generateAndExportCACert() { |
|
264 dir=$1 |
|
265 certDirL=$2 |
|
266 caName=$3 |
|
267 |
|
268 certName=TestCA |
|
269 [ "$caName" ] && certName=$caName |
|
270 CU_SUBJECT="CN=NSS IOPR Test CA $$, E=${certName}@bogus.com, O=BOGUS NSS, L=Mountain View, ST=California, C=US" |
|
271 repAndExec \ |
|
272 certutil -S -n $certName -t "CTu,CTu,CTu" -v 600 -x -d ${dir} -1 -2 \ |
|
273 -f ${PW_FILE} -z ${NOISE_FILE} -m `expr $$ + 2238` >&1 <<EOF |
|
274 5 |
|
275 6 |
|
276 9 |
|
277 n |
|
278 y |
|
279 -1 |
|
280 n |
|
281 EOF |
|
282 |
|
283 if [ "$certDirL" ]; then |
|
284 repAndExec \ |
|
285 certutil -L -n $certName -r -d ${dir} -o $certDirL/$certName.crt |
|
286 [ "$RET" -ne 0 ] && return $RET |
|
287 |
|
288 repAndExec \ |
|
289 pk12util -d $dir -o $certDirL/$certName.p12 -n $certName -k ${PW_FILE} -W iopr |
|
290 [ "$RET" -ne 0 ] && return $RET |
|
291 fi |
|
292 } |
|
293 |
|
294 |
|
295 generateCerts() { |
|
296 certDir=$1 |
|
297 serverName=$2 |
|
298 reuseCACert=$3 |
|
299 servCertReq=$4 |
|
300 |
|
301 [ -z "$certDir" ] && echo "Cert directory should not be empty" && exit 1 |
|
302 [ -z "$serverName" ] && echo "Server name should not be empty" && exit 1 |
|
303 |
|
304 mkdir -p $certDir |
|
305 [ $? -ne 0 ] && echo "Can not create dir: $certDir" && exit 1 |
|
306 |
|
307 |
|
308 dir=/tmp/db.$$ |
|
309 if [ -z "$reuseCACert" ]; then |
|
310 if [ -d "$dir" ]; then |
|
311 rm -f $dir |
|
312 fi |
|
313 |
|
314 PW_FILE=$dir/nss.pwd |
|
315 NOISE_FILE=$dir/nss.noise |
|
316 |
|
317 mkdir -p $dir |
|
318 [ $? -ne 0 ] && echo "Can not create dir: $dir" && exit 1 |
|
319 |
|
320 echo nss > $PW_FILE |
|
321 date >> ${NOISE_FILE} 2>&1 |
|
322 |
|
323 repAndExec \ |
|
324 certutil -d $dir -N -f $PW_FILE |
|
325 [ "$RET" -ne 0 ] && return $RET |
|
326 |
|
327 generateAndExportCACert $dir $certDir |
|
328 [ "$RET" -ne 0 ] && return $RET |
|
329 else |
|
330 dir=$reuseCACert |
|
331 PW_FILE=$dir/nss.pwd |
|
332 NOISE_FILE=$dir/nss.noise |
|
333 hasKey=`repAndExec certutil -d $dir -L | grep TestCA | grep CTu` |
|
334 [ -z "$hasKey" ] && echo "reuse CA cert has not priv key" && \ |
|
335 return $RET; |
|
336 fi |
|
337 |
|
338 generateAndExportSSLCerts $dir $certDir $serverName $servCertReq |
|
339 [ "$RET" -ne 0 ] && return $RET |
|
340 |
|
341 generateAndExportOCSPCerts $dir $certDir |
|
342 [ "$RET" -ne 0 ] && return $RET |
|
343 |
|
344 crlUpdate=`date +%Y%m%d%H%M%SZ` |
|
345 crlNextUpdate=`echo $crlUpdate | sed 's/20/21/'` |
|
346 repAndExec \ |
|
347 crlutil -d $dir -G -n "TestCA" -f ${PW_FILE} -o $certDir/TestCA.crl <<EOF_CRLINI |
|
348 update=$crlUpdate |
|
349 nextupdate=$crlNextUpdate |
|
350 addcert 509-511 $crlUpdate |
|
351 addcert 516 $crlUpdate |
|
352 addcert 520 $crlUpdate |
|
353 addcert 524 $crlUpdate |
|
354 EOF_CRLINI |
|
355 [ "$RET" -ne 0 ] && return $RET |
|
356 |
|
357 rm -rf $dir |
|
358 return 0 |
|
359 } |
|
360 |
|
361 |
|
362 if [ -z "$1" -o -z "$2" ]; then |
|
363 echo "$0 <dest dir> <server cert name> [reuse CA cert] [cert req]" |
|
364 exit 1 |
|
365 fi |
|
366 generateCerts $1 $2 "$3" $4 |
|
367 exit $? |