[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: www-data & gpg-agent



HI Uwe,

ich mache das so, wie du schreibst:

$gpgHdl: das gnupg-objekt
$listFP: Fingerprint des privater schlüssel (liste)
$listPass: passwort zum privaten schlüssel (liste)
$enc: verschlüsselter text
$plain: klartext

> function decrypt_gpg($gpgHdl, $listFP, $listPass, $enc) {
> 	$result = $gpgHdl->adddecryptkey($listFP, $listPass);
> 	$msg_plain = $gpgHdl->decrypt($enc);
> 	$result = $gpgHdl->cleardecryptkeys();
> 	if($result) {	return $msg_plain;		}
> 	else {		echo $gpgHdl->geterror();	}
> }
> function encrypt_gpg($gpgHdl, $plain, $fp) {
> 	$result = $gpgHdl->addencryptkey($fp);
> 	$msg_enc = $gpgHdl->encrypt($plain);
> 	$result = $gpgHdl->clearencryptkeys();
> 	if($result) {	return 	$msg_enc;	}
> 	else {	echo $gpgHdl->geterror();	}
> }

Die Ergebnisse (var_dump) sind
true: 		für $gpgHdl->adddecryptkey($listFP, $listPass);
Leerer String:	für $msg_plain = $gpgHdl->decrypt($enc);
false: 		für $result = $gpgHdl->cleardecryptkeys();
und
decrypt failed: für "echo $gpgHdl->geterror();"

Der Fehlermeldung kann ich nichts entnehmen, außer dass das Decrypt
fehlgeschlagen ist:
> object(Exception)#3 (7)
> { ["message":protected]=> string(14) "decrypt failed"
>   ["string":"Exception":private]=> string(0) ""
>   ["code":protected]=> int(0)
>   ["file":protected]=> string(32) "/var/www/html/myList/testGPG.php"
>   ["line":protected]=> int(233)
>   ["trace":"Exception":private]=> array(2)
>   { [0]=> array(6)
>     { ["file"]=> string(32) "/var/www/html/myList/testGPG.php"
>       ["line"]=> int(233)
>       ["function"]=> string(7) "decrypt"
>       ["class"]=> string(5) "gnupg"
>       ["type"]=> string(2) "->"
>       ["args"]=> array(1)
>       { [0]=> string(541) "-----BEGIN PGP MESSAGE----- [...]
> 				-----END PGP MESSAGE----- "
>     }
>   } [1]=> array(4)
>     { ["file"]=> string(32) "/var/www/html/myList/testGPG.php"
>       ["line"]=> int(144)
>       ["function"]=> string(11) "decrypt_gpg"
>       ["args"]=> array(4)
>       { [0]=> object(gnupg)#2 (0) { }
>         [1]=> string(40) "<fingerprint>"
>         [2]=> string(16) "<pw>"
>         [3]=> string(541) "-----BEGIN PGP MESSAGE----- [...]
> 				-----END PGP MESSAGE----- "
>       }
>     }
>   } ["previous":"Exception":private]=> NULL
> }

Wenn ich public keys über PHP hinzufüge oder lösche und über das
Terminal die Liste der Keys abfrage, dann sehe ich jeweils das Ergebnis
der Aktionen (umgekehrt klappt das auch).
Ich habe dein Snipplet dem Code hinzugefügt, das hat leider auch nicht
geholfen.
Ich habe ein Homeverzeichnis für www-data unter "/home/www-data" und
unter "/home/www-data/.gnupg" das GnuPG-Home.
Die Rechte sollten passen:

> ls -alh /home/www-data/.gnupg
>
> drwx------ 4 www-data www-data 4,0K Sep  3 01:35 .
> drwxr-xr-x 3 www-data www-data 4,0K Aug 26 18:18 ..
> drwx------ 2 www-data www-data 4,0K Mai  4 23:37 openpgp-revocs.d
> drwx------ 2 www-data www-data 4,0K Aug 26 16:15 private-keys-v1.d
> -rw-r--r-- 1 www-data www-data  39K Aug 26 17:56 pubring.kbx
> -rw-r--r-- 1 www-data www-data  39K Aug 26 17:55 pubring.kbx~
> -rw------- 1 www-data www-data  600 Sep  3 02:31 random_seed
> srwx------ 1 www-data www-data    0 Sep  3 02:31 S.gpg-agent
> srwx------ 1 www-data www-data    0 Sep  3 01:35 S.gpg-agent.browser
> srwx------ 1 www-data www-data    0 Sep  3 01:35 S.gpg-agent.extra
> srwx------ 1 www-data www-data    0 Sep  3 01:35 S.gpg-agent.ssh
> -rw-r--r-- 1 www-data www-data  48K Aug 26 00:41 tofu.db
> -rwx------ 1 www-data www-data 1,3K Aug 25 14:48 trustdb.gpg

Wenn ich über das Terminal
"sudo -u www-data gpg --delete-secret-key <fingerprint>"
ausführe kommt folgendes (www-data hat aber auch keine shell mehr)

> sudo -u www-data gpg --delete-secret-key <fingerprint>
>
> gpg (GnuPG) 2.2.12; Copyright (C) 2018 Free Software Foundation, Inc.
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.
>
>
> sec  ed25519/xxxxxxxxxxx 2020-08-26 MyList (Schlüsselpaar von MyList.
> 2 Jahre bis 26.08.2022) <mail@list.de>
>
> Diesen Schlüssel aus dem Schlüsselbund löschen? (j/N) j
> Dies ist ein privater Schlüssel! - Wirklich löschen? (j/N) j
> gpg: Fehler beim Löschen des privaten Schlüssels: Keine Berechtigung
> gpg: Fehler beim Löschen des privaten Unterschlüssels: Keine
> Berechtigung
> gpg: <fingerprint>: delete key failed: Keine Berechtigung

Ich glaub nicht, dass mein Problem das PHP ist, sondern die
Berechtigungen für den User.
Evtl. liegt es auch an der Konfiguration des Apache oder von GnuPG.

Kann es an dem Passwort für den Schlüssel liegen und dass über PHP bzw.
im Batch die Abfrage nicht umgangen wird?


Johannes



Am 02.09.2020 um 21:18 schrieb Uwe Kerstan:
> * Johannes Lintner [01-09-2020 23:57]:
> 
>> Ich scheitere damit, den gpg-agent durch den User www-data ausführen lassen zu können.
> 
> Im Prinzip reicht das gnupg-modul aus. Das gnupg-home-Verzeichnis
> muss dafür vorhanden und beschreibbar für www-data sein.
> Ich lege das meist im Skript fest, etwa so:
> 
> $this->GNUPG_HOMEDIR='/var/www/web/htdocs/privat/gnupg';
> putenv("GNUPGHOME=$this->GNUPG_HOMEDIR");
> 
>> Was nicht funktioniert: Entschlüsseln von Texten, Erzeugen von privaten Schlüsseln, Löschen von privaten Schlüsseln.
> 
> Entschlüsseln von Texten sollte per $gpg->adddecryptkey und
> $gpg->decrypt kein Problem sein. Die anderen Aktionen brauchen
> teilweise Interaktion des Users.
> 
> Die Frage wäre, ob du das brauchst. Eigentlich würde genau ein
> privater Key reichen, um die eingehenden Mails zu entschlüsseln und
> dann verschlüsselt mit den Public-Keys der User weiter zu verteilen.
> 
> Das nur als Anregung! :-)
> 
> Gruß Uwe
> 

-- 
--------------------------
Using pgp email encryption
My public key is attached.

Attachment: 0xB1B6FDD3ECD78C94.asc
Description: application/pgp-keys

Attachment: signature.asc
Description: OpenPGP digital signature


Reply to: