Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Generowanie certyfikatów ssl z ppoziomu aplikacji webowej
Forum PHP.pl > Forum > PHP
czytacz
Witam,

Stanąłem naprzeciwko następującego problemu:
Tworzę aplikację do obsługi serwera RADIUS, która będzie zarządzała kontami użytkowników, ich certyfikatami itd.
Potrzebuję, aby aplikacja podczas tworzenia nowego usera, jednocześnie generowała dla niego certyfikat, a następnie wysyłała plik z kluczem na jego adres e-mail. O ile sama wysyłka problemem nie jest, bo mam już gotowe funkcje do tego, o tyle wygenerowanie certyfikatu jest już dużo bardziej karkołomne.

Obecnie certyfikat generuję za pomocą makefile zawartego w oprogramowaniu. wygląda to w przybliżeniu tak:
/katalog-ze-skryptem/#make user

skrypt wtedy generuje odpowiednie pliki, modyfikuje inne itd.

I teraz, jak coś takiego wykonać z poziomu php? Sam shell_exec nie wystarcza, bo apache nie ma wystarczających uprawnień, a nadawanie mu dodatkowych nie bardzo mi się uśmiecha, choćby ze względu na bezpieczeństwo. Pomyślałem więc, że mogę z poziomu webaplikacji generować plik z jakimiś parametrami, na bazie których inny skrypt, odpalany regularnie przez crona, będzie wykonywał już polecenia systemowe.

Czy taka wizja ma w ogóle sens?
- Jeżeli tak, to jak się do tego zabrać? Nigdy wcześniej nie tworzyłem skryptów php obsługiwanych nie przez apache.
- Jeżeli nie, to czy jest jakiś inny, wygodniejszy i sensowniejszy sposób na tego typu operacje?

Pozdrawiam
abort
Rozwiązanie pierwsze:
- Tworzyć pliki z niezbędnymi danymi n/t nowych userów gdzieś w filesystemie (to zrobi Apache). Dać prawa rw dla Apache (które i tak powinien mieć) i ewentualnie grupy, do której przynależy Apache (też rw).
- Cron z użytkownika root pobierze sobie te pliki, przemieli (nawet z wykorzystaniem skryptów z katalogu dostępnego via www), wyśle dane, plik skasuje.

Rozwiązanie drugie (choć nie wiem, czy Ci sie podoba - bo mówiłeś, że nie lubisz dawać apachowi więcej niż ma)
2. suphp - http://www.suphp.org/Home.html (nie używałem, ale wiem że jest)

Sposób pierwszy zadziała w chroot'owanym środowisku - drugi niekoniecznie.
czytacz
Tak właśnie zakładałem pierwszą opcję, przy czym implikuje to pewne problemy:
- podczas dodawania wielu userów, generuję wiele certyfikatów. Czy istnieje instrukcja wymuszająca odczekanie pewnej ilości czasu przed wykonaniem kolejnego kroku w pętli? (coś w rodzaju sleep w bashu)
- czy katalogiem początkowym dla skryptu jest katalog w którym się znajduje czy też jakiś inny?
- gdzie są wyrzucane ewentualne błędy, które normalnie wyświetlałyby się na stronie?
abort
Zakładam (bo tak zrozumiałem), że piszesz skrypta w PHP wywoływanym z CLI...

No oczywiście że istnieje. O jakże jasnobrzmiącej nazwie... http://pl2.php.net/manual/en/function.sleep.php
Jeśli nie chcesz czekać pełnych sekund, ale wymagasz np. 1.5 sekundy, użyj usleep.
BTW, po co chcesz czekać?

Jeśli wykonujesz skrypt z crona, to CWD (current working directory) będzie odziedziczone z crona. Jeśli w cronie wpiszesz polecenie "cd /jakis/katalog && php -f ./moj-skrypt-php=z=teg=katalogu.php, to katalogiem początkowym będzie /jakis/katalog. Jeśli nie wywołasz cd wcześniej, to... szczerze mówiąc nie wiem - wydaje mi się, że / - ale nie sprawdzałem. Zresztą, zawsze możesz zmienić katalog w skrypcie php, przez chdir()

błędy? Standardowo dla skryptu PHP wywoływanego z CLI jest to STDERR, czyli standardowy kanał błędów. Podczas testowania bywa to aktualny terminal/konsola, w przypadku robienia tego z crona domyślnie jest to skrzyka mailowa użytkownika, którego zlecenie cron przetwarza. Oczywiście, można przekierować do pliku (dowolnego, ale trzeba mieć do niego prawa). Ładnie jest to opisane w http://kevin.vanzonneveld.net/techblog/art..._using_crontab/

