Projet

Général

Profil

Télécharger (19,5 ko) Statistiques
| Branche: | Tag: | Révision:

univnautes / etc / inc / certs.inc @ c650b2f7

1
<?php
2
/* $Id$ */
3
/*
4
	Copyright (C) 2008 Shrew Soft Inc
5
	Copyright (C) 2010 Jim Pingle <jimp@pfsense.org>
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
		DISABLE_PHP_LINT_CHECKING
30
		pfSense_MODULE:	certificate_managaer
31
*/
32

    
33
define("OPEN_SSL_CONF_PATH", "/etc/ssl/openssl.cnf");
34

    
35
require_once("functions.inc");
36

    
37
global $openssl_digest_algs;
38
$openssl_digest_algs = array("sha1", "sha224", "sha256", "sha384", "sha512");
39

    
40
global $openssl_crl_status;
41
$openssl_crl_status = array(
42
	OCSP_REVOKED_STATUS_NOSTATUS              => "No Status (default)",
43
	OCSP_REVOKED_STATUS_UNSPECIFIED           => "Unspecified",
44
	OCSP_REVOKED_STATUS_KEYCOMPROMISE         => "Key Compromise",
45
	OCSP_REVOKED_STATUS_CACOMPROMISE          => "CA Compromise",
46
	OCSP_REVOKED_STATUS_AFFILIATIONCHANGED    => "Affiliation Changed",
47
	OCSP_REVOKED_STATUS_SUPERSEDED            => "Superseded",
48
	OCSP_REVOKED_STATUS_CESSATIONOFOPERATION  => "Cessation of Operation",
49
	OCSP_REVOKED_STATUS_CERTIFICATEHOLD       => "Certificate Hold"
50
);
51

    
52
function & lookup_ca($refid) {
53
	global $config;
54

    
55
	if (is_array($config['ca']))
56
		foreach ($config['ca'] as & $ca)
57
			if ($ca['refid'] == $refid)
58
				return $ca;
59

    
60
	return false;
61
}
62

    
63
function & lookup_ca_by_subject($subject) {
64
	global $config;
65

    
66
	if (is_array($config['ca']))
67
		foreach ($config['ca'] as & $ca)
68
		{
69
			$ca_subject = cert_get_subject($ca['crt']);
70
			if ($ca_subject == $subject)
71
				return $ca;
72
		}
73

    
74
	return false;
75
}
76

    
77
function & lookup_cert($refid) {
78
	global $config;
79

    
80
	if (is_array($config['cert']))
81
		foreach ($config['cert'] as & $cert)
82
			if ($cert['refid'] == $refid)
83
				return $cert;
84

    
85
	return false;
86
}
87

    
88
function & lookup_cert_by_name($name) {
89
	global $config;
90
	if (is_array($config['cert']))
91
		foreach ($config['cert'] as & $cert)
92
			if ($cert['descr'] == $name)
93
				return $cert;
94
}
95

    
96
function & lookup_crl($refid) {
97
	global $config;
98

    
99
	if (is_array($config['crl']))
100
		foreach ($config['crl'] as & $crl)
101
			if ($crl['refid'] == $refid)
102
				return $crl;
103

    
104
	return false;
105
}
106

    
107
function ca_chain_array(& $cert) {
108
	if($cert['caref']) {
109
		$chain = array();
110
		$crt = lookup_ca($cert['caref']);
111
		$chain[] = $crt;
112
		while ($crt) {
113
			$caref = $crt['caref'];
114
			if($caref)
115
				$crt = lookup_ca($caref);
116
			else
117
				$crt = false;
118
			if($crt)
119
				$chain[] = $crt;
120
		}
121
		return $chain;
122
	}
123
	return false;
124
}
125

    
126
function ca_chain(& $cert) {
127
	if($cert['caref']) {
128
		$ca = "";
129
		$cas = ca_chain_array($cert);
130
		if (is_array($cas))
131
			foreach ($cas as & $ca_cert)
132
			{
133
				$ca .= base64_decode($ca_cert['crt']);
134
				$ca .= "\n";
135
			}
136
		return $ca;
137
	}
138
	return "";
139
}
140

    
141
function ca_import(& $ca, $str, $key="", $serial=0) {
142
	global $config;
143

    
144
	$ca['crt'] = base64_encode($str);
145
	if (!empty($key))
146
		$ca['prv'] = base64_encode($key);
147
	if (!empty($serial))
148
		$ca['serial'] = $serial;
149
	$subject = cert_get_subject($str, false);
150
	$issuer = cert_get_issuer($str, false);
151
	
152
	// Find my issuer unless self-signed
153
	if($issuer <> $subject) {
154
		$issuer_crt =& lookup_ca_by_subject($issuer);
155
		if($issuer_crt)
156
			$ca['caref'] = $issuer_crt['refid'];
157
	}
158

    
159
	/* Correct if child certificate was loaded first */
160
	if (is_array($config['ca']))
161
		foreach ($config['ca'] as & $oca)
162
		{
163
			$issuer = cert_get_issuer($oca['crt']);
164
			if($ca['refid']<>$oca['refid'] && $issuer==$subject)
165
				$oca['caref'] = $ca['refid'];
166
		}
167
	if (is_array($config['cert']))
168
		foreach ($config['cert'] as & $cert)
169
		{
170
			$issuer = cert_get_issuer($cert['crt']);
171
			if($issuer==$subject)
172
				$cert['caref'] = $ca['refid'];
173
		}
174
	return true;
175
}
176

    
177
function ca_create(& $ca, $keylen, $lifetime, $dn, $digest_alg = "sha256") {
178

    
179
	$args = array(
180
		"x509_extensions" => "v3_ca",
181
		"digest_alg" => $digest_alg,
182
		"private_key_bits" => (int)$keylen,
183
		"private_key_type" => OPENSSL_KEYTYPE_RSA,
184
		"encrypt_key" => false);
185

    
186
	// generate a new key pair
187
	$res_key = openssl_pkey_new($args);
188
	if (!$res_key) return false;
189

    
190
	// generate a certificate signing request
191
	$res_csr = openssl_csr_new($dn, $res_key, $args);
192
	if (!$res_csr) return false;
193

    
194
	// self sign the certificate
195
	$res_crt = openssl_csr_sign($res_csr, null, $res_key, $lifetime, $args);
196
	if (!$res_crt) return false;
197

    
198
	// export our certificate data
199
	if (!openssl_pkey_export($res_key, $str_key) ||
200
	    !openssl_x509_export($res_crt, $str_crt))
201
		return false;
202

    
203
	// return our ca information
204
	$ca['crt'] = base64_encode($str_crt);
205
	$ca['prv'] = base64_encode($str_key);
206
	$ca['serial'] = 0;
207

    
208
	return true;
209
}
210

    
211
function ca_inter_create(& $ca, $keylen, $lifetime, $dn, $caref, $digest_alg = "sha256") {
212
	// Create Intermediate Certificate Authority
213
	$signing_ca =& lookup_ca($caref);
214
	if (!$signing_ca)
215
		return false;
216

    
217
	$signing_ca_res_crt = openssl_x509_read(base64_decode($signing_ca['crt']));
218
	$signing_ca_res_key = openssl_pkey_get_private(array(0 => base64_decode($signing_ca['prv']) , 1 => ""));
219
	if (!$signing_ca_res_crt || !$signing_ca_res_key) return false;
220
	$signing_ca_serial = ++$signing_ca['serial'];
221

    
222
	$args = array(
223
		"x509_extensions" => "v3_ca",
224
		"digest_alg" => $digest_alg,
225
		"private_key_bits" => (int)$keylen,
226
		"private_key_type" => OPENSSL_KEYTYPE_RSA,
227
		"encrypt_key" => false);
228

    
229
	// generate a new key pair
230
	$res_key = openssl_pkey_new($args);
231
	if (!$res_key) return false;
232

    
233
	// generate a certificate signing request
234
	$res_csr = openssl_csr_new($dn, $res_key, $args);
235
	if (!$res_csr) return false;
236

    
237
	// Sign the certificate
238
	$res_crt = openssl_csr_sign($res_csr, $signing_ca_res_crt, $signing_ca_res_key, $lifetime, $args, $signing_ca_serial);
239
	if (!$res_crt) return false;
240

    
241
	// export our certificate data
242
	if (!openssl_pkey_export($res_key, $str_key) ||
243
	    !openssl_x509_export($res_crt, $str_crt))
244
		return false;
245

    
246
	// return our ca information
247
	$ca['crt'] = base64_encode($str_crt);
248
	$ca['prv'] = base64_encode($str_key);
249
	$ca['serial'] = 0;
250

    
251
	return true;
252
}
253

    
254
function cert_import(& $cert, $crt_str, $key_str) {
255

    
256
	$cert['crt'] = base64_encode($crt_str);
257
	$cert['prv'] = base64_encode($key_str);
258

    
259
	$subject = cert_get_subject($crt_str, false);
260
	$issuer = cert_get_issuer($crt_str, false);
261
	
262
	// Find my issuer unless self-signed
263
	if($issuer <> $subject) {
264
		$issuer_crt =& lookup_ca_by_subject($issuer);
265
		if($issuer_crt)
266
			$cert['caref'] = $issuer_crt['refid'];
267
	}
268
	return true;
269
}
270

    
271
function cert_create(& $cert, $caref, $keylen, $lifetime, $dn, $type="user", $digest_alg = "sha256") {
272

    
273
	$ca =& lookup_ca($caref);
274
	if (!$ca)
275
		return false;
276

    
277
	$ca_str_crt = base64_decode($ca['crt']);
278
	$ca_str_key = base64_decode($ca['prv']);
279
	$ca_res_crt = openssl_x509_read($ca_str_crt);
280
	$ca_res_key = openssl_pkey_get_private(array(0 => $ca_str_key, 1 => ""));
281
	if(!$ca_res_key) return false;
282
	$ca_serial = ++$ca['serial'];
283

    
284
	switch ($type) {
285
		case "ca":
286
			$cert_type = "v3_ca";
287
			break;
288
		case "server":
289
			$cert_type = "server";
290
			break;
291
		default:
292
			$cert_type = "usr_cert";
293
			break;
294
	}
295

    
296
	$args = array(
297
		"x509_extensions" => $cert_type,
298
		"digest_alg" => $digest_alg,
299
		"private_key_bits" => (int)$keylen,
300
		"private_key_type" => OPENSSL_KEYTYPE_RSA,
301
		"encrypt_key" => false);
302

    
303
	// generate a new key pair
304
	$res_key = openssl_pkey_new($args);
305
	if(!$res_key) return false;
306

    
307
	// generate a certificate signing request
308
	$res_csr = openssl_csr_new($dn, $res_key, $args);
309
	if(!$res_csr) return false;
310

    
311
	// self sign the certificate
312
	$res_crt = openssl_csr_sign($res_csr, $ca_res_crt, $ca_res_key, $lifetime,
313
				 $args, $ca_serial);
314
	if(!$res_crt) return false;
315

    
316
	// export our certificate data
317
	if (!openssl_pkey_export($res_key, $str_key) ||
318
	    !openssl_x509_export($res_crt, $str_crt))
319
		return false;
320

    
321
	// return our certificate information
322
	$cert['caref'] = $caref;
323
	$cert['crt'] = base64_encode($str_crt);
324
	$cert['prv'] = base64_encode($str_key);
325
	$cert['type'] = $type;
326

    
327
	return true;
328
}
329

    
330
function csr_generate(& $cert, $keylen, $dn, $digest_alg = "sha256") {
331

    
332
	$args = array(
333
		"x509_extensions" => "v3_req",
334
		"digest_alg" => $digest_alg,
335
		"private_key_bits" => (int)$keylen,
336
		"private_key_type" => OPENSSL_KEYTYPE_RSA,
337
		"encrypt_key" => false);
338

    
339
	// generate a new key pair
340
	$res_key = openssl_pkey_new($args);
341
	if(!$res_key) return false;
342

    
343
	// generate a certificate signing request
344
	$res_csr = openssl_csr_new($dn, $res_key, $args);
345
	if(!$res_csr) return false;
346

    
347
	// export our request data
348
	if (!openssl_pkey_export($res_key, $str_key) ||
349
	    !openssl_csr_export($res_csr, $str_csr))
350
		return false;
351

    
352
	// return our request information
353
	$cert['csr'] = base64_encode($str_csr);
354
	$cert['prv'] = base64_encode($str_key);
355

    
356
	return true;
357
}
358

    
359
function csr_complete(& $cert, $str_crt) {
360

    
361
	// return our request information
362
	$cert['crt'] = base64_encode($str_crt);
363
	unset($cert['csr']);
364

    
365
	return true;
366
}
367

    
368
function csr_get_subject($str_crt, $decode = true) {
369

    
370
	if ($decode)
371
		$str_crt = base64_decode($str_crt);
372

    
373
	$components = openssl_csr_get_subject($str_crt);
374

    
375
	if (empty($components) || !is_array($components))
376
		return "unknown";
377

    
378
	ksort($components);
379
	foreach ($components as $a => $v) {
380
		if (!strlen($subject))
381
			$subject = "{$a}={$v}";
382
		else
383
			$subject = "{$a}={$v}, {$subject}";
384
	}
385

    
386
	return $subject;
387
}
388

    
389
function cert_get_subject($str_crt, $decode = true) {
390

    
391
	if ($decode)
392
		$str_crt = base64_decode($str_crt);
393

    
394
	$inf_crt = openssl_x509_parse($str_crt);
395
	$components = $inf_crt['subject'];
396

    
397
	if (empty($components) || !is_array($components))
398
		return "unknown";
399

    
400
	ksort($components);
401
	foreach ($components as $a => $v) {
402
		if (is_array($v)) {
403
			ksort($v);
404
			foreach ($v as $w) {
405
				$asubject = "{$a}={$w}";
406
				$subject = (strlen($subject)) ? "{$asubject}, {$subject}" : $asubject;
407
			}
408
		} else {
409
			$asubject = "{$a}={$v}";
410
			$subject = (strlen($subject)) ? "{$asubject}, {$subject}" : $asubject;
411
		}
412
	}
413

    
414
	return $subject;
415
}
416

    
417
function cert_get_subject_array($crt) {
418
	$str_crt = base64_decode($crt);
419
	$inf_crt = openssl_x509_parse($str_crt);
420
	$components = $inf_crt['subject'];
421

    
422
	if (!is_array($components))
423
		return;
424

    
425
	$subject_array = array();
426

    
427
	foreach($components as $a => $v)
428
		$subject_array[] = array('a' => $a, 'v' => $v);
429

    
430
	return $subject_array;
431
}
432

    
433
function cert_get_subject_hash($crt) {
434
	$str_crt = base64_decode($crt);
435
	$inf_crt = openssl_x509_parse($str_crt);
436
	return $inf_crt['subject'];
437
}
438

    
439
function cert_get_issuer($str_crt, $decode = true) {
440

    
441
	if ($decode)
442
		$str_crt = base64_decode($str_crt);
443

    
444
	$inf_crt = openssl_x509_parse($str_crt);
445
	$components = $inf_crt['issuer'];
446
	
447
	if (empty($components) || !is_array($components))
448
		return "unknown";
449

    
450
	ksort($components);
451
	foreach ($components as $a => $v) {
452
		if (is_array($v)) {
453
			ksort($v);
454
			foreach ($v as $w) {
455
				$aissuer = "{$a}={$w}";
456
				$issuer = (strlen($issuer)) ? "{$aissuer}, {$issuer}" : $aissuer;
457
			}
458
		} else {
459
			$aissuer = "{$a}={$v}";
460
			$issuer = (strlen($issuer)) ? "{$aissuer}, {$issuer}" : $aissuer;
461
		}
462
	}
463

    
464
	return $issuer;
465
}
466

    
467
/* this function works on x509 (crt), rsa key (prv), and req(csr) */
468
function cert_get_modulus($str_crt, $decode = true, $type = "crt"){
469
	if ($decode)
470
		$str_crt = base64_decode($str_crt);
471

    
472
	$modulus = "";
473
	if ( in_array($type, array("crt", "prv", "csr")) ) {
474
			$type = str_replace( array("crt","prv","csr"), array("x509","rsa","req"), $type);
475
			$modulus = exec("echo \"{$str_crt}\" | openssl {$type} -noout -modulus");
476
	}
477
	return $modulus;
478
}
479
function csr_get_modulus($str_crt, $decode = true){
480
	return cert_get_modulus($str_crt, $decode, "csr");
481
}
482

    
483
function cert_get_purpose($str_crt, $decode = true) {
484
	if ($decode)
485
		$str_crt = base64_decode($str_crt);
486
	$crt_details = openssl_x509_parse($str_crt);
487
	$purpose = array();
488
	$purpose['ca'] = (stristr($crt_details['extensions']['basicConstraints'], 'CA:TRUE') === false) ? 'No': 'Yes';
489
	$purpose['server'] = ($crt_details['extensions']['nsCertType'] == "SSL Server") ? 'Yes': 'No';
490
	return $purpose;
491
}
492

    
493
function cert_get_dates($str_crt, $decode = true) {
494
	if ($decode)
495
		$str_crt = base64_decode($str_crt);
496
	$crt_details = openssl_x509_parse($str_crt);
497
	if ($crt_details['validFrom_time_t'] > 0)
498
		$start = date('r', $crt_details['validFrom_time_t']);
499
	if ($crt_details['validTo_time_t'] > 0)
500
		$end = date('r', $crt_details['validTo_time_t']);
501
	return array($start, $end);
502
}
503

    
504
function cert_get_serial($str_crt, $decode = true) {
505
	if ($decode)
506
		$str_crt = base64_decode($str_crt);
507
	$crt_details = openssl_x509_parse($str_crt);
508
	if (isset($crt_details['serialNumber']) && !empty($crt_details['serialNumber']))
509
		return $crt_details['serialNumber'];
510
	else
511
		return NULL;
512
}
513

    
514
function prv_get_modulus($str_crt, $decode = true){
515
	return cert_get_modulus($str_crt, $decode, "prv");
516
}
517

    
518
function is_user_cert($certref) {
519
	global $config;
520
	if (!is_array($config['system']['user']))
521
		return;
522
	foreach ($config['system']['user'] as $user) {
523
		if (!is_array($user['cert']))
524
			continue;
525
		foreach ($user['cert'] as $cert) {
526
			if ($certref == $cert)
527
				return true;
528
		}
529
	}
530
	return false;
531
}
532

    
533
function is_openvpn_server_cert($certref) {
534
	global $config;
535
	if (!is_array($config['openvpn']['openvpn-server']))
536
		return;
537
	foreach ($config['openvpn']['openvpn-server'] as $ovpns) {
538
		if ($ovpns['certref'] == $certref)
539
			return true;
540
	}
541
	return false;
542
}
543

    
544
function is_openvpn_client_cert($certref) {
545
	global $config;
546
	if (!is_array($config['openvpn']['openvpn-client']))
547
		return;
548
	foreach ($config['openvpn']['openvpn-client'] as $ovpnc) {
549
		if ($ovpnc['certref'] == $certref)
550
			return true;
551
	}
552
	return false;
553
}
554

    
555
function is_ipsec_cert($certref) {
556
	global $config;
557
	if (!is_array($config['ipsec']['phase1']))
558
		return;
559
	foreach ($config['ipsec']['phase1'] as $ipsec) {
560
		if ($ipsec['certref'] == $certref)
561
			return true;
562
	}
563
	return false;
564
}
565

    
566
function is_webgui_cert($certref) {
567
	global $config;
568
	if (($config['system']['webgui']['ssl-certref'] == $certref)
569
		&& ($config['system']['webgui']['protocol'] != "http"))
570
		return true;
571
}
572

    
573
function is_captiveportal_cert($certref) {
574
	global $config;
575
	if (!is_array($config['captiveportal']))
576
		return;
577
	foreach ($config['captiveportal'] as $portal) {
578
		if (isset($portal['enable']) && isset($portal['httpslogin']) && ($portal['certref'] == $certref))
579
			return true;
580
	}
581
	return false;
582
}
583

    
584
function cert_in_use($certref) {
585
	return (is_webgui_cert($certref) ||
586
		is_user_cert($certref) ||
587
		is_openvpn_server_cert($certref) ||
588
		is_openvpn_client_cert($certref) ||
589
		is_ipsec_cert($certref) ||
590
		is_captiveportal_cert($certref));
591
}
592

    
593
function crl_create(& $crl, $caref, $name, $serial=0, $lifetime=9999) {
594
	global $config;
595
	$ca =& lookup_ca($caref);
596
	if (!$ca)
597
		return false;
598
	$crl['descr'] = $name;
599
	$crl['caref'] = $caref;
600
	$crl['serial'] = $serial;
601
	$crl['lifetime'] = $lifetime;
602
	$crl['cert'] = array();
603
	$crl_res = crl_update($crl);
604
	$config['crl'][] = $crl;
605
	return $crl_res;
606
}
607

    
608
function crl_update(& $crl) {
609
	global $config;
610
	$ca =& lookup_ca($crl['caref']);
611
	if (!$ca)
612
		return false;
613
	// If we have text but no certs, it was imported and cannot be updated.
614
	if (($crl["method"] != "internal") && (!empty($crl['text']) && empty($crl['cert'])))
615
		return false;
616
	$crl['serial']++;
617
	$ca_str_crt = base64_decode($ca['crt']);
618
	$ca_str_key = base64_decode($ca['prv']);
619
	$crl_res = openssl_crl_new($ca_str_crt, $crl['serial'], $crl['lifetime']);
620
	if (is_array($crl['cert']) && (count($crl['cert']) > 0)) {
621
		foreach ($crl['cert'] as $cert) {
622
			openssl_crl_revoke_cert($crl_res, base64_decode($cert["crt"]), $cert["revoke_time"], $cert["reason"]);
623
		}
624
	}
625
	openssl_crl_export($crl_res, $crl_text, $ca_str_key);
626
	$crl['text'] = base64_encode($crl_text);
627
	return $crl_res;
628
}
629

    
630
function cert_revoke($cert, & $crl, $reason=OCSP_REVOKED_STATUS_UNSPECIFIED) {
631
	global $config;
632
	if (is_cert_revoked($cert, $crl['refid']))
633
		return true;
634
	// If we have text but no certs, it was imported and cannot be updated.
635
	if (!is_crl_internal($crl))
636
		return false;
637
	$cert["reason"] = $reason;
638
	$cert["revoke_time"] = time();
639
	$crl["cert"][] = $cert;
640
	crl_update($crl);
641
	return true;
642
}
643

    
644
function cert_unrevoke($cert, & $crl) {
645
	global $config;
646
	if (!is_crl_internal($crl))
647
		return false;
648
	foreach ($crl['cert'] as $id => $rcert) {
649
		if (($rcert['refid'] == $cert['refid']) || ($rcert['descr'] == $cert['descr'])) {
650
			unset($crl['cert'][$id]);
651
			if (count($crl['cert']) == 0) {
652
				// Protect against accidentally switching the type to imported, for older CRLs
653
				if (!isset($crl['method']))
654
					$crl['method'] = "internal";
655
				crl_update($crl);
656
			} else
657
				crl_update($crl);
658
			return true;
659
		}
660
	}
661
	return false;
662
}
663

    
664
/* Compare two certificates to see if they match. */
665
function cert_compare($cert1, $cert2) {
666
	/* Ensure two certs are identical by first checking that their issuers match, then
667
		subjects, then serial numbers, and finally the moduli. Anything less strict
668
		could accidentally count two similar, but different, certificates as
669
		being identical. */
670
	$c1 = base64_decode($cert1['crt']);
671
	$c2 = base64_decode($cert2['crt']);
672
	if ((cert_get_issuer($c1, false) == cert_get_issuer($c2, false))
673
		&& (cert_get_subject($c1, false) == cert_get_subject($c2, false))
674
		&& (cert_get_serial($c1, false) == cert_get_serial($c2, false))
675
		&& (cert_get_modulus($c1, false) == cert_get_modulus($c2, false)))
676
		return true;
677
	return false;
678
}
679

    
680
function is_cert_revoked($cert, $crlref = "") {
681
	global $config;
682
	if (!is_array($config['crl']))
683
		return false;
684

    
685
	if (!empty($crlref)) {
686
		$crl = lookup_crl($crlref);
687
		if (!is_array($crl['cert']))
688
			return false;
689
		foreach ($crl['cert'] as $rcert) {
690
			if (cert_compare($rcert, $cert))
691
				return true;
692
		}
693
	} else {
694
		foreach ($config['crl'] as $crl) {
695
			if (!is_array($crl['cert']))
696
				continue;
697
			foreach ($crl['cert'] as $rcert) {
698
				if (cert_compare($rcert, $cert))
699
					return true;
700
			}
701
		}
702
	}
703
	return false;
704
}
705

    
706
function is_openvpn_server_crl($crlref) {
707
	global $config;
708
	if (!is_array($config['openvpn']['openvpn-server']))
709
		return;
710
	foreach ($config['openvpn']['openvpn-server'] as $ovpns) {
711
		if (!empty($ovpns['crlref']) && ($ovpns['crlref'] == $crlref))
712
			return true;
713
	}
714
	return false;
715
}
716

    
717
// Keep this general to allow for future expansion. See cert_in_use() above.
718
function crl_in_use($crlref) {
719
	return (is_openvpn_server_crl($crlref));
720
}
721

    
722
function is_crl_internal($crl) {
723
	return (!(!empty($crl['text']) && empty($crl['cert'])) || ($crl["method"] == "internal"));
724
}
725

    
726
function cert_get_cn($crt, $isref = false) {
727
	/* If this is a certref, not an actual cert, look up the cert first */
728
	if ($isref) {
729
		$cert = lookup_cert($crt);
730
		/* If it's not a valid cert, bail. */
731
		if (!(is_array($cert) && !empty($cert['crt'])))
732
			return "";
733
		$cert = $cert['crt'];
734
	} else {
735
		$cert = $crt;
736
	}
737
	$sub = cert_get_subject_array($cert);
738
	if (is_array($sub)) {
739
		foreach ($sub as $s) {
740
			if (strtoupper($s['a']) == "CN")
741
				return $s['v'];
742
		}
743
	}
744
	return "";
745
}
746

    
747
?>
(9-9/68)