PHP: Installation der PGP Erweiterung

Achtung! Dieser Artikel ist älter als ein Jahr. Der Inhalt ist möglicherweise nicht mehr aktuell!

Für ein Webprojekt möchte ich die Ausgaben einer Schnittstelle digital signieren. Der Grund: Unterwegs soll die Nachricht nicht manipuliert werden. Da einige Proxyserver die TLS-Verbindung terminieren und hinten raus neu aufbauen ist eine Manipulation nicht nachvollziehbar.

Ich habe mich für PGP entschieden, da es bereits Schnittstellen für PHP gibt. Voraussetzung ist eine Lauffähige Version von GnuPG. Das ist auf den meisten Systemen bereits installiert. Falls nicht kann man es einfach nachinstallieren.

apt-get install gnupg

Die Installation des Moduls …

… ist schwerer als man glaubt. Ständig muss man sich über neue Versionen informieren, kompilieren und libs im Dateisystem bewegen. Oder doch nicht? Für Debian basierte Derivate ist es ziemlich einfach. Eine Anleitung für die Installation über PECL habe ich dank diesem User bekommen.

php-pgp_usefull_comment

Ohne die libgpgme11-dev bekommt man eine kryptische Fehlermeldung.

apt-get install libgpgme11-dev php-pear

Nun kommt keine Fehlermeldung mehr beim installieren über PECL.

pecl install gnupg

Und schon hat man die Module und Funktionen, die man braucht.

Nun muss es nur noch in der php.ini eingetragen werden. Welche genau geladen ist findet man in der Ausgabe von phpinfo(). Am Ende der Datei fügt man dann folgende Zeile ein:

extension=gnupg.so

Nach einem Neustart oder Reload des Apache kann man die Funktionen auch verwenden. Nun sollte man in der Ausgabe von phpinfo() eine Sektion „gnupg“ finden.

pgp-gpg_phpinfo-loaded

Optional: Erstellen eines PGP Schlüsselpaares, mit dem man nur signieren kann

Die Ausgabe soll lediglich signiert werden. GnuPG erlaubt mir die Erstellung eines Schlüsselpaares, mit dem ich nur signieren kann. Das entspricht meinen Anforderungen. Sollte ich später trotzdem verschlüsseln wollen, kann ich den Schlüsselbund nachträglich editieren.

Die Erstellung eines Schlüsselpaares ist über SSH ziemlich einfach. Ich habe mich mit dem Benutzer eingeloggt unter dem auch der Webserver läuft. Das PHP-Modul greift auf den .gnupg Ordner im Homeverzeichnis des User zu.

Erzeugen des Schlüsselpaares:

veloc1ty@currywurst:~$ gpg --gen-key

GnuPG legt dann die benötigte Ordnerstruktur an. Man wird gefragt, welche Art von Schlüssel erzeugt werden soll.

Please select what kind of key you want:
 (1) RSA and RSA (default)
 (2) DSA and Elgamal
 (3) DSA (sign only)
 (4) RSA (sign only)
Your selection? 4

Ich nehme in meinem Fall Punkt 4. Danach soll man die Länge des Schlüssels angeben. 2048 bit sind bei mir der Standardwert. Klingt vernünftig.

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits

Danach soll man die Gültigkeit angeben. Ich wähle aus, dass er nie ausläuft und bestätige die extra Warnung.

Für ein Webprojekt möchte ich die Ausgaben digital signieren. Der Grund: Unterwegs soll die Ausgabe nicht manipuliert werden. HTTPS ist keine Option, da einige Proxyserver die TLS Session terminieren und hinten raus neu aufbauen.

Ich habe mich für PGP entschieden, da es bereits Schnittstellen für PHP gibt. Voraussetzung ist eine Lauffähige Version von GnuPG. Das ist auf den meisten Systemen bereits installiert. Falls nicht kann man es einfach nachinstallieren!

apt-get install gnupg

Die Installation des Moduls …

… ist schwerer als man glaubt. Oder doch nicht? Für Debian basierte Derivate ist es ziemlich einfach dank diesem User:

php-pgp_usefull_comment

Ohne die libgpgme11-dev bekommt man eine kryptische Fehlermeldung.

apt-get install libgpgme11-dev php-pear

Nun kann man über

pecl install gnupg

