b148fa86e7e62dfef2233f4cde191ef58ea399ee
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) {  
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 13 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 14 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 13 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 14 years ago

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

hanno authored 14 years ago

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

bernd authored 14 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 13 years ago

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

bernd authored 14 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 13 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 14 years ago

137) }
138) 
bernd Cert-Refresh

bernd authored 14 years ago

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

bernd authored 14 years ago

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

bernd authored 14 years ago

141) {
hanno zertifikate und keys export...

hanno authored 14 years ago

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

bernd authored 14 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 chain auch beim refresh erm...

bernd authored 13 years ago

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

bernd authored 14 years ago

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

hanno authored 14 years ago

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

bernd authored 14 years ago

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

hanno authored 14 years ago

156)   }
bernd chain auch beim refresh erm...

bernd authored 13 years ago

157)   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

158) }
159) 
160) 
bernd Neue Zertifikatsverwaltung

bernd authored 14 years ago

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

bernd authored 14 years ago

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

hanno authored 14 years ago

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

bernd authored 14 years ago

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

hanno authored 14 years ago

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