Project

General

Profile

Download (19.1 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/*
3
	system_crlmanager.php
4
	
5
	Copyright (C) 2010 Jim Pingle
6
	All rights reserved.
7
	
8
	Redistribution and use in source and binary forms, with or without
9
	modification, are permitted provided that the following conditions are met:
10
	
11
	1. Redistributions of source code must retain the above copyright notice,
12
	this list of conditions and the following disclaimer.
13
	
14
	2. Redistributions in binary form must reproduce the above copyright
15
	notice, this list of conditions and the following disclaimer in the
16
	documentation and/or other materials provided with the distribution.
17
	
18
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
19
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
20
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
21
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
22
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
	POSSIBILITY OF SUCH DAMAGE.
28
*/
29
/*
30
	pfSense_MODULE:	certificate_managaer
31
*/
32

    
33
##|+PRIV
34
##|*IDENT=page-system-crlmanager
35
##|*NAME=System: CRL Manager
36
##|*DESCR=Allow access to the 'System: CRL Manager' page.
37
##|*MATCH=system_crlmanager.php*
38
##|-PRIV
39

    
40
require("guiconfig.inc");
41
require_once("certs.inc");
42

    
43
global $openssl_crl_status;
44

    
45
$pgtitle = array(gettext("System"), gettext("Certificate Revocation List Manager"));
46

    
47
$crl_methods = array(
48
	"internal" => gettext("Create an internal Certificate Revocation List"),
49
	"existing" => gettext("Import an existing Certificate Revocation List"));
50

    
51
$id = $_GET['id'];
52
if (isset($_POST['id']))
53
	$id = $_POST['id'];
54

    
55
if (!is_array($config['ca']))
56
	$config['ca'] = array();
57

    
58
$a_ca =& $config['ca'];
59

    
60
if (!is_array($config['cert']))
61
	$config['cert'] = array();
62

    
63
$a_cert =& $config['cert'];
64

    
65
if (!is_array($config['crl']))
66
	$config['crl'] = array();
67

    
68
$a_crl =& $config['crl'];
69

    
70
foreach ($a_crl as $cid => $acrl)
71
	if (!isset($acrl['refid']))
72
		unset ($a_crl[$cid]);
73

    
74
$act = $_GET['act'];
75
if ($_POST['act'])
76
	$act = $_POST['act'];
77

    
78
if (!empty($id))
79
	$thiscrl =& lookup_crl($id);
80

    
81
// If we were given an invalid crlref in the id, no sense in continuing as it would only cause errors.
82
if (!$thiscrl && (($act != "") && ($act != "new"))) {
83
	pfSenseHeader("system_crlmanager.php");
84
	$act="";
85
	$savemsg = gettext("Invalid CRL reference.");
86
}
87

    
88
if ($act == "del") {
89
	$name = $thiscrl['descr'];
90
	if (crl_in_use($id)) {
91
		$savemsg = sprintf(gettext("Certificate Revocation List %s is in use and cannot be deleted"), $name) . "<br/>";
92
	} else {
93
		foreach ($a_crl as $cid => $acrl)
94
			if ($acrl['refid'] == $thiscrl['refid'])
95
				unset($a_crl[$cid]);
96
		write_config("Deleted CRL {$name}.");
97
		$savemsg = sprintf(gettext("Certificate Revocation List %s successfully deleted"), $name) . "<br/>";
98
	}
99
}
100

    
101
if ($act == "new") {
102
	$pconfig['method'] = $_GET['method'];
103
	$pconfig['caref'] = $_GET['caref'];
104
	$pconfig['lifetime'] = "9999";
105
	$pconfig['serial'] = "0";
106
}
107

    
108
if ($act == "exp") {
109
	$exp_name = urlencode("{$thiscrl['descr']}.crl");
110
	$exp_data = base64_decode($thiscrl['text']);
111
	$exp_size = strlen($exp_data);
112

    
113
	header("Content-Type: application/octet-stream");
114
	header("Content-Disposition: attachment; filename={$exp_name}");
115
	header("Content-Length: $exp_size");
116
	echo $exp_data;
117
	exit;
118
}
119

    
120
if ($act == "addcert") {
121
	if ($_POST) {
122
		unset($input_errors);
123
		$pconfig = $_POST;
124

    
125
		if (!$pconfig['crlref'] || !$pconfig['certref']) {
126
			pfSenseHeader("system_crlmanager.php");
127
			exit;
128
		}
129

    
130
		// certref, crlref
131
		$crl =& lookup_crl($pconfig['crlref']);
132
		$cert = lookup_cert($pconfig['certref']);
133

    
134
		if (!$crl['caref'] || !$cert['caref']) {
135
			$input_errors[] = gettext("Both the Certificate and CRL must be specified.");
136
		}
137

    
138
		if ($crl['caref'] != $cert['caref']) {
139
			$input_errors[] = gettext("CA mismatch between the Certificate and CRL. Unable to Revoke.");
140
		}
141
		if (!is_crl_internal($crl)) {
142
			$input_errors[] = gettext("Cannot revoke certificates for an imported/external CRL.");
143
		}
144

    
145
		if (!$input_errors) {
146
			$reason = (empty($pconfig['crlreason'])) ? OCSP_REVOKED_STATUS_UNSPECIFIED : $pconfig['crlreason'];
147
			cert_revoke($cert, $crl, $reason);
148
			write_config("Revoked cert {$cert['descr']} in CRL {$crl['descr']}.");
149
			require_once('openvpn.inc');
150
			openvpn_refresh_crls();
151
			pfSenseHeader("system_crlmanager.php");
152
			exit;
153
		}
154
	}
155
}
156

    
157
if ($act == "delcert") {
158
	if (!is_array($thiscrl['cert'])) {
159
		pfSenseHeader("system_crlmanager.php");
160
		exit;
161
	}
162
	$found = false;
163
	foreach ($thiscrl['cert'] as $acert) {
164
		if ($acert['refid'] == $_GET['certref']) {
165
			$found = true;
166
			$thiscert = $acert;
167
		}
168
	}
169
	if (!$found) {
170
		pfSenseHeader("system_crlmanager.php");
171
		exit;
172
	}
173
	$name = $thiscert['descr'];
174
	if (cert_unrevoke($thiscert, $thiscrl)) {
175
		write_config(sprintf(gettext("Deleted Certificate %s from CRL %s"), $name, $thiscrl['descr']));
176
		$savemsg = sprintf(gettext("Deleted Certificate %s from CRL %s"), $name, $thiscrl['descr']) . "<br/>";
177
		require_once('openvpn.inc');
178
		openvpn_refresh_crls();
179
	} else {
180
		$savemsg = sprintf(gettext("Failed to delete Certificate %s from CRL %s"), $name, $thiscrl['descr']) . "<br/>";
181
	}
182
	$act="edit";
183
}
184

    
185
if ($_POST) {
186

    
187
	unset($input_errors);
188
	$pconfig = $_POST;
189

    
190
	/* input validation */
191
	if ($pconfig['method'] == "existing") {
192
		$reqdfields = explode(" ", "descr crltext");
193
		$reqdfieldsn = array(
194
				gettext("Descriptive name"),
195
				gettext("Certificate Revocation List data"));
196
	}
197
	if ($pconfig['method'] == "internal") {
198
		$reqdfields = explode(" ",
199
				"descr caref");
200
		$reqdfieldsn = array(
201
				gettext("Descriptive name"),
202
				gettext("Certificate Authority"));
203
	}
204

    
205
	do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors);
206

    
207
	/* if this is an AJAX caller then handle via JSON */
208
	if (isAjax() && is_array($input_errors)) {
209
		input_errors2Ajax($input_errors);
210
		exit;
211
	}
212

    
213
	/* save modifications */
214
	if (!$input_errors) {
215
		$result = false;
216

    
217
		$crl = array();
218
		$crl['refid'] = uniqid();
219
		if ($thiscrl)
220
			$crl =& $thiscrl;
221

    
222
		$crl['descr'] = $pconfig['descr'];
223
		$crl['caref'] = $pconfig['caref'];
224

    
225
		if ($pconfig['method'] == "existing") {
226
			$crl['text'] == base64_encode($pconfig['crltext']);
227
		}
228

    
229
		if ($pconfig['method'] == "internal") {
230
			$crl['serial'] = empty($pconfig['serial']) ? 9999 : $pconfig['serial'];
231
			$crl['lifetime'] = empty($pconfig['lifetime']) ? 9999 : $pconfig['lifetime'];
232
			$crl['cert'] = array();
233
		}
234

    
235
		if (!$thiscrl)
236
			$a_crl[] = $crl;
237

    
238
		write_config("Saved CRL {$crl['caref']}");
239

    
240
		pfSenseHeader("system_crlmanager.php");
241
	}
242
}
243

    
244
include("head.inc");
245
?>
246

    
247
<body link="#000000" vlink="#000000" alink="#000000" onload="<?= $jsevents["body"]["onload"] ?>">
248
<?php include("fbegin.inc"); ?>
249
<script type="text/javascript">
250
<!--
251

    
252
function method_change() {
253

    
254
	method = document.iform.method.selectedIndex;
255

    
256
	switch (method) {
257
		case 0:
258
			document.getElementById("existing").style.display="none";
259
			document.getElementById("internal").style.display="";
260
			break;
261
		case 1:
262
			document.getElementById("existing").style.display="";
263
			document.getElementById("internal").style.display="none";
264
			break;
265
	}
266
}
267

    
268
//-->
269
</script>
270
<?php
271
	if ($input_errors)
