13a6c6567fedff02a3c61f8597ba7be171cbe017
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) 
67) function validate_certificate($cert, $key)
68) {  
69)   if (openssl_x509_check_private_key($cert, $key) !== true)
70)   {
71)     DEBUG("Zertifikat und Key passen nicht zusammen");
72)     return CERT_INVALID;
73)   }
74) 
75)   $cacerts = get_available_CAs();
76) 
77)   if (openssl_x509_checkpurpose($cert, X509_PURPOSE_SSL_SERVER, $cacerts) !== true)
78)   { 
79)     DEBUG('certificate was not validated as a server certificate with the available chain');
80)     return CERT_NOCHAIN;
81)   }
82) 
83)   return CERT_OK;
84) }
85) 
86) 
87) function parse_cert_details($cert)
88) {
89)   $certdata = openssl_x509_parse($cert, true);
90)   /* 
91) name => /CN=*.bwurst.org
92) validFrom_time_t => 1204118790
93) validTo_time_t => 1267190790
94) 
95) 
96)   */
97)  
bernd Cert-Name ist Subject-CN un...

bernd authored 14 years ago

98)   //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']));
99)   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']));
bernd Neue Zertifikatsverwaltung

bernd authored 15 years ago

100) }
101) 
102) 
103) function save_cert($info, $cert, $key)
104) {
hanno zertifikate und keys export...

hanno authored 15 years ago

105)   openssl_pkey_export($key, $key);
106)   openssl_x509_export($cert, $cert);
bernd Neue Zertifikatsverwaltung

bernd authored 15 years ago

107)   $subject = mysql_real_escape_string(filter_input_general($info['subject']));
108)   $cn = mysql_real_escape_string(filter_input_general($info['cn']));
109)   $valid_from = mysql_real_escape_string($info['valid_from']);
110)   $valid_until = mysql_real_escape_string($info['valid_until']);
111)   $cert = mysql_real_escape_string($cert);
112)   $key = mysql_real_escape_string($key);
113)   $uid = (int) $_SESSION['userinfo']['uid'];
114) 
115)   db_query("INSERT INTO vhosts.certs (uid, subject, cn, valid_from, valid_until, cert, `key`) VALUES ({$uid}, '{$subject}', '{$cn}', '{$valid_from}', '{$valid_until}', '{$cert}', '{$key}')");
116) }
117) 
bernd Cert-Refresh

bernd authored 15 years ago

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

bernd authored 15 years ago

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

bernd authored 15 years ago

120) {
hanno zertifikate und keys export...

hanno authored 15 years ago

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

bernd authored 15 years ago

122)   $id = (int) $id;
123)   $oldcert = cert_details($id);
124)   $cert = mysql_real_escape_string($cert);
125)   
126)   $valid_from = mysql_real_escape_string($info['valid_from']);
127)   $valid_until = mysql_real_escape_string($info['valid_until']);
128) 
bernd neue Bilder, mehr SSL-Zerti...

bernd authored 15 years ago

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

hanno authored 15 years ago

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

bernd authored 15 years ago

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

hanno authored 15 years ago

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

bernd authored 15 years ago

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

135) }
136) 
137) 
bernd Neue Zertifikatsverwaltung

bernd authored 15 years ago

138) function delete_cert($id)
139) {
140)   $uid = (int) $_SESSION['userinfo']['uid'];
141)   $id = (int) $id;
142)   
143)   db_query("DELETE FROM vhosts.certs WHERE uid={$uid} AND id={$id} LIMIT 1");
144) }
145) 
bernd CSR-Erstellung

bernd authored 15 years ago

146) function delete_csr($id)
147) {
148)   $uid = (int) $_SESSION['userinfo']['uid'];
149)   $id = (int) $id;
150)   
151)   db_query("DELETE FROM vhosts.csr WHERE uid={$uid} AND id={$id} LIMIT 1");
152) }
153) 
154) function create_wildcard_csr($cn, $bits)
155) {
156)   $cn = filter_input_hostname($cn);
157)   $bits = (int) $bits;
158)   if ($bits == 0)
159)     $bits = 4096;
160) 
161)   $keyfile = tempnam(ini_get('upload_tmp_dir'), 'key');
162)   $csrfile = tempnam(ini_get('upload_tmp_dir'), 'csr');
163)   $config = tempnam(ini_get('upload_tmp_dir'), 'config');
164) 
165)   DEBUG("key: ".$keyfile." / csr: ".$csrfile." / config: ".$config);
166) 
167)   $c = fopen($config, "w");
168)   fwrite($c, "[req]
169) default_bits = {$bits}
170) default_keyfile = {$keyfile}
171) encrypt_key = no
172) distinguished_name      = req_distinguished_name
173) req_extensions = v3_req
174) 
175) [v3_req]
176) subjectAltName = DNS:{$cn}, DNS:*.{$cn}
177) 
178) [ req_distinguished_name ]
179) countryName                     = Country Name (2 letter code)
180) countryName_default             = DE
181) stateOrProvinceName             = State or Province Name (full name)
182) stateOrProvinceName_default     = Baden-Wuerttemberg
183) localityName                    = Locality Name (eg, city)
184) localityName_default            = Murrhardt
185) 0.organizationName              = Organization Name (eg, company)
186) 0.organizationName_default      = schokokeks.org
187) 
188) commonName = Common Name
189) commonName_default = *.{$cn}
190) ");
191)   fclose($c);
192) 
193)   $output = '';
hanno sha2 csrs

hanno authored 14 years ago

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

bernd authored 15 years ago

195)   $retval = 0;
196)   exec($cmdline, $output, $retval);
197)   DEBUG($output);
198)   DEBUG($retval);
199)   if ($retval != 0)
200)   {
201)     system_failure("Die Erzeugung des CSR ist fehlgeschlagen. Ausgabe des OpenSSL-Befehls: ".$output);
202)   }
203)   
204)   $csr = file_get_contents($csrfile);
205)   $key = file_get_contents($keyfile);
206) 
207)   unlink($csrfile);
208)   unlink($keyfile);
209)   unlink($config);
210) 
211)   return array($csr, $key);
212) }
213) 
214) 
215) 
216) function create_csr($cn, $bits)
217) {
218)   $cn = filter_input_hostname($cn);
219)   $bits = (int) $bits;
220)   if ($bits == 0)
221)     $bits = 4096;
222) 
223)   $keyfile = tempnam(ini_get('upload_tmp_dir'), 'key');
224)   $csrfile = tempnam(ini_get('upload_tmp_dir'), 'csr');
225)   $config = tempnam(ini_get('upload_tmp_dir'), 'config');
226) 
227)   DEBUG("key: ".$keyfile." / csr: ".$csrfile." / config: ".$config);
228) 
229)   $c = fopen($config, "w");
230)   fwrite($c, "[req]
231) default_bits = {$bits}
232) default_keyfile = {$keyfile}
233) encrypt_key = no
234) distinguished_name      = req_distinguished_name
235) 
236) [ req_distinguished_name ]
237) countryName                     = Country Name (2 letter code)
238) countryName_default             = DE
239) stateOrProvinceName             = State or Province Name (full name)
240) stateOrProvinceName_default     = Baden-Wuerttemberg
241) localityName                    = Locality Name (eg, city)
242) localityName_default            = Murrhardt
243) 0.organizationName              = Organization Name (eg, company)
244) 0.organizationName_default      = schokokeks.org
245) 
246) commonName = Common Name
247) commonName_default = {$cn}
248) ");
249)   fclose($c);
250) 
251)   $output = '';
hanno sha2 csrs

hanno authored 14 years ago

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