Wenn man den Privaten Schlüssel mit OpenSSL erfolgreich erzeugt und extrahiert hat, kann man aus dem Privaten Schlüssel den Öffentlichen Teil des Schlüssels generieren. Hierfür stellt OpenSSL die Funktion openssl_csr_new() zur Verfügung.
/* gen the public key */ try{ $pub_key = openssl_csr_new ($dn, $privkey, $configArgs, null); }catch (Exeption $e){ while ($msg = openssl_error_string()){ echo $msg . "<br />\n"; } } |
Betrachten wir mal die Eingabeparameter für die Funktion openssl_csr_new mal etwas genauer:
$dn
Diese Variable ist ein Array und enthält mehrere Informationen über den Distinguished Name des Öffentlichen Schlüssels. Öffentliche Schlüssel bezeichnet man auch gerne mal als Zertifikat. Korrekterweise muss man sagen, wenn ein öffentlicher Schlüssel signiert wird, erhält dieser ein Zertifikat. Damit kann man quasi nachweisen, welcher Person oder Organisation der Öffentliche Schlüssel gehört. Dazu aber an anderer Stelle mehr Informationen. Im Grunde muss der Distinguished Name die folgenden Informationen enthalten um mit der Funktion openssl_csr_new arbeiten zu können:
$dn = array( "countryName" => "DE", "stateOrProvinceName" => "HESSEN", "localityName" => "Offenbach am Main", "organizationName" => "Meine Firma", "organizationalUnitName" =>; "Abteilung", "commonName" => "Andreas Bassermann", "emailAddress" => "ab@agile-coding.net" ); |
$privkey
In dieser Variable muss der Private Schlüssel eingelesen werden und an die Funktion übergeben. Man kann die Datei mit dem Inhalt des Privaten Schlüssels mit der PHP Funktion file_get_contents einlesen und an die Funktion übergeben.
$configArgs
Welche Attribute in diesem Array gesetzt werden müssen, wird im Abschnitt der Laufzeitkonfiguration erläutert.
Wenn der Aufruf der Funktion openssl_csr_new() geklappt hat, steckt in der Variable $pub_key eine Ressourcen ID zu dem Öffentlichen Schlüssel. D.h. in diesem Augenblick haben wir den Öffentlichen Schlüssel generiert und könnten damit innerhalb der Laufzeit weiterarbeiten. Macht aber im wirklichen Leben kein Sinn. Im Normal Fall muss man den Öffentlichen Schlüssel aus dem System entnehmen und z.B. an ein Trust Center senden. Damit er dort signiert werden kann. In diesem Beispiel exportieren wir nun den Öffentlichen Schlüssel mit der Funktion openssl_csr_export():
try{ $pub_key = openssl_csr_export ($pub_key, $csr); }catch (Exeption $e){ while ($msg = openssl_error_string()){ echo $msg . "<br />\n"; } } |
Wenn der Funktionsaufruf erfolgreich war, steckt in der Variable $csr der öffentliche Schlüssel im X509 Format.