272
		print_input_errors($input_errors);
273
	if ($savemsg)
274
		print_info_box($savemsg);
275
?>
276
<table width="100%" border="0" cellpadding="0" cellspacing="0">
277
	<tr>
278
		<td>
279
		<?php
280
			$tab_array = array();
281
			$tab_array[] = array(gettext("CAs"), false, "system_camanager.php");
282
			$tab_array[] = array(gettext("Certificates"), false, "system_certmanager.php");
283
			$tab_array[] = array(gettext("Certificate Revocation"), true, "system_crlmanager.php");
284
			display_top_tabs($tab_array);
285
		?>
286
		</td>
287
	</tr>
288
	<tr>
289
		<td id="mainarea">
290
			<div class="tabcont">
291

    
292
				<?php if ($act == "new" || $act == gettext("Save") || $input_errors): ?>
293

    
294
				<form action="system_crlmanager.php" method="post" name="iform" id="iform">
295
					<table width="100%" border="0" cellpadding="6" cellspacing="0">
296
						<?php if (!isset($id)): ?>
297
						<tr>
298
							<td width="22%" valign="top" class="vncellreq"><?=gettext("Method");?></td>
299
							<td width="78%" class="vtable">
300
								<select name='method' id='method' class="formselect" onchange='method_change()'>
