32ca16308ac603ec5302df18020f07389810efa9
bernd Neue Zertifikatsverwaltung

bernd authored 15 years ago

1) <?php
2) 
3) require_once('inc/base.php');
bernd CSR-Erstellung

bernd authored 15 years ago

4) require_once('inc/security.php');
bernd Neue Zertifikatsverwaltung

bernd authored 15 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) 
bernd CSR-Erstellung

bernd authored 15 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) }
bernd Neue Zertifikatsverwaltung

bernd authored 15 years ago

31) 
32) function cert_details($id)
33) {
34)   $id = (int) $id;
35)   $uid = (int) $_SESSION['userinfo']['uid'];
36)   
bernd CSR-Erstellung

bernd authored 15 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}");
bernd Neue Zertifikatsverwaltung

bernd authored 15 years ago

38)   if (mysql_num_rows($result) != 1)
bernd Cert-Refresh

bernd authored 15 years ago

39)     system_failure("Ungültiges Zertifikat #{$id}");
bernd Neue Zertifikatsverwaltung

bernd authored 15 years ago

40)   return mysql_fetch_assoc($result);
41) }
42) 
43) 
bernd CSR-Erstellung

bernd authored 15 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) 
bernd Neue Zertifikatsverwaltung

bernd authored 15 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) 
bernd Cert-Chain erkennen und ben...

bernd authored 14 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) 
bernd Neue Zertifikatsverwaltung

bernd authored 15 years ago

82) function validate_certificate($cert, $key)
83) {  
84)   if (openssl_x509_check_private_key($cert, $key) !== true)
85)   {
86)     DEBUG("Zertifikat und Key passen nicht zusammen");
87)     return CERT_INVALID;
88)   }
89) 
bernd Cert-Chain erkennen und ben...

bernd authored 14 years ago

90)   $cacerts = array('/etc/ssl/certs');
91)   $chain = get_chain($cert);
92)   if ($chain)
93)   {
94)     $cacerts[] = '/etc/apache2/certs/chains/'.$chain.'.pem';
95)   }
bernd Neue Zertifikatsverwaltung

bernd authored 15 years ago

96) 
97)   if (openssl_x509_checkpurpose($cert, X509_PURPOSE_SSL_SERVER, $cacerts) !== true)
98)   { 
99)     DEBUG('certificate was not validated as a server certificate with the available chain');
100)     return CERT_NOCHAIN;
101)   }
102) 
103)   return CERT_OK;
104) }
105) 
106) 
107) function parse_cert_details($cert)
108) {
109)   $certdata = openssl_x509_parse($cert, true);
110)   /* 
111) name => /CN=*.bwurst.org
112) validFrom_time_t => 1204118790
113) validTo_time_t => 1267190790
114) 
115) 
116)   */
117)  
bernd Cert-Name ist Subject-CN un...

bernd authored 14 years ago

118)   //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']));
bernd Cert-Chain erkennen und ben...

bernd authored 14 years ago

119)   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']);
bernd Neue Zertifikatsverwaltung

bernd authored 15 years ago

120) }
121) 
122) 
123) function save_cert($info, $cert, $key)
124) {
hanno zertifikate und keys export...

hanno authored 15 years ago

125)   openssl_pkey_export($key, $key);
126)   openssl_x509_export($cert, $cert);
bernd Neue Zertifikatsverwaltung

bernd authored 15 years ago

127)   $subject = mysql_real_escape_string(filter_input_general($info['subject']));
128)   $cn = mysql_real_escape_string(filter_input_general($info['cn']));
129)   $valid_from = mysql_real_escape_string($info['valid_from']);
130)   $valid_until = mysql_real_escape_string($info['valid_until']);
bernd Cert-Chain erkennen und ben...

bernd authored 14 years ago

131)   $chain = maybe_null( get_chain($cert) );
bernd Neue Zertifikatsverwaltung

bernd authored 15 years ago

132)   $cert = mysql_real_escape_string($cert);
133)   $key = mysql_real_escape_string($key);
134)   $uid = (int) $_SESSION['userinfo']['uid'];
135) 
bernd Cert-Chain erkennen und ben...

bernd authored 14 years ago

136)   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}')");
bernd Neue Zertifikatsverwaltung

bernd authored 15 years ago

137) }
138) 
bernd Cert-Refresh

bernd authored 15 years ago

139) 
bernd neue Bilder, mehr SSL-Zerti...

bernd authored 15 years ago

140) function refresh_cert($id, $info, $cert, $key = NULL)
bernd Cert-Refresh

bernd authored 15 years ago

141) {
hanno zertifikate und keys export...

hanno authored 15 years ago

142)   openssl_x509_export($cert, $cert);
bernd Cert-Refresh

bernd authored 15 years ago

143)   $id = (int) $id;
144)   $oldcert = cert_details($id);
145)   $cert = mysql_real_escape_string($cert);
146)   
147)   $valid_from = mysql_real_escape_string($info['valid_from']);
148)   $valid_until = mysql_real_escape_string($info['valid_until']);
149) 
bernd neue Bilder, mehr SSL-Zerti...

bernd authored 15 years ago

150)   $keyop = '';
hanno zertifikate und keys export...

hanno authored 15 years ago

151)   if ($key) {
152)     openssl_pkey_export($key, $key);
bernd neue Bilder, mehr SSL-Zerti...

