Neuer Workflow für Cert-Replacement bzw. CSR-Handhabung
Bernd Wurst

Bernd Wurst commited on 2013-01-27 16:43:23
Zeige 6 geänderte Dateien mit 40 Einfügungen und 79 Löschungen.

... ...
@@ -44,7 +44,11 @@ $form = '
44 44
 
45 45
 ';
46 46
 
47
-output(html_form('vhosts_certs_new', 'savecert', 'action=new&csr='.$csr['id'], $form));
47
+$replace = '';
48
+if ($csr['replace']) {
49
+  $replace="&replace={$csr['replace']}";
50
+}
51
+output(html_form('vhosts_certs_new', 'savecert', 'action=new&csr='.$csr['id'].$replace, $form));
48 52
 
49 53
 
50 54
 
... ...
@@ -39,7 +39,7 @@ if (count($certs) > 0)
39 39
     elseif ($c['valid_until'] <= date('Y-m-d', time()+(30*24*3600))) {
40 40
       $style=' style="background-color: #ff8;" ';
41 41
     }
42
-    output("<tr><td{$style}>".internal_link('showcert', $c['subject'], "mode=cert&id={$c['id']}")."</td><td{$style}>{$c['cn']}</td><td{$style}>{$c['valid_from']}</td><td{$style}>{$c['valid_until']}</td><td>".internal_link('refreshcert', '<img src="'.$prefix.'images/refresh.png" title="Neue Version des Zertifikats einspielen" />', 'id='.$c['id'])." &#160; ".internal_link('savecert', '<img src="'.$prefix.'images/delete.png" />', 'action=delete&id='.$c['id'])."</td></tr>");
42
+    output("<tr><td{$style}>".internal_link('showcert', $c['subject'], "mode=cert&id={$c['id']}")."</td><td{$style}>{$c['cn']}</td><td{$style}>{$c['valid_from']}</td><td{$style}>{$c['valid_until']}</td><td>".internal_link('newcert', '<img src="'.$prefix.'images/refresh.png" title="Neue Version des Zertifikats einspielen" />', 'replace='.$c['id'])." &#160; ".internal_link('savecert', '<img src="'.$prefix.'images/delete.png" />', 'action=delete&id='.$c['id'])."</td></tr>");
43 43
   } 
44 44
   output("</table>");
45 45
 }
... ...
@@ -48,13 +48,14 @@ else
48 48
   output('<p><em>Bisher haben Sie keine Zertifikate eingetragen</em></p>');
49 49
 }
50 50
 
51
-addnew('newcert', 'Neues Zertifikat eintragen');
51
+addnew('newcert', 'Neues Zertifikat erzeugen / eintragen');
52
+
52 53
 
53
-output('<h3>offene CSRs</h3>');
54 54
 
55 55
 $csr = user_csr();
56 56
 if (count($csr) > 0)
57 57
 {
58
+  output('<h3>offene CSRs</h3>');
58 59
   output("<table><tr><th>Host-/Domainname</th><th>Bitlänge</th><th>Erzeugt am</th><th>&#160;</th></tr>");
59 60
   foreach ($csr AS $c)
60 61
   {
... ...
@@ -62,17 +63,7 @@ if (count($csr) > 0)
62 63
   }
63 64
   output("</table>");
64 65
 }
