Mehr Fehlerbehandlung für SSL-Zertifikate
bernd

bernd commited on 2010-12-31 05:58:06
Zeige 1 geänderte Dateien mit 28 Einfügungen und 4 Löschungen.


git-svn-id: https://svn.schokokeks.org/repos/tools/webinterface/trunk@1868 87cf0b9e-d624-0410-a070-f6ee81989793
... ...
@@ -67,6 +67,12 @@ function get_available_CAs()
67 67
 function get_chain($cert)
68 68
 {
69 69
   $certdata = openssl_x509_parse($cert, true);
70
+  if ($certdata === FALSE) {
71
+    system_failure("Das Zertifikat konnte nicht gelesen werden");
72
+  }
73
+  if (! isset($certdata['issuer']['CN'])) {
74
+    return NULL;
75
+  }
70 76
   $issuer = mysql_real_escape_string($certdata['issuer']['CN']);
71 77
   $result = db_query("SELECT id FROM vhosts.certchain WHERE cn='{$issuer}'");
72 78
   if (mysql_num_rows($result) > 0)
... ...
@@ -81,16 +87,34 @@ function get_chain($cert)
81 87
 
82 88
 function validate_certificate($cert, $key)
83 89
 { 
84
-  $certinfo = openssl_pkey_get_details(openssl_get_publickey($cert));
90
+  // Lade private key 
91
+  $seckey = openssl_get_privatekey($key);
92
+  if ($seckey === FALSE) {
93
+    system_failure("Der private Schlüssel konnte (ohne Passwort) nicht gelesen werden.");
94
+  }
95
+  // Lade public key
96
+  $pubkey = openssl_get_publickey($cert);
97
+  if ($pubkey === FALSE) {
98
+    system_failure("In dem eingetragenen Zertifikat wurde kein öffentlicher Schlüssel gefunden.");
99
+  }
100
+  // Parse Details über den pubkey
101
+  $certinfo = openssl_pkey_get_details($pubkey);
85 102
   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!");
103
+  if ($certinfo === FALSE) {
104
+    system_failure("Der öffentliche Schlüssel des Zertifikats konnte nicht gelesen werden");
88 105
   }
89
-  if ($certinfo['type'] != OPENSSL_KEYTYPE_RSA && $certinfo['type'] != OPENSSL_KEYTYPE_DSA) {
106
+
107
+  // Apache unterstützt nur Schlüssel vom Typ RSA oder DSA
108
+  if (! in_array($certinfo['type'], array(OPENSSL_KEYTYPE_RSA, OPENSSL_KEYTYPE_DSA))) {
90 109
     system_failure("Dieser Schlüssel nutzt einen nicht unterstützten Algorithmus.");
91 110
   }
92 111
     
112
+  // Bei ECC-Keys treten kürzere Schlüssellängen auf, die können wir aktuell aber sowieso nicht unterstützen
113
+  if ($certinfo['bits'] < 2048) {
114
+    warning("Dieser Schlüssel hat eine sehr geringe Bitlänge und ist daher als nicht besonders sicher einzustufen!");
115
+  }
93 116
 
117
+  // Prüfe ob Key und Zertifikat zusammen passen
94 118
   if (openssl_x509_check_private_key($cert, $key) !== true)
95 119
   {
96 120
     DEBUG("Zertifikat und Key passen nicht zusammen");
97 121