erix
Cytat
Sposób pierwszy zadziała w chroot'owanym środowisku - drugi niekoniecznie.

Zawsze można odpalać proces na innym koncie...

Ew. napisać pseudo-demona w powłoce, który będzie "nasłuchiwał" na danym katalogu. Albo jeszcze prościej - wykorzystać wysyłanie sygnałów do procesu nasłuchującego. [;
czytacz
Cytat
No oczywiście że istnieje. O jakże jasnobrzmiącej nazwie... http://pl2.php.net/manual/en/function.sleep.php
Jeśli nie chcesz czekać pełnych sekund, ale wymagasz np. 1.5 sekundy, użyj usleep.
BTW, po co chcesz czekać?
Wygenerowanie certyfikatu zajmuje chwilę. powiedzmy, że 3-4 sekundy. Jeżeli skrypt po wykonaniu polecenia utworzenia certyfikatu nie poczeka aż ten się wygeneruje, to dalsze operacje, np przekopiowanie pliku, wysłanie go na maila, a następnie zabranie się za generowanie nowego certyfikatu - może się nie powieść.
No, chyba że skrypt grzecznie czeka z kolejną komendą na zakończenie bieżącej operacji, wtedy nie ma tematu.

Cytat
Ew. napisać pseudo-demona w powłoce, który będzie "nasłuchiwał" na danym katalogu. Albo jeszcze prościej - wykorzystać wysyłanie sygnałów do procesu nasłuchującego. [;
Czytałem o uruchamianiu php w trybie demona, ale niestety to przerasta moje skromne umiejętności :) wywołanie skryptu przez crona wydaje się prostsze.

A propo wywoływania przez crona - mam jeszcze jedną wątpliwość:
Chcę ustawić wykonywanie skryptu możliwie często - w tym przypadku max to minuta o ile się nie mylę. Chętniej widziałbym wywoływanie skryptu co 15-20 sekund.
- o ile wiem, cron mi na to nie pozwoli
- rozwiązaniem może byłoby użycie funkcji sleep() aby polecenia warunkowe w skrypcie powtarzały się ze 3 razy co 20s (albo 4 razy co 15s) ale nie wiem czy jest to dobre rozwiązanie. Nie znam na tyle specyfiki linuksa czy php żeby określić czy nie zajmie to zbytnio zasobów (choć raczej nie powinno, bo ile zasobów może zająć jeden mały skrypcik?)
abort
Zależy jak wywołujesz z php generowanie skryptu. Jesli przez system(), to skrypt czeka na koniec polecenia,które kazał wykonać. Jest to logiczne, skoro w http://pl.php.net/manual/pl/function.system.php (czyli w manualu) napisali "Execute an external program and display the output". Więc musi czekać. Ponadto system() ma składnię taką, że może przekazać status wykonania danej komendy - a to już na 100% nie jest możliwe bez czekania na wykonanie skryptu.

Co do "rozdzielczości" crona, to niestety, częściej niż co minutę się nie będzie wykonywał.
Rozwiązaniem jest napisanie czegoś na kształt demona (ale to musi być uruchamiane z uid=0, np. w skryptach startowych), który będzie miał kształt np.
Kod
chdir (tam gdzie chcesz)
wykonuj w pętli nieskończonej:
- odczyt katalogu
- jeśli jest jakiś certyfikat do wygenerowania, to generuj certyfikat i wyślij maila
- odczekaj N sekund (żeby nie zająć 100% CPU przez skrypt)
koniec pętli


Tylko nie wiem, czy jest sens bawić się w rozdzielczości sekundowe...
Dominis
Możesz użyć:

  1. system('sudo /etc/katalog/skrypt.bash')

a w pliku

  1. /etc/sudoers


Trzeba dopisać:
  1. www-data ALL = NOPASSWD: /etc/init.d/squid restart


Dzięki sudo, będziesz mógł bez problemu utworzyć certyfikat, ponieważ uruchomi Ci ten plik z prawami root-a.

Pozdrawiam
czytacz
@Dominis
Jak już napisałem wcześniej, nie uważam pomysłu podnoszenia uprawnień apacha za dobry ze względów bezpieczeństwa, dlatego wolę użyć innych rozwiązań.

Zabrałem się za budowanie skryptu który będzie odpalany z crona. Na naukę tworzenia php-owych demonów niestety nie mam za bardzo czasu. Dzięki wielkie wszystkim za podpowiedzi smile.gif

Temat pozwolę sobie zostawić otwartym, pewnie w trakcie jeszcze jakieś kwiatki mi wypłyną smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.