Forum » Programiranje » [PHP] Uporaba cURL s HTTPS
[PHP] Uporaba cURL s HTTPS
dunker ::
Lep pozdrav vsem skupaj!
Spisal sem svoj HTTP klient (kot PHP class), ki za delovanje uporablja cURL. Vsa funkcionalnost brezhibno deluje (GET, POST, držanje cookiejev in sessiona, ...), zatakne pa se pri protokolu HTTPS.
Ena od nalog, ki bi jo moral opravljati ta HTTP klient, je tudi prijava v blog, odprt na Blogger.com. Vendar pa se žal login podatki submitajo na URL "https://www.blogger.com/start" in jaz svojega cURL ne znam pripraviti do tega, da bi podatke uspešno poslal.
Tudi, če odprem katerokoli https stran (kot npr. "https://www.blogger.com/start", kjer se nahaja login forma za prijavo), mi cURL ne vrne ničesar. Točneje povedano, "curl_exec($this->process)" vrne "false".
Je že kdo delal kaj podobnega? Kako ste pripravili cURL, da je lepo deloval tudi preko HTTPS protokola?
Zares najlepša hvala vsem za pomoč!
Anže
Spisal sem svoj HTTP klient (kot PHP class), ki za delovanje uporablja cURL. Vsa funkcionalnost brezhibno deluje (GET, POST, držanje cookiejev in sessiona, ...), zatakne pa se pri protokolu HTTPS.
Ena od nalog, ki bi jo moral opravljati ta HTTP klient, je tudi prijava v blog, odprt na Blogger.com. Vendar pa se žal login podatki submitajo na URL "https://www.blogger.com/start" in jaz svojega cURL ne znam pripraviti do tega, da bi podatke uspešno poslal.
Tudi, če odprem katerokoli https stran (kot npr. "https://www.blogger.com/start", kjer se nahaja login forma za prijavo), mi cURL ne vrne ničesar. Točneje povedano, "curl_exec($this->process)" vrne "false".
Je že kdo delal kaj podobnega? Kako ste pripravili cURL, da je lepo deloval tudi preko HTTPS protokola?
Zares najlepša hvala vsem za pomoč!
Anže
krho ::
Windows ali Linux platforma? Predvidevam, da manjkajo ssl knjižnice. Pa napake in njih prikaz imaš vklopljene pri razvoju da?
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net
dunker ::
Kaže, da sem malo prehitel z vprašanjem ... Kodo sicer pišem v Windows okolju (XAMPP), medtem ko je produkcijska verzija na Linux strežniku.
Kakorkoli že, pri inicializaciji cURL procesa sem dodal še sledeči vrstici:
curl_setopt($this->process, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->process, CURLOPT_SSL_VERIFYPEER, false);
... in sedaj zadeve čudežno delujejo. Sicer pa ni nobene škode, če tole ostane za zanamce ...
Kakorkoli že, pri inicializaciji cURL procesa sem dodal še sledeči vrstici:
curl_setopt($this->process, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->process, CURLOPT_SSL_VERIFYPEER, false);
... in sedaj zadeve čudežno delujejo. Sicer pa ni nobene škode, če tole ostane za zanamce ...
dunker ::
Ko je tema že ravno odprta, pa še eno vprašanje ...
Vedno, ko naredim nek zahtevek preko cURL (recimo, da se na spletno stran povežem preko GET), mi cURL kar samodejno vrne headerje in HTML na "standard output", torej jih izpiše direktno v browser. Če uporabim opcijo curl_setopt($this->process, CURLOPT_FILE, $handler_output_datoteke), se sicer output piše v izhodno datoteko, vendar ga potem ne morem shranit v spremenljivko. Če uporabim curl_setopt($this->process, CURLOPT_HEADER, 0), se sicer header ne izpiše, vendar HTML kodo še vedno dobim kar direktno v browser.
Rad bi dosegel sledeče: cURL naj ne izpisuje sam od sebe ničesar na standardni izhod, vendar pa naj mi ves output (header + HTML kodo) vrne v spremenljivko ob klicu $response = curl_exec($this->process);.
Ima kdo kakšno idejo, kako to doseči? Najlepša hvala vnaprej!
Vedno, ko naredim nek zahtevek preko cURL (recimo, da se na spletno stran povežem preko GET), mi cURL kar samodejno vrne headerje in HTML na "standard output", torej jih izpiše direktno v browser. Če uporabim opcijo curl_setopt($this->process, CURLOPT_FILE, $handler_output_datoteke), se sicer output piše v izhodno datoteko, vendar ga potem ne morem shranit v spremenljivko. Če uporabim curl_setopt($this->process, CURLOPT_HEADER, 0), se sicer header ne izpiše, vendar HTML kodo še vedno dobim kar direktno v browser.
Rad bi dosegel sledeče: cURL naj ne izpisuje sam od sebe ničesar na standardni izhod, vendar pa naj mi ves output (header + HTML kodo) vrne v spremenljivko ob klicu $response = curl_exec($this->process);.
Ima kdo kakšno idejo, kako to doseči? Najlepša hvala vnaprej!
dunker ::
Uh, ne, poznam sicer output buffering, ampak to ni to ... iščem neko "clean" rešitev.
Gledal sem, da bi v outputu onemogočil HTML kodo z CURLOPT_NOBODY = true ter headerje z CURLOPT_HEADER = false, potem pa bi dostopal do vrnjene HTML kode preko curl_getinfo($this->process, CURLINFO_HTTP_CODE). Hudič je v tem, da s curl_getinfo sicer dobiš mnogo podatkov o transferju (klik tukaj za opis parametrov), vendar pa ne morem pridet do headerjev, ki jih je vrnil strežnik.
Mi ve kdo pomagat?
Gledal sem, da bi v outputu onemogočil HTML kodo z CURLOPT_NOBODY = true ter headerje z CURLOPT_HEADER = false, potem pa bi dostopal do vrnjene HTML kode preko curl_getinfo($this->process, CURLINFO_HTTP_CODE). Hudič je v tem, da s curl_getinfo sicer dobiš mnogo podatkov o transferju (klik tukaj za opis parametrov), vendar pa ne morem pridet do headerjev, ki jih je vrnil strežnik.
Mi ve kdo pomagat?
dunker ::
Izkazalo se je, da je vrstni red nastavljanja raznih curl_setopt opcij vplival na to, da je nekako povozil mojo nastavitev curl_setopt($this->process, CURLOPT_RETURNTRANSFER, true) ter mi curl_exec ni vrnila headerja + HTML kode, temveč zgolj true oziroma false, cURL pa je header + HTML kodo izpisal kar direktno na izhod.
Če bo kdo rabil v prihodnje, tole se je izkazalo za dobro rešitev (za GET zahtevek):
$this->process = curl_init($url);
curl_setopt($this->process, CURLOPT_HTTPHEADER, $this->headers);
curl_setopt($this->process, CURLOPT_HEADER, $this->parse_headers);
curl_setopt($this->process, CURLOPT_USERAGENT, $this->user_agent);
curl_setopt($this->process, CURLOPT_ENCODING , $this->compression);
curl_setopt($this->process, CURLOPT_CONNECTTIMEOUT, $this->timeout);
curl_setopt($this->process, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($this->process, CURLOPT_MAXREDIRS, 10);
curl_setopt($this->process, CURLOPT_FOLLOWLOCATION, true);
if ($this->cookies_enabled == true) {
curl_setopt($this->process, CURLOPT_COOKIEFILE, $this->cookie_file);
curl_setopt($this->process, CURLOPT_COOKIEJAR, $this->cookie_file);
}
curl_setopt($this->process, CURLOPT_RETURNTRANSFER, true);
curl_setopt($this->process, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->process, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($this->process);
Iz spremenljivke $response pa nato relativno preprosto sparsate headerje ter HTML kodo.
Če bo kdo rabil v prihodnje, tole se je izkazalo za dobro rešitev (za GET zahtevek):
$this->process = curl_init($url);
curl_setopt($this->process, CURLOPT_HTTPHEADER, $this->headers);
curl_setopt($this->process, CURLOPT_HEADER, $this->parse_headers);
curl_setopt($this->process, CURLOPT_USERAGENT, $this->user_agent);
curl_setopt($this->process, CURLOPT_ENCODING , $this->compression);
curl_setopt($this->process, CURLOPT_CONNECTTIMEOUT, $this->timeout);
curl_setopt($this->process, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($this->process, CURLOPT_MAXREDIRS, 10);
curl_setopt($this->process, CURLOPT_FOLLOWLOCATION, true);
if ($this->cookies_enabled == true) {
curl_setopt($this->process, CURLOPT_COOKIEFILE, $this->cookie_file);
curl_setopt($this->process, CURLOPT_COOKIEJAR, $this->cookie_file);
}
curl_setopt($this->process, CURLOPT_RETURNTRANSFER, true);
curl_setopt($this->process, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->process, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($this->process);
Iz spremenljivke $response pa nato relativno preprosto sparsate headerje ter HTML kodo.
dunker ::
Fantje, žal imam spet nov problem ...
Mojega v PHP spisanega HTTP klienta sem zdaj na localhost Win XP mašini pripeljal do faze, kjer deluje res perfektno.
In tako je nastopil čas, da vržem skripto na "production" server, gre pa za ServInt VPS, operacijski sistem je nekaj na Linuxu baziranega.
Na serverju sem najprej moral chmodat mapo na 777, da sem vanjo sploh lahko zapisal cookie file. Hudič je v tem, da nekaj s cookieji še zdaj ne štima. Na localhost se koda uspešno logira na stran in brska dalje, na VPS pa se ista koda ne uspe prijavit (po prijavi ob naslednjih requestih očitno ne pošilja zraven cookiejev).
Cookie file uporabljam tako za COOKIEFILE kot COOKIEJAR cURL nastavitvi. Ima kdo kakšno idejo, kaj bi lahko bilo narobe in kako to zrihtat?
Res najlepša hvala vsem,
Anže
Mojega v PHP spisanega HTTP klienta sem zdaj na localhost Win XP mašini pripeljal do faze, kjer deluje res perfektno.
In tako je nastopil čas, da vržem skripto na "production" server, gre pa za ServInt VPS, operacijski sistem je nekaj na Linuxu baziranega.
Na serverju sem najprej moral chmodat mapo na 777, da sem vanjo sploh lahko zapisal cookie file. Hudič je v tem, da nekaj s cookieji še zdaj ne štima. Na localhost se koda uspešno logira na stran in brska dalje, na VPS pa se ista koda ne uspe prijavit (po prijavi ob naslednjih requestih očitno ne pošilja zraven cookiejev).
Cookie file uporabljam tako za COOKIEFILE kot COOKIEJAR cURL nastavitvi. Ima kdo kakšno idejo, kaj bi lahko bilo narobe in kako to zrihtat?
Res najlepša hvala vsem,
Anže
dunker ::
Hm, napako sem rešil, kar sicer ne pomeni, da so vse moje težave odpravljene (saj so na vidiku že nove), ampak gre na bolje.
Trik je bil v tem, da sem na localhost Win XP mašini naredil takole (grob povzetek):
$this->cookie_file = fopen($this->cookie_filename, "w");
curl_setopt($this->process, CURLOPT_COOKIEFILE, $this->cookie_file);
curl_setopt($this->process, CURLOPT_COOKIEJAR, $this->cookie_file);
fclose($this->cookie_file);
cURL sem torej podal "handle" do odprte datoteke in ne imena datoteke, kot piše v dokumentaciji. Sedaj seveda podam $this->cookie_filename. Zanimivo, da je prejšnja varianta na Win kar delovala.
Trik je bil v tem, da sem na localhost Win XP mašini naredil takole (grob povzetek):
$this->cookie_file = fopen($this->cookie_filename, "w");
curl_setopt($this->process, CURLOPT_COOKIEFILE, $this->cookie_file);
curl_setopt($this->process, CURLOPT_COOKIEJAR, $this->cookie_file);
fclose($this->cookie_file);
cURL sem torej podal "handle" do odprte datoteke in ne imena datoteke, kot piše v dokumentaciji. Sedaj seveda podam $this->cookie_filename. Zanimivo, da je prejšnja varianta na Win kar delovala.
Zgodovina sprememb…
- spremenil: dunker ()
JercSI ::
Jaz imam verjetno malce bolj zakomplicirano vprašanje.
Trenutno imam težavo s POST-om podatkov na HTTPS stran (ki je na drugem strežniku). Iz tega strežnika smo dobil certifikate (enega za na server, drugega za v brskalnik). Poleg tega, pa bi rad tudi, da na to stran naredi redirect.
Zadeva deluje, če uporabim formo <form action="strežnik2"...></form>. Vendar se pošiljajo pomembni podatki, ki niso vsem na vpogled in bi jih rad skril.
Trenutno kar mam napisano:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 2);
curl_setopt($ch, CURLOPT_CAINFO, "nas.crt");
curl_setopt($ch, CURLOPT_CAPATH, "path");
curl_setopt($ch, CURLOPT_SSLCERT, "njihov.crt");
Nekje sem prebral, da je potrebno dodati dve vrstici kode. Ampak tudi ne deluje.
ini_set('safe_mode', 0);
ini_set('open_basedir', 0);
Dobivam pa največkrat error 35 (CURLE_SSL_CONNECT_ERROR)
Lp in hvala,
Jernej Lekše
Trenutno imam težavo s POST-om podatkov na HTTPS stran (ki je na drugem strežniku). Iz tega strežnika smo dobil certifikate (enega za na server, drugega za v brskalnik). Poleg tega, pa bi rad tudi, da na to stran naredi redirect.
Zadeva deluje, če uporabim formo <form action="strežnik2"...></form>. Vendar se pošiljajo pomembni podatki, ki niso vsem na vpogled in bi jih rad skril.
Trenutno kar mam napisano:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 2);
curl_setopt($ch, CURLOPT_CAINFO, "nas.crt");
curl_setopt($ch, CURLOPT_CAPATH, "path");
curl_setopt($ch, CURLOPT_SSLCERT, "njihov.crt");
Nekje sem prebral, da je potrebno dodati dve vrstici kode. Ampak tudi ne deluje.
ini_set('safe_mode', 0);
ini_set('open_basedir', 0);
Dobivam pa največkrat error 35 (CURLE_SSL_CONNECT_ERROR)
Lp in hvala,
Jernej Lekše
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Davčna blahajna - PHP - certifikatiOddelek: Programiranje | 1068 (834) | app5771283 |
» | Pornhub s HTTPS protokolom nad požrešne ISP-je (strani: 1 2 )Oddelek: Novice / Zasebnost | 22699 (11356) | M.B. |
» | PHP davčna blagajnaOddelek: Programiranje | 8180 (6204) | brble |
» | cURLOddelek: Omrežja in internet | 1026 (816) | d4vid |
» | Google predstavil igro svetovni monopoly (strani: 1 2 3 4 5 6 7 8 )Oddelek: Novice / Igre | 28252 (15722) | PaX_MaN |