ubuntuusers.de

OpenSSL & PHP shell_exec(), exec()

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

Chroman

Anmeldungsdatum:
1. Juli 2006

Beiträge: 568

Hi,

ich habe ein PHP-Skript, dass mir einen Emailtext erstellt und unter "/home/user/text.txt" in einer Datei abspeichert. Dieser Emailtext soll signiert und versendet werden.

Wenn ich die text.txt manuell erstelle und folgenden Befehl in die Shell eingebe, dann erhalte ich auch eine signierte Email:

1
2
3
4
5
6
7
# SHELL-Befehl:
openssl smime -sign -signer /home/user/zertifikat.pem -in /home/user/text.txt -from 'Absendername <ab@sender.xyz>' -to 'empf@aenger.xyz' -subject 'Betreff' | sendmail -t
# Ab hier PHP:
$output = 'openssl smime -sign -signer /home/user/zertifikat.pem -in /home/user/text.txt -from \'Absendername <ab@sender.xyz>\' -to \'empf@aenger.xyz\' -subject \'Betreff\' | sendmail -t';
echo $output;
$shellausgabe = shell_exec($output);
echo $shellausgabe;

Kurz um, es funktioniert alles prima.

Jetzt habe ich das ganze in ein PHP-Skript eingebunde und die '' escapt mit \. Die Ausgabe habe ich direkt getestet indem ich mir mit "echo" den String ausgeben lasse und nachgesehen habe, ob alles so wie bei dem obigen Shell-Bfehl aussieht (also dass keine Anführungszeichen fehlen etc.). Leider kommt bei mir keine Email an! Ich erhalte als Ausgabe nur das echo $output, allerdings erhalte ich keinerlei Email und beim echo $shellausgabe erhalte ich auch nichts. Nicht mal eine Fehlermeldung oder ähnliches.

Das obige Skript habe ich mit der Funktion shell_exec() http://de3.php.net/shell_exec als auch exec() http://de.php.net/manual/en/function.exec.php ausprobiert. Beide liefern das gleiche Ergebnis.

Wisst ihr, wie ich an die Fehlermeldung ran kommen könnte? Gibt es da einen Weg über Ubuntu über logfiles in denen es steht z. B. einer History? Ich habe den Verdacht, dass es eine Berechtigungssache sein könnte, da ich den obigen Befehl unter root ausführe, der Webserver unter www-data läuft. Aber wie ich das rausfinden kann, weiß ich nicht.

Danke fürs Lesen! Über Hilfe würde ich mich wirklich freuen!

Bearbeitet von barabbas:

Formatierung gefixt. '' werden vom Forum als Anfang/Ende eines kursiven Strings interpretiert. Die musst du also entweder in Code-Tags stellen oder mit \ escapen.

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

D.h. alles, was du gemacht hast ist, ein Shell-Script in eine PHP eingebettet.

Es ist aber so, dass dein PHP wohl in der Umgebung eines Web-Servers abläuft?

Oder, wie sieht die Systemumgebung aus, die dein PHP-Script sieht?

Weiß PHP, wo sendmail liegt, wo openssl liegt etc. ?

Ich würde mal beim Aufruf der einzelnen Commands den absoluten Pfadnamen angeben, um solche Dinge auszuschließen.

Hast du keine Fehlermeldungen? Wenn's im Web-Server läuft, dann bitte dort im Logfile nachschauen.

Am Anfang deines Scripts mal

error_reporting(E_ALL);

einbauen.


Uuuhps - jetzt erst sehe ich dein Script im Post eingeblendet - was war da denn los?

Das muss ich erst mal anschauen.

–- So, hab's gesehen. Bleib bei meiner Aussage.

Chroman

(Themenstarter)

Anmeldungsdatum:
1. Juli 2006

Beiträge: 568

Hi theinlein,

ja das PHP wird durch Apache ausgeführt, der unter dem Benutzer www-data läuft.

Wie kann ich herausfinden, wo openssl, php und sendmail liegen?

Leider kommt selbst mit "error_reporting(E_ALL);" kein anderes Ergebnis/Ausgabe heraus.

Was kann ich jetzt noch tun?

Danke für deine Hilfe!

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

dann füge noch zusätzlich

ini_set('display_errors', 1);

vor das error_reporting ein.

Thema Pfade: PHP brauchst du ja nicht, das läuft ja selbst: Gib ein ...

which sendmail

which  openssl

http://wiki.ubuntuusers.de/Apache

Fehler werden im Log zu finden sein. Wo das Log-File des Apache liegt kann man im Konfig-File nachschauen (ich weiß es jetzt nicht)

grep  ErrorLog /etc/apache2/apache2.conf

wahrscheinlich ist das irgendwie so etwas wie "/var/log/apache2/error_log"

Chroman

(Themenstarter)

Anmeldungsdatum:
1. Juli 2006

Beiträge: 568

Hi theinlein,

danke für deine Hilfe! Im error.log stands. Da hätte ich auch drauf kommen können, nur hab ich gedacht, da es sich ja um openssl handelt, dass eher dort was zu finden ist als im apache. Weshalb finde ich die Fehlermeldung im apache.error log?

Die Ausgaben:

which openssl --> /usr/bin/openssl
which apache2 --> /usr/sbin/apache2
ini_set('display_errors', 1);

bringt keine Änderung.

Openssl bringt übrigends folgende Fehlermeldung (was sicher auch der Grund ist, dass es nicht funktioniert:

unable to write 'random state'

Jetzt müsste ich nur noch wissen, weshalb es nicht funktioniert.

Danke für deine Hilfe!

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Das scheint jetzt einfach zu sein:

DIe FAQs des openSSL beschreiben das

http://www.openssl.org/support/faq.cgi

... und es leuchtet ein ...

"no default filename is known because neither RANDFILE nor HOME is set"

Dein Script läuft als User www-data (Apache ist der User www-data) openssl will die Umgebungsvariable 'HOME' und auch 'RANDFILE' auswerten.

Du müsstest dafür sorgen, dass die für www-data stimmen (was aber schwierig zu testen ist, weil man sich nicht als www-data einloggen kann). Alternative: ein separates Script schreiben und dort die nötige Umgebung bereitstellen bzw. sich dort als User betätigen, der funktioniert.

also dort z.B.

'sudo -u hanswurst  openssl smime -sign -signer /home/user/zertifikat.pem -in /home/user/text.txt -from \'Absendername <ab@sender.xyz>\' -to \'empf@aenger.xyz\' -subject \'Betreff\' | sendmail -t';

wenn der funktionierende User (bei dem das Script sich aufrufen lässt und es auch funktioniert) 'hanswurst' hieße. Da der Web-Server aber nichts erlaubt bekommt, ohne Passwort-Abfrage infolge des sudo muss du in /etc/sudoers das noch so konfigurieren, dass für www-data ein login als hanswurst mit openssl ohne Passwort möglich ist.

Siehe dazu im Wiki (ja, lernen ist auch mit Arbeit verbunden)

Chroman

(Themenstarter)

Anmeldungsdatum:
1. Juli 2006

Beiträge: 568

Hi,

danke für den Hinweis, ich hab noch suchen müssen und Manuals gelesen, aber jetzt läuft es!

Danke!

Antworten |