301
								<?php
302
									foreach($crl_methods as $method => $desc):
303
									$selected = "";
304
									if ($pconfig['method'] == $method)
305
										$selected = "selected";
306
								?>
307
									<option value="<?=$method;?>"<?=$selected;?>><?=$desc;?></option>
308
								<?php endforeach; ?>
309
								</select>
310
							</td>
311
						</tr>
312
						<?php endif; ?>
313
						<tr>
314
							<td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
315
							<td width="78%" class="vtable">
316
								<input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($pconfig['descr']);?>"/>
317
							</td>
318
						</tr>
319
						<tr>
320
							<td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate Authority");?></td>
321
							<td width="78%" class="vtable">
322
								<select name='caref' id='caref' class="formselect">
323
								<?php
324
									foreach($a_ca as $ca):
325
									$selected = "";
326
									if ($pconfig['caref'] == $ca['refid'])
327
										$selected = "selected";
328
								?>
329
									<option value="<?=$ca['refid'];?>"<?=$selected;?>><?=$ca['descr'];?></option>
330
								<?php endforeach; ?>
331
								</select>
332
							</td>
333
						</tr>
334
					</table>
335

    
336
					<table width="100%" border="0" cellpadding="6" cellspacing="0" id="existing">
337
						<tr>
338
							<td colspan="2" class="list" height="12"></td>