bernd authored 15 years ago

153)     $keyop = ", `key`='".mysql_real_escape_string($key)."'";
hanno zertifikate und keys export...

hanno authored 15 years ago

154)   }
bernd neue Bilder, mehr SSL-Zerti...

bernd authored 15 years ago

155)   db_query("UPDATE vhosts.certs SET cert='{$cert}'{$keyop}, valid_from='{$valid_from}', valid_until='{$valid_until}' WHERE id={$id} LIMIT 1");
bernd Cert-Refresh

bernd authored 15 years ago

156) }
157) 
158) 
bernd Neue Zertifikatsverwaltung

bernd authored 15 years ago

159) function delete_cert($id)
160) {
161)   $uid = (int) $_SESSION['userinfo']['uid'];
162)   $id = (int) $id;
163)   
164)   db_query("DELETE FROM vhosts.certs WHERE uid={$uid} AND id={$id} LIMIT 1");
165) }
166) 
bernd CSR-Erstellung

bernd authored 15 years ago

167) function delete_csr($id)
168) {
169)   $uid = (int) $_SESSION['userinfo']['uid'];
170)   $id = (int) $id;
171)   
172)   db_query("DELETE FROM vhosts.csr WHERE uid={$uid} AND id={$id} LIMIT 1");
173) }
174) 
175) function create_wildcard_csr($cn, $bits)
176) {
177)   $cn = filter_input_hostname($cn);
178)   $bits = (int) $bits;
179)   if ($bits == 0)
180)     $bits = 4096;
181) 
182)   $keyfile = tempnam(ini_get('upload_tmp_dir'), 'key');
183)   $csrfile = tempnam(ini_get('upload_tmp_dir'), 'csr');
184)   $config = tempnam(ini_get('upload_tmp_dir'), 'config');
185) 
186)   DEBUG("key: ".$keyfile." / csr: ".$csrfile." / config: ".$config);
187) 
188)   $c = fopen($config, "w");
189)   fwrite($c, "[req]
190) default_bits = {$bits}
191) default_keyfile = {$keyfile}
192) encrypt_key = no
193) distinguished_name      = req_distinguished_name
194) req_extensions = v3_req
195) 
196) [v3_req]
197) subjectAltName = DNS:{$cn}, DNS:*.{$cn}
198) 
199) [ req_distinguished_name ]
200) countryName                     = Country Name (2 letter code)
201) countryName_default             = DE
202) stateOrProvinceName             = State or Province Name (full name)
203) stateOrProvinceName_default     = Baden-Wuerttemberg
204) localityName                    = Locality Name (eg, city)
205) localityName_default            = Murrhardt
206) 0.organizationName              = Organization Name (eg, company)
207) 0.organizationName_default      = schokokeks.org
208) 
209) commonName = Common Name
210) commonName_default = *.{$cn}
211) ");
212)   fclose($c);
213) 
214)   $output = '';
hanno sha2 csrs

hanno authored 14 years ago

215)   $cmdline = "openssl req -sha256 -new -batch -config {$config} -out {$csrfile}";
bernd CSR-Erstellung

bernd authored 15 years ago

216)   $retval = 0;
217)   exec($cmdline, $output, $retval);
218)   DEBUG($output);
219)   DEBUG($retval);
220)   if ($retval != 0)
221)   {
222)     system_failure("Die Erzeugung des CSR ist fehlgeschlagen. Ausgabe des OpenSSL-Befehls: ".$output);
223)   }
224)   
225)   $csr = file_get_contents($csrfile);
226)   $key = file_get_contents($keyfile);
227) 
228)   unlink($csrfile);
229)   unlink($keyfile);
230)   unlink($config);
231) 
232)   return array($csr, $key);
233) }
234) 
235) 
236) 
237) function create_csr($cn, $bits)
238) {
239)   $cn = filter_input_hostname($cn);
240)   $bits = (int) $bits;
241)   if ($bits == 0)
242)     $bits = 4096;
243) 
244)   $keyfile = tempnam(ini_get('upload_tmp_dir'), 'key');
245)   $csrfile = tempnam(ini_get('upload_tmp_dir'), 'csr');
246)   $config = tempnam(ini_get('upload_tmp_dir'), 'config');
247) 
248)   DEBUG("key: ".$keyfile." / csr: ".$csrfile." / config: ".$config);
249) 
250)   $c = fopen($config, "w");
251)   fwrite($c, "[req]
252) default_bits = {$bits}
253) default_keyfile = {$keyfile}
254) encrypt_key = no
255) distinguished_name      = req_distinguished_name
256) 
257) [ req_distinguished_name ]
258) countryName                     = Country Name (2 letter code)
259) countryName_default             = DE
260) stateOrProvinceName             = State or Province Name (full name)
261) stateOrProvinceName_default     = Baden-Wuerttemberg
262) localityName                    = Locality Name (eg, city)
263) localityName_default            = Murrhardt
264) 0.organizationName              = Organization Name (eg, company)
265) 0.organizationName_default      = schokokeks.org
266) 
267) commonName = Common Name
268) commonName_default = {$cn}
269) ");
270)   fclose($c);
271) 
272)   $output = '';
hanno sha2 csrs

hanno authored 14 years ago

273)   $cmdline = "openssl req -sha256 -new -batch -config {$config} -out {$csrfile}";