Die OpenSSL Funktionen in PHP benötigen einige Parameter, um sauber arbeiten zu können. Viele der Funktionen benötigen ein Array mit verschiedenen Konfigurationsparametern. Laut der Dokumentation werden Standardwerte verwendet wenn man einen Parameter nicht angbit. Bei meinen tests muss ich feststellen, dass das nicht immer funktioniert. Ich bin dazu übergegangen ein Array zu definieren, mit dem die Verarbeitung mit den meisten Funktionen einfach geht. Das folgende Array verwende ich bei allen Beispielen die zu diesem Thema folgenden. Ich benutze in diesem Beispiel die aktuellste XAMPP Server Version auf einem Windows 7 Betriebssystem.
Hier das Beispiel Array:
$configArgs = array( 'config' => "C:\\xampp\\php\\extras\\openssl.cnf", 'encrypt_key' => TRUE, 'digest_alg' => "md5", 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'x509_extensions' => "v3_ca", 'private_key_bits' => 1024 ); |
OpenSSL benötigt eine eigene Konfigurationsdatei. Viele der dortigen Konfigurationsparameter kann man während der Laufzeit überschreiben und klar ist, wenn man einen Parameter in der Laufzeit nicht angibt, wird der betreffende Parameter aus der jeweiligen Konfigurationsdatei openss.cnf verwendet. D.h. schaut genau hin welchen Parameter ihr in eurem PHP-Script nutzen möchtet und setzt diesen sicherheitshalber in der Laufzeit selbst.
'config' =>
Dieser Parameter muss den Pfad zur OpenSSL Konfigurationsdatei openss.cnf enthalten. Da ich in diesem Beispiel ein Windowssystem verwende, müssen die Backslashe alle doppelt (quasi escapen) genutz werden. In der XAMPP Installation werdet ihr mehrere openssl.cnf Dateien finden. Welche die richtige ist, müsst ihr ausprobieren. Ich habe versucht die Konfigurationdatei zu nutzen die über die Funktion phpinfo() im Abschnitt Apache Environment angezeigt wird. Wenn ich diese innerhalb meines Skriptes verwendet erhalte ich Fehler. "C:\\xampp\\php\\extras\\openssl.cnf"
'encrypt_key' => TRUE
Dieser Parameter definiert ob der Private Schlüssel mit einem Passwort geschützt werden soll oder nicht. Da ein Privater Schlüssel aus meiner Sicht ein schützenswertes Fragment ist, sollte man diesen Parameter nutzen und auf TRUE setzen.
'digest_alg' => "md5"
Unter Digest Algorithm versteht man im Grunde einen Hash-Algorithmus. Dies nutz man um die „Signatur“ einer Zeichenkette zu erhalten. Es gibt verschiedene Algorithmen (SHA, SHA256, etc. ) die man hier verwenden kann. Man sollte vorher überprüfen welche Algorithmen von der Lokalen Installation verwendet werden.
'private_key_type' => OPENSSL_KEYTYPE_RSA
Dieser Parameter definiert welche Schlüsselformat verwendet werden soll. Im weiteren Verlauf des Beispiels wollen wir RSA Schlüsselpaar erzeugen, daher setzen wir die Konstante OPENSSL_KEYTYPE_RSA
'x509_extensions' => "v3_ca"
Unter X509versteht man einen Standard für die Formatierung der Öffentlichen Schlüssel. Man möchte ja Öffentliche Schlüssel zwischen den Kommunikationspartern austauschen und X509 ist quasi das Format um die Schlüssel zwischen den verschiedenen Systeme Ex- und Imporieren zu können.
'private_key_bits' => 1024
Die Schlüssel für RSA können in verschiedenen Größen erstellt werden. 1024 Bit ist ein vernüftige mindestgröße. Generell gilt, je größer desto sicherer. Man sollte aber dabei bedenken, dass die Größe des Schlüssels die Verarbietungsdauer beinflusst. D.h. also auch je größer desto langsamer. Man sollte das bedenken, wenn man mit Leistungsschwachen Systemen arbeiten muss.