339
						</tr>
340
						<tr>
341
							<td colspan="2" valign="top" class="listtopic"><?=gettext("Existing Certificate Revocation List");?></td>
342
						</tr>
343

    
344
						<tr>
345
							<td width="22%" valign="top" class="vncellreq"><?=gettext("CRL data");?></td>
346
							<td width="78%" class="vtable">
347
								<textarea name="crltext" id="crltext" cols="65" rows="7" class="formfld_crl"><?=$pconfig['crltext'];?></textarea>
348
								<br>
349
								<?=gettext("Paste a Certificate Revocation List in X.509 CRL format here.");?></td>
350
							</td>
351
						</tr>
352
					</table>
353

    
354
					<table width="100%" border="0" cellpadding="6" cellspacing="0" id="internal">
355
						<tr>
356
							<td colspan="2" class="list" height="12"></td>
357
						</tr>
358
						<tr>
359
							<td colspan="2" valign="top" class="listtopic"><?=gettext("Internal Certificate Revocation List");?></td>
360
						</tr>
361
						<tr>
362
							<td width="22%" valign="top" class="vncellreq"><?=gettext("Lifetime");?></td>
363
							<td width="78%" class="vtable">
364
								<input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="5" value="<?=htmlspecialchars($pconfig['lifetime']);?>"/>
365
								<?=gettext("days");?><br/>
366
								<?=gettext("Default: 9999");?>
367
							</td>
368
						</tr>
369
						<tr>
370
							<td width="22%" valign="top" class="vncellreq"><?=gettext("Serial");?></td>
371
							<td width="78%" class="vtable">
372
								<input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="5" value="<?=htmlspecialchars($pconfig['serial']);?>"/>
373
								<br/>
374
								<?=gettext("Default: 0");?>
375
							</td>
376
						</tr>
377
					</table>
378

    
379
					<table width="100%" border="0" cellpadding="6" cellspacing="0">
380
						<tr>
381
							<td width="22%" valign="top">&nbsp;</td>
382
							<td width="78%">
383
								<input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
384
								<?php if (isset($id) && $thiscrl): ?>
385
								<input name="id" type="hidden" value="<?=$id;?>" />
386
								<?php endif;?>
387
							</td>
388
						</tr>
389
					</table>
390
				</form>
391
				<?php elseif ($act == "edit"): ?>
392
				<?php 	$crl = $thiscrl; ?>
393
				<form action="system_crlmanager.php" method="post" name="iform" id="iform">
394
				<table width="100%" border="0" cellpadding="0" cellspacing="0">
395
					<thead>
396
					<tr>
397
						<th width="90%" class="listhdrr" colspan="3"><b><?php echo gettext("Currently Revoked Certificates for CRL") . ': ' . $crl['descr']; ?></b></th>
398
						<th width="10%" class="list"></th>
399
					</tr>
400
					<tr>
401
						<th width="30%" class="listhdrr"><b><?php echo gettext("Certificate Name")?></b></th>
402
						<th width="30%" class="listhdrr"><b><?php echo gettext("Revocation Reason")?></b></th>
403
						<th width="30%" class="listhdrr"><b><?php echo gettext("Revoked At")?></b></th>
404
						<th width="10%" class="list"></th>
405
					</tr>
406
					</thead>
407
					<tbody>
408
				<?php /* List Certs on CRL */
409
					if (!is_array($crl['cert']) || (count($crl['cert']) == 0)): ?>
410
					<tr>
411
						<td class="listlr" colspan="3">
412
							&nbsp;&nbsp;&nbsp;&nbsp;<?php echo gettext("No Certificates Found for this CRL."); ?>
413
						</td>
414
						<td class="list">&nbsp;</td>
415
					</td>
416
				<?php	else:
417
					foreach($crl['cert'] as $i => $cert):
418
						$name = htmlspecialchars($cert['descr']);
419
				 ?>
420
					<tr>
421
						<td class="listlr">
422
							<?php echo $name; ?>
423
						</td>
424
						<td class="listlr">
425
							<?php echo $openssl_crl_status[$cert["reason"]]; ?>
426
						</td>
427
						<td class="listlr">
428
							<?php echo date("D M j G:i:s T Y", $cert["revoke_time"]); ?>
429
						</td>
430
						<td class="list">
431
							<a href="system_crlmanager.php?act=delcert&id=<?php echo $crl['refid']; ?>&certref=<?php echo $cert['refid']; ?>" onclick="return confirm('<?=gettext("Do you really want to delete this Certificate from the CRL?");?>')">
432
								<img src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("Delete this certificate from the CRL ");?>" alt="<?=gettext("Delete this certificate from the CRL ");?>" width="17" height="17" border="0" />
433
							</a>
434
						</td>
435
					</tr>
436
					<?php
437
					endforeach;
438
					endif;
439
					?>
440
				<?php /* Drop-down with other certs from this CA. */
441
					// Map Certs to CAs in one pass
442
					$ca_certs = array();
443
					foreach($a_cert as $cert)
444
						if ($cert['caref'] == $crl['caref'])
445
							$ca_certs[] = $cert;
446
					if (count($ca_certs) == 0): ?>
447
					<tr>
448
						<td class="listlr" colspan="3">
449
							&nbsp;&nbsp;&nbsp;&nbsp;<?php echo gettext("No Certificates Found for this CA."); ?>
450
						</td>
451
						<td class="list">&nbsp;</td>
452
					</td>
453
				<?php	else: ?>
454
					<tr>
455
						<td class="listlr" colspan="3" align="center">
456
							<b><?php echo gettext("Choose a Certificate to Revoke"); ?></b>: <select name='certref' id='certref' class="formselect">
457
				<?php	foreach($ca_certs as $cert): ?>
458
							<option value="<?=$cert['refid'];?>"><?=htmlspecialchars($cert['descr'])?></option>
459
				<?php	endforeach; ?>
460
							</select>
461
							<b><?php echo gettext("Reason");?></b>:
462
							<select name='crlreason' id='crlreason' class="formselect">
463
				<?php	foreach($openssl_crl_status as $code => $reason): ?>
464
							<option value="<?= $code ?>"><?= htmlspecialchars($reason) ?></option>
465
				<?php	endforeach; ?>
466
							</select>
467
							<input name="act" type="hidden" value="addcert" />
468
							<input name="crlref" type="hidden" value="<?=$crl['refid'];?>" />
469
							<input name="id" type="hidden" value="<?=$crl['refid'];?>" />
470
							<input id="submit" name="add" type="submit" class="formbtn" value="<?=gettext("Add"); ?>" />
471
						</td>
472
						<td class="list">&nbsp;</td>
473
					</tr>
474
				<?php	endif; ?>
475
					</tbody>
476
				</table>
477
				</form>
478
				<?php else: ?>
479

    
480
				<table width="100%" border="0" cellpadding="0" cellspacing="0">
481
					<thead>
482
					<tr>
483
						<td width="35%" class="listhdrr"><?=gettext("Name");?></td>
484
						<td width="10%" class="listhdrr"><?=gettext("Internal");?></td>
485
						<td width="35%" class="listhdrr"><?=gettext("Certificates");?></td>
486
						<td width="10%" class="listhdrr"><?=gettext("In Use");?></td>
487
						<td width="10%" class="list"></td>
488
					</tr>
489
					</thead>
490
					<tbody>
491
					<?php
492
						// Map CRLs to CAs in one pass
493
						$ca_crl_map = array();
494
						foreach($a_crl as $crl)
495
							$ca_crl_map[$crl['caref']][] = $crl['refid'];
496

    
497
						$i = 0;
498
						foreach($a_ca as $ca):
499
							$name = htmlspecialchars($ca['descr']);