65
-else
66
-{
67
-  output('<p><em>Es gibt keine offenen CSRs</em></p>');
68
-}
69
-
70
-
71
-output('
72
-<p>Wenn Sie ein einfaches Zertifikat benötigen, können Sie mit Hilfe dieser Funktion einen CSR (»certificate signing request«) 
73
-erstellen, mit dem Sie Ihr endgültiges Zertifikat beantragen können.</p>');
74 66
 
75
-addnew('newcsr', 'Neuen CSR erzeugen');
76 67
 
77 68
 
78 69
 
... ...
@@ -60,7 +60,7 @@ function csr_details($id)
60 60
   $id = (int) $id;
61 61
   $uid = (int) $_SESSION['userinfo']['uid'];
62 62
   
63
-  $result = db_query("SELECT id, created, hostname, bits, csr, `key` FROM vhosts.csr WHERE uid={$uid} AND id={$id}");
63
+  $result = db_query("SELECT id, created, hostname, bits, `replace`, csr, `key` FROM vhosts.csr WHERE uid={$uid} AND id={$id}");
64 64
   if (mysql_num_rows($result) != 1)
65 65
     system_failure("Ungültiger CSR");
66 66
   return mysql_fetch_assoc($result);
... ...
@@ -353,7 +353,7 @@ commonName_default = {$cn}
353 353
 
354 354
 
355 355
 
356
-function save_csr($cn, $bits, $wildcard=true)
356
+function save_csr($cn, $bits, $wildcard=true, $replace=NULL)
357 357
 {
358 358
   if (! $cn) {
359 359
     system_failure("Sie müssen einen Domainname eingeben!");
... ...
@@ -368,9 +368,10 @@ function save_csr($cn, $bits, $wildcard=true)
368 368
   $uid = (int) $_SESSION['userinfo']['uid'];
369 369
   $cn = mysql_real_escape_string(filter_input_hostname($cn));
370 370
   $bits = (int) $bits;
371
+  $replace = (int) $replace;
371 372
   $csr = mysql_real_escape_string($csr);
372 373
   $key = mysql_real_escape_string($key);
373
-  db_query("INSERT INTO vhosts.csr (uid, hostname, bits, csr, `key`) VALUES ({$uid}, '{$cn}', {$bits}, '{$csr}', '{$key}')");
374
+  db_query("INSERT INTO vhosts.csr (uid, hostname, bits, `replace`, csr, `key`) VALUES ({$uid}, '{$cn}', {$bits}, {$replace}, '{$csr}', '{$key}')");
374 375
   $id = mysql_insert_id();
375 376
   return $id;  
376 377
 }
... ...
@@ -23,10 +23,10 @@ if (isset($_REQUEST['replace']))
23 23
 {
24 24
   $cert = cert_details($_REQUEST['replace']);
25 25
   $oldcert = $cert['id'];
26
-  $hint = "<p class=\"warning\"><strong>Hinweis:</strong> Dieses Zertifkkat soll als Ersatz für ein bestehendes Zertifikat eingetragen werden. Dabei wird jede Benutzung des alten Zertifikats durch das neue ersetzt. Das alte Zertifikat wird dann umgehend gelöscht.<p>
26
+  $hint = "<div style=\"border: 2px solid red; padding: 1em; margin: 1em;\"<p><strong>Hinweis:</strong> Dieses Zertifikat soll als Ersatz für ein bestehendes Zertifikat eingetragen werden. Dabei wird jede Benutzung des alten Zertifikats durch das neue ersetzt. Das alte Zertifikat wird dann umgehend gelöscht.<p>
27 27
 
28 28
 <p><strong>Daten des alten Zertifikats:</strong></p>
29
-<p><strong>CN:</strong> {$cert['cn']}<br /><strong>Gültigkeit:</strong> {$cert['valid_from']} - {$cert['valid_until']}</p>";
29
+<p><strong>CN:</strong> {$cert['cn']}<br /><strong>Gültigkeit:</strong> {$cert['valid_from']} - {$cert['valid_until']}</p></div>";
30 30
 
31 31
 }
32 32
 
... ...
@@ -35,13 +35,26 @@ $section = 'vhosts_certs';
35 35
 title('Neues Server-Zertifikat hinzufügen');
36 36
 
37 37
 
38
-output('<p>Sie können Ihr eigenes SSL-Zertifikat hinterlegen, das Sie dann für eine oder mehrere Webserver-Konfigurationen verwenden können.</p>
38
+output($hint.'
39
+<h4>CSR automatisch erzeugen</h4>
40
+<p>Mit unserem CSR-Generator können Sie einen Certificate-signing-request (CSR) automatisch erzeugen lassen. Nutzen Sie diese Möglichkeit bitte nur, wenn Sie ein so genanntes "Domain validated"-Zertifikat beantragen werden, das keine persönlichen Daten bzw. Firmendaten enthält. Kostenlose Zertifikate von CAcert oder StartSSL können Sie mit dieser Funktion erzeugen.</p>');
41
+
42
+if ($oldcert) {
43
+  $cn = urlencode($cert['cn']);
44
+  addnew('savecert', "Einen neuen CSR für {$cert['cn']} erzeugen lassen", "action=newcsr&commonname={$cn}&replace={$oldcert}");
45
+} else {
46
+  addnew('newcsr', 'CSR automatisch erzeugen lassen');
47
+}
48
+
49
+
50
+output('<h4>Vorhandenes Zertifikat eintragen</h4>
51
+<p>Sie können Ihr eigenes SSL-Zertifikat hinterlegen, das Sie dann für eine oder mehrere Webserver-Konfigurationen verwenden können.</p>
39 52
 <p>Sie benötigen dazu mindestens ein <strong>Zertifikat</strong> und einen <strong>privaten Schlüssel</strong> (ohne Passwort!). Alle Daten müssen im <strong>PEM-Format</strong> vorliegen, also in etwa die Form</p>
40 53
 <pre>-----BEGIN CERTIFICATE-----
41 54
 ...
42 55
 -----END CERTIFICATE-----</pre>
43 56
 <p>aufweisen. Sind die genannten Vorausetzungen erfüllt, können Sie Ihre Zertifikats-Daten einfach in untenstehendes Formular eingeben.</p>
44
-'.$hint);
57
+');
45 58
 
46 59
 
47 60
 $form = '
... ...
@@ -1,55 +0,0 @@
1
-<?php
2
-/*
3
-This file belongs to the Webinterface of schokokeks.org Hosting
4
-
5
-Written 2008-2013 by schokokeks.org Hosting, namely
6
-  Bernd Wurst <bernd@schokokeks.org>
7
-  Hanno Böck <hanno@schokokeks.org>
8
-
9
-To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty.
10
-
11
-You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see 
12
-http://creativecommons.org/publicdomain/zero/1.0/
13
-
14
-Nevertheless, in case you use a significant part of this code, we ask (but not require, see the license) that you keep the authors' names in place and return your changes to the public. We would be especially happy if you tell us what you're going to do with this code.
15
-*/
16
-
17
-require_once('certs.php');
18
-require_role(ROLE_SYSTEMUSER);
19
-
20
-
21
-$section = "vhosts_certs";
22
-title("Neue Version eines Zertifikats einspielen");
23
-
24
-$cert = cert_details($_REQUEST['id']);
25
-
26
-output("<p>Ein bereits vorhandenes Zetifikat können Sie (z.B. wenn es bald abläuft) durch eine neue Version des selben 
27
-Zertifikats ersetzen. Die meisten Zertifizierungsstellen bieten diese Funktion an ohne dass ein neuer CSR erzeugt 
28
-werden muss. Der private Schlüssel wird dabei erhalten und kann unverändert weiter benutzt werden.</p>
29
-
30
-<p>Bitte stellen Sie sicher, dass es sich um das richtige Zertifikat handelt. Das bisherige Zertifikat wurde 
31
-ausgestellt als <strong>{$cert['subject']}</strong>. Nur das dazu passende Zertifikat wird akzeptiert.</p>
32
-
33
-<p>Möchten Sie das Zertifikat durch ein gänzlich neues Zertifikat mit neuem privaten Schlüssel ersetzen, so 
34
-folgen Sie bitte diesem Link: ".internal_link('newcert', 'Neues Zertifikat als Ersatz für dieses Zertifikat 
35
-hochladen', 'replace='.$cert['id'])."</p>
36
-
37
-");
38
-
39
-$form = '
40
-<h4>neues Zertifikat:</h4>
41
-<p><textarea name="cert" rows="10" cols="70"></textarea></p>
42
-
43
-<p><input type="submit" value="Speichern" /></p>
44
-
45
-';
46
-
47
-output(html_form('vhosts_certs_refresh', 'savecert', 'action=refresh&id='.$cert['id'], $form));
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
... ...
@@ -149,11 +149,18 @@ elseif ($_GET['action'] == 'deletecsr')
149 149
 }
150 150
 elseif ($_GET['action'] == 'newcsr')
151 151
 {
152
-  $cn = $_POST['commonname'];
153
-  $bitlength = $_POST['bitlength'];
152
+  $replace = NULL;
153
+  if (isset($_REQUEST['replace'])) {
154
+    $replace = $_REQUEST['replace'];
155
+  }
156
+  $cn = $_REQUEST['commonname'];
157
+  $bitlength = 4096;
158
+  if (isset($_REQUEST['bitlength'])) {
159
+    $bitlength = $_REQUEST['bitlength'];
160
+  }
154 161
   
155 162
   $wildcard = ! (count(explode('.', $cn)) > 2);
156
-  $id = save_csr($cn, $bitlength, $wildcard);
163
+  $id = save_csr($cn, $bitlength, $wildcard, $replace);
157 164
 
158 165
   header("Location: showcert?mode=csr&id={$id}");
159 166
   die();
160 167