Neue Zertifikatsverwaltung
bernd authored 14 years ago
|
1) <?php
2)
3) require_once('inc/base.php');
|
CSR-Erstellung
bernd authored 14 years ago
|
4) require_once('inc/security.php');
|
Neue Zertifikatsverwaltung
bernd authored 14 years ago
|
5)
6) define("CERT_OK", 0);
7) define("CERT_INVALID", 1);
8) define("CERT_NOCHAIN", 2);
9)
10) function user_certs()
11) {
12) $uid = (int) $_SESSION['userinfo']['uid'];
13) $result = db_query("SELECT id, valid_from, valid_until, subject, cn FROM vhosts.certs WHERE uid=${uid}");
14) $ret = array();
15) while ($i = mysql_fetch_assoc($result))
16) $ret[] = $i;
17) DEBUG($ret);
18) return $ret;
19) }
20)
|
CSR-Erstellung
bernd authored 14 years ago
|
21) function user_csr()
22) {
23) $uid = (int) $_SESSION['userinfo']['uid'];
24) $result = db_query("SELECT id, created, hostname, bits FROM vhosts.csr WHERE uid=${uid}");
25) $ret = array();
26) while ($i = mysql_fetch_assoc($result))
27) $ret[] = $i;
28) DEBUG($ret);
29) return $ret;
30) }
|
Neue Zertifikatsverwaltung
bernd authored 14 years ago
|
31)
32) function cert_details($id)
33) {
34) $id = (int) $id;
35) $uid = (int) $_SESSION['userinfo']['uid'];
36)
|
CSR-Erstellung
bernd authored 14 years ago
|
37) $result = db_query("SELECT id, lastchange, valid_from, valid_until, subject, cn, cert, `key` FROM vhosts.certs WHERE uid={$uid} AND id={$id}");
|
Neue Zertifikatsverwaltung
bernd authored 14 years ago
|
38) if (mysql_num_rows($result) != 1)
|
Cert-Refresh
bernd authored 14 years ago
|
39) system_failure("Ungültiges Zertifikat #{$id}");
|
Neue Zertifikatsverwaltung
bernd authored 14 years ago
|
40) return mysql_fetch_assoc($result);
41) }
42)
43)
|
CSR-Erstellung
bernd authored 14 years ago
|
44) function csr_details($id)
45) {
46) $id = (int) $id;
47) $uid = (int) $_SESSION['userinfo']['uid'];
48)
49) $result = db_query("SELECT id, created, hostname, bits, csr, `key` FROM vhosts.csr WHERE uid={$uid} AND id={$id}");
50) if (mysql_num_rows($result) != 1)
51) system_failure("Ungültiger CSR");
52) return mysql_fetch_assoc($result);
53) }
54)
55)
|
Neue Zertifikatsverwaltung
bernd authored 14 years ago
|
56) function get_available_CAs()
57) {
58) $path = '/etc/apache2/certs/cabundle/';
59) $ret = glob($path.'*.pem');
60) if (! $ret)
61) system_failure("Konnte die CA-Zertifikate nicht laden");
62) DEBUG($ret);
63) return $ret;
64) }
65)
66)
|
Cert-Chain erkennen und ben...
bernd authored 13 years ago
|
67) function get_chain($cert)
68) {
69) $certdata = openssl_x509_parse($cert, true);
70) $issuer = mysql_real_escape_string($certdata['issuer']['CN']);
71) $result = db_query("SELECT id FROM vhosts.certchain WHERE cn='{$issuer}'");
72) if (mysql_num_rows($result) > 0)
73) {
74) $c = mysql_fetch_assoc($result);
75) //$chainfile = '/etc/apache2/certs/chains/'.$c['id'].'.pem';
76) DEBUG("identified fitting certificate chain #".$c['id']);
77) return $c['id'];
78) }
79) }
80)
81)
|
Neue Zertifikatsverwaltung
bernd authored 14 years ago
|
82) function validate_certificate($cert, $key)
83) {
|
Erlaube nur RSA- und DSA-Ze...
bernd authored 13 years ago
|
84) $certinfo = openssl_pkey_get_details(openssl_get_publickey($cert));
85) DEBUG($certinfo);
86) if ($certinfo['bits'] < 2048) {
87) warning("Dieser Schlüssel hat eine sehr geringe Bitlänge und ist daher als nicht besonders sicher einzustufen!");
88) }
89) if ($certinfo['type'] != OPENSSL_KEYTYPE_RSA && $certinfo['type'] != OPENSSL_KEYTYPE_DSA) {
90) system_failure("Dieser Schlüssel nutzt einen nicht unterstützten Algorithmus.");
91) }
92)
93)
|
Neue Zertifikatsverwaltung
bernd authored 14 years ago
|
94) if (openssl_x509_check_private_key($cert, $key) !== true)
95) {
96) DEBUG("Zertifikat und Key passen nicht zusammen");
97) return CERT_INVALID;
98) }
99)
|
Cert-Chain erkennen und ben...
bernd authored 13 years ago
|
100) $cacerts = array('/etc/ssl/certs');
101) $chain = get_chain($cert);
102) if ($chain)
103) {
104) $cacerts[] = '/etc/apache2/certs/chains/'.$chain.'.pem';
105) }
|
Neue Zertifikatsverwaltung
bernd authored 14 years ago
|
106)
107) if (openssl_x509_checkpurpose($cert, X509_PURPOSE_SSL_SERVER, $cacerts) !== true)
108) {
109) DEBUG('certificate was not validated as a server certificate with the available chain');
110) return CERT_NOCHAIN;
111) }
112)
113) return CERT_OK;
114) }
115)
116)
117) function parse_cert_details($cert)
118) {
119) $certdata = openssl_x509_parse($cert, true);
120) /*
121) name => /CN=*.bwurst.org
122) validFrom_time_t => 1204118790
123) validTo_time_t => 1267190790
124)
125)
126) */
|
Erlaube nur RSA- und DSA-Ze...
bernd authored 13 years ago
|
127) DEBUG($certdata);
|
Cert-Name ist Subject-CN un...
bernd authored 14 years ago
|
128) //return array('subject' => $certdata['name'], 'cn' => $certdata['subject']['CN'], 'valid_from' => date('Y-m-d', $certdata['validFrom_time_t']), 'valid_until' => date('Y-m-d', $certdata['validTo_time_t']));
|
Cert-Chain erkennen und ben...
bernd authored 13 years ago
|
129) return array('subject' => $certdata['subject']['CN'].' / '.$certdata['issuer']['O'], 'cn' => $certdata['subject']['CN'], 'valid_from' => date('Y-m-d', $certdata['validFrom_time_t']), 'valid_until' => date('Y-m-d', $certdata['validTo_time_t']), 'issuer' => $certdata['issuer']['CN']);
|
Neue Zertifikatsverwaltung
bernd authored 14 years ago
|
130) }
131)
132)
133) function save_cert($info, $cert, $key)
134) {
|
zertifikate und keys export...
hanno authored 14 years ago
|
135) openssl_pkey_export($key, $key);
136) openssl_x509_export($cert, $cert);
|
Neue Zertifikatsverwaltung
bernd authored 14 years ago
|
137) $subject = mysql_real_escape_string(filter_input_general($info['subject']));
138) $cn = mysql_real_escape_string(filter_input_general($info['cn']));
139) $valid_from = mysql_real_escape_string($info['valid_from']);
140) $valid_until = mysql_real_escape_string($info['valid_until']);
|
Cert-Chain erkennen und ben...
bernd authored 13 years ago
|
141) $chain = maybe_null( get_chain($cert) );
|
Neue Zertifikatsverwaltung
bernd authored 14 years ago
|
142) $cert = mysql_real_escape_string($cert);
143) $key = mysql_real_escape_string($key);
144) $uid = (int) $_SESSION['userinfo']['uid'];
145)
|
Cert-Chain erkennen und ben...
bernd authored 13 years ago
|
146) db_query("INSERT INTO vhosts.certs (uid, subject, cn, valid_from, valid_until, chain, cert, `key`) VALUES ({$uid}, '{$subject}', '{$cn}', '{$valid_from}', '{$valid_until}', {$chain}, '{$cert}', '{$key}')");
|
Neue Zertifikatsverwaltung
bernd authored 14 years ago
|
147) }
148)
|
Cert-Refresh
bernd authored 14 years ago
|
149)
|
neue Bilder, mehr SSL-Zerti...
bernd authored 14 years ago
|
150) function refresh_cert($id, $info, $cert, $key = NULL)
|
Cert-Refresh
bernd authored 14 years ago
|
151) {
|
zertifikate und keys export...
hanno authored 14 years ago
|
152) openssl_x509_export($cert, $cert);
|
Cert-Refresh
bernd authored 14 years ago
|
153) $id = (int) $id;
154) $oldcert = cert_details($id);
155) $cert = mysql_real_escape_string($cert);
156)
157) $valid_from = mysql_real_escape_string($info['valid_from']);
158) $valid_until = mysql_real_escape_string($info['valid_until']);
159)
|
chain auch beim refresh erm...
bernd authored 13 years ago
|
160) $chain = maybe_null( get_chain($cert) );
161)
|
neue Bilder, mehr SSL-Zerti...
bernd authored 14 years ago
|
162) $keyop = '';
|
zertifikate und keys export...
hanno authored 14 years ago
|
163) if ($key) {
164) openssl_pkey_export($key, $key);
|
neue Bilder, mehr SSL-Zerti...
bernd authored 14 years ago
|
165) $keyop = ", `key`='".mysql_real_escape_string($key)."'";
|
zertifikate und keys export...
hanno authored 14 years ago
|
166) }
|
chain auch beim refresh erm...
bernd authored 13 years ago
|
167) db_query("UPDATE vhosts.certs SET cert='{$cert}'{$keyop}, valid_from='{$valid_from}', valid_until='{$valid_until}', chain={$chain} WHERE id={$id} LIMIT 1");
|
Cert-Refresh
bernd authored 14 years ago
|
168) }
169)
170)
|
Neue Zertifikatsverwaltung
bernd authored 14 years ago
|
171) function delete_cert($id)
172) {
173) $uid = (int) $_SESSION['userinfo']['uid'];
174) $id = (int) $id;
175)
176) db_query("DELETE FROM vhosts.certs WHERE uid={$uid} AND id={$id} LIMIT 1");
177) }
178)
|
CSR-Erstellung
bernd authored 14 years ago
|
179) function delete_csr($id)
180) {
181) $uid = (int) $_SESSION['userinfo']['uid'];
182) $id = (int) $id;
183)
184) db_query("DELETE FROM vhosts.csr WHERE uid={$uid} AND id={$id} LIMIT 1");
185) }
186)
187) function create_wildcard_csr($cn, $bits)
188) {
189) $cn = filter_input_hostname($cn);
190) $bits = (int) $bits;
191) if ($bits == 0)
192) $bits = 4096;
193)
194) $keyfile = tempnam(ini_get('upload_tmp_dir'), 'key');
195) $csrfile = tempnam(ini_get('upload_tmp_dir'), 'csr');
196) $config = tempnam(ini_get('upload_tmp_dir'), 'config');
197)
198) DEBUG("key: ".$keyfile." / csr: ".$csrfile." / config: ".$config);
199)
200) $c = fopen($config, "w");
201) fwrite($c, "[req]
202) default_bits = {$bits}
203) default_keyfile = {$keyfile}
204) encrypt_key = no
205) distinguished_name = req_distinguished_name
206) req_extensions = v3_req
207)
208) [v3_req]
209) subjectAltName = DNS:{$cn}, DNS:*.{$cn}
210)
211) [ req_distinguished_name ]
212) countryName = Country Name (2 letter code)
213) countryName_default = DE
214) stateOrProvinceName = State or Province Name (full name)
215) stateOrProvinceName_default = Baden-Wuerttemberg
216) localityName = Locality Name (eg, city)
217) localityName_default = Murrhardt
218) 0.organizationName = Organization Name (eg, company)
219) 0.organizationName_default = schokokeks.org
220)
221) commonName = Common Name
222) commonName_default = *.{$cn}
223) ");
224) fclose($c);
225)
226) $output = '';
|
sha2 csrs
hanno authored 14 years ago
|
227) $cmdline = "openssl req -sha256 -new -batch -config {$config} -out {$csrfile}";
|
CSR-Erstellung
bernd authored 14 years ago
|
228) $retval = 0;
229) exec($cmdline, $output, $retval);
230) DEBUG($output);
231) DEBUG($retval);
232) if ($retval != 0)
233) {
234) system_failure("Die Erzeugung des CSR ist fehlgeschlagen. Ausgabe des OpenSSL-Befehls: ".$output);
235) }
236)
237) $csr = file_get_contents($csrfile);
238) $key = file_get_contents($keyfile);
239)
240) unlink($csrfile);
241) unlink($keyfile);
242) unlink($config);
243)
244) return array($csr, $key);
245) }
246)
247)
248)
249) function create_csr($cn, $bits)
250) {
251) $cn = filter_input_hostname($cn);
252) $bits = (int) $bits;
253) if ($bits == 0)
254) $bits = 4096;
255)
256) $keyfile = tempnam(ini_get('upload_tmp_dir'), 'key');
257) $csrfile = tempnam(ini_get('upload_tmp_dir'), 'csr');
258) $config = tempnam(ini_get('upload_tmp_dir'), 'config');
259)
260) DEBUG("key: ".$keyfile." / csr: ".$csrfile." / config: ".$config);
261)
262) $c = fopen($config, "w");
263) fwrite($c, "[req]
264) default_bits = {$bits}
265) default_keyfile = {$keyfile}
266) encrypt_key = no
267) distinguished_name = req_distinguished_name
268)
269) [ req_distinguished_name ]
270) countryName = Country Name (2 letter code)
271) countryName_default = DE
272) stateOrProvinceName = State or Province Name (full name)
273) stateOrProvinceName_default = Baden-Wuerttemberg
274) localityName = Locality Name (eg, city)
275) localityName_default = Murrhardt
276) 0.organizationName = Organization Name (eg, company)
277) 0.organizationName_default = schokokeks.org
278)
279) commonName = Common Name
280) commonName_default = {$cn}
281) ");
282) fclose($c);
283)
284) $output = '';
|
sha2 csrs
hanno authored 14 years ago
|
285) $cmdline = "openssl req -sha256 -new -batch -config {$config} -out {$csrfile}";
|