500

    
501
							if($ca['prv']) {
502
								$caimg = "/themes/{$g['theme']}/images/icons/icon_frmfld_cert.png";
503
								$internal = "YES";
504
							} else 
505
								continue;
506
					?>
507
					<tr>
508
						<td class="listlr" colspan="4">
509
							<table border="0" cellpadding="0" cellspacing="0">
510
								<tr>
511
									<td align="left" valign="center">
512
										<img src="<?=$caimg;?>" alt="CA" title="CA" border="0" height="16" width="16" />
513
									</td>
514
									<td align="left" valign="middle">
515
										<?=$name;?>
516
									</td>
517
								</tr>
518
							</table>
519
						</td>
520
						<td class="list">
521
							<a href="system_crlmanager.php?act=new&caref=<?php echo $ca['refid']; ?>">
522
								<img src="/themes/<?= $g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("Add or Import CRL for ") . $ca['descr'];?>" alt="<?=gettext("add crl");?>" width="17" height="17" border="0" />
523
							</a>
524
						</td>
525
					</tr>
526
					
527
						<?php
528
						if (is_array($ca_crl_map[$ca['refid']])):
529
							foreach($ca_crl_map[$ca['refid']] as $crl):
530
								$tmpcrl = lookup_crl($crl);
531
								$internal = is_crl_internal($tmpcrl);
532
								$inuse = crl_in_use($tmpcrl['refid']);
533
						?>
534
					<tr>
535
						<td class="listlr"><?php echo $tmpcrl['descr']; ?></td>
536
						<td class="listr"><?php echo ($internal) ? "YES" : "NO"; ?></td>
537
						<td class="listr"><?php echo ($internal) ? count($tmpcrl['cert']) : "Unknown (imported)"; ?></td>
538
						<td class="listr"><?php echo ($inuse) ? "YES" : "NO"; ?></td>
539
						<td valign="middle" nowrap class="list">
540
							<a href="system_crlmanager.php?act=exp&id=<?=$tmpcrl['refid'];?>")">
541
								<img src="/themes/<?= $g['theme'];?>/images/icons/icon_down.gif" title="<?=gettext("Export CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" alt="<?=gettext("Export CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" width="17" height="17" border="0" />
542
							</a>
543
							<?php if ($internal): ?>
544
							<a href="system_crlmanager.php?act=edit&id=<?=$tmpcrl['refid'];?>")">
545
								<img src="/themes/<?= $g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("Edit CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" alt="<?=gettext("Edit CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" width="17" height="17" border="0" />
546
							</a>
547
							<?php endif; ?>
548
							<?php if (!$inuse): ?>
549
							<a href="system_crlmanager.php?act=del&id=<?=$tmpcrl['refid'];?>" onclick="return confirm('<?=gettext("Do you really want to delete this Certificate Revocation List?") . ' (' . htmlspecialchars($tmpcrl['descr']) . ')';?>')">
550
								<img src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("Delete CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" alt="<?=gettext("Delete CRL") . " " . htmlspecialchars($tmpcrl['descr']); ?>" width="17" height="17" border="0" />
551
							</a>
552
							<?php endif; ?>
553
						</td>
554
					</tr>
555
						<?php
556
								$i++;
557
							endforeach;
558
						endif;
559
						?>
560
					<tr><td colspan="5">&nbsp;</td></tr>
561
					<?php
562
							$i++;
563
						endforeach;
564
					?>
565
					</tbody>
566
					<tfoot>
567
					<tr>
568
						<td colspan="5">
569
							<p>
570
								<?=gettext("Additional Certificate Revocation Lists can be added here.");?>
571
							</p>
572
						</td>
573
					</tr>
574
					</tfoot>
575
				</table>
576

    
577
				<?php endif; ?>
578

    
579
			</div>
580
		</td>
581
	</tr>
582
</table>
583
<?php include("fend.inc");?>
584
<script type="text/javascript">
585
<!--
586

    
587
method_change();
588

    
589
//-->
590
</script>
591

    
592
</body>
(181-181/220)