Und schon hat man die Module und Funktionen, die man braucht.

Nun muss es nur noch in der php.ini eingetragen werden. Welche genau geladen ist findet man in der Ausgabe von phpinfo(). Am Ende der Datei fügt man dann folgende Zeile ein:

extension=gnupg.so

Nach einem Neustart des Apache kann man die Funktionen auch verwenden. Nun sollte man in der Ausgabe von phpinfo() eine Sektion „gnupg“ finden.

pgp-gpg_phpinfo-loaded

Optional: Erstellen eines PGP Schlüsselpaares, mit dem man nur signieren kann

Die Ausgabe soll lediglich signiert werden. GnuPG erlaubt mir die Erstellung eines Schlüsselpaares, mit dem ich nur signieren kann. Das möchte ich dann auch so verwenden.

Die Erstellung eines Schlüsselpaares ist über SSH ziemlich einfach. Ich habe mich mit dem Benutzer eingeloggt unter dem auch der Webserver läuft. Das PHP-Modul greift auf den .gnupg Ordner im Homeverzeichnis des User zu.

Erzeugen des Schlüsselpaares:

veloc1ty@currywurst:~$ gpg --gen-key

GnuPG legt dann die benötigte Ordnerstruktur an. Man wird gefragt, welche Art von Schlüssel erzeugt werden soll.

Please select what kind of key you want:
 (1) RSA and RSA (default)
 (2) DSA and Elgamal
 (3) DSA (sign only)
 (4) RSA (sign only)
Your selection? 4

Ich nehme in meinem Fall Punkt 4. Danach soll man die Länge des Schlüssels angeben. 2048 bit sind bei mir der Standardwert. Klingt vernünftig.

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits

Danach soll man die Gültigkeit angeben. Ich wähle aus, dass er nie ausläuft und bestätige meine Entscheidung.

Please specify how long the key should be valid.
 0 = key does not expire
 <n> = key expires in n days
 <n>w = key expires in n weeks
 <n>m = key expires in n months
 <n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y

Danach muss ich noch die Schlüsselinformationen eintragen. Ich wähle hier Werte, die ungefähr den Verwendungszweck beschreiben.

Real name: veloc1ty API
Email address: api@veloc1ty.de
Comment: API PGP Key
You selected this USER-ID:
 "veloc1ty API (API PGP Key) <api@veloc1ty.de>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

Danach werde ich zwei mal nach eine Passwort gefragt. Man sollte hier ein gutes Passwort wählen und sich merken. Später im Code benötigt man dies. Danach werden die Primzahlen generiert und Informationen über den Schlüssel ausgegeben.

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
.+++++
.....+++++
gpg: /var/www/veloc1ty.de/.gnupg/trustdb.gpg: trustdb created
gpg: key 9F1902A9 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
pub 2048R/9F1902A9 2014-06-24
 Key fingerprint = 15C4 CD5F 36C9 8A6A 40A8 7C95 457B E382 9F19 02A9
uid veloc1ty API (API PGP Key) <api@veloc1ty.de>

Note that this key cannot be used for encryption. You may want to use
the command "--edit-key" to generate a subkey for this purpose.

Das wäre es auch schon gewesen. Im obigen Text habe ich eine wichtige Information grün markiert. Den Fingerprint sollte man sich merken, da man diesen später im Code braucht, da der zu verwendende Schlüssel damit referenziert wird. Alle Beispiele im PHP Manual verwenden auch als Referenz den Fingerprint.

Wenn man den Fingerprint vergisst kann man sich diesen auch nochmal anzeigen lassen.

veloc1ty@currywurst:~$ gpg --fingerprint
/var/www/veloc1ty.de/.gnupg/pubring.gpg
---------------------------------------
pub 2048R/9F1902A9 2014-06-24
 Key fingerprint = 15C4 CD5F 36C9 8A6A 40A8 7C95 457B E382 9F19 02A9
uid veloc1ty API (API PGP Key) <api@veloc1ty.de>

Du hast einen Kommentar, einen Wunsch oder eine Verbeserung? Schreib mir doch eine E-Mail! Die Infos dazu stehen hier.

🖇️ = Link zu anderer Webseite
🔐 = Webseite nutzt HTTPS (verschlüsselter Transportweg)
Zurück