432843873b5767bf63e166259ddda80c83e0d0cd
bernd Neue Zertifikatsverwaltung

bernd authored 14 years ago

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

bernd authored 14 years ago

4) require_once('inc/security.php');
bernd 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) 
bernd 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) }
bernd 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)   
bernd 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}");
bernd Neue Zertifikatsverwaltung

bernd authored 14 years ago

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

bernd authored 14 years ago

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

bernd authored 14 years ago

40)   return mysql_fetch_assoc($result);
41) }
42) 
43) 
bernd 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) 
bernd 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) 
bernd 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) 
bernd Neue Zertifikatsverwaltung

bernd authored 14 years ago

82) function validate_certificate($cert, $key)
83) {  
bernd 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)   
bernd 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) 
bernd 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)   }
bernd 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)   */
bernd Erlaube nur RSA- und DSA-Ze...

bernd authored 13 years ago

127)   DEBUG($certdata);
bernd 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']));
bernd 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']);
bernd Neue Zertifikatsverwaltung

bernd authored 14 years ago

130) }
131) 
132) 
133) function save_cert($info, $cert, $key)
134) {
hanno zertifikate und keys export...

hanno authored 14 years ago

135)   openssl_pkey_export($key, $key);
136)   openssl_x509_export($cert, $cert);
bernd 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']);
bernd Cert-Chain erkennen und ben...

bernd authored 13 years ago

141)   $chain = maybe_null( get_chain($cert) );
bernd 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) 
bernd 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}')");
bernd Neue Zertifikatsverwaltung

bernd authored 14 years ago

147) }
148) 
bernd Cert-Refresh

bernd authored 14 years ago

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

bernd authored 14 years ago

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

bernd authored 14 years ago

151) {
hanno zertifikate und keys export...

hanno authored 14 years ago

152)   openssl_x509_export($cert, $cert);
bernd 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) 
bernd chain auch beim refresh erm...

bernd authored 13 years ago

160)   $chain = maybe_null( get_chain($cert) );
161) 
bernd neue Bilder, mehr SSL-Zerti...

bernd authored 14 years ago

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

hanno authored 14 years ago

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

bernd authored 14 years ago

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

hanno authored 14 years ago

166)   }
bernd 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");
bernd Cert-Refresh

bernd authored 14 years ago

168) }
169) 
170) 
bernd 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) 
bernd 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 = '';
hanno sha2 csrs

hanno authored 14 years ago

227)   $cmdline = "openssl req -sha256 -new -batch -config {$config} -out {$csrfile}";
bernd 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 = '';
hanno sha2 csrs

hanno authored 14 years ago

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