» »

[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

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

BigWhale ::

Ja, curl deluje povsem normalno z https, le openssl knjiznjice moras imeti.

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. :D Sicer pa ni nobene škode, če tole ostane za zanamce ... ;)

BigWhale ::

Hihi.

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!

Ziga Dolhar ::

Output buffering? (Če ne gre lepše.)

PHP: Output Control - Manual
https://dolhar.si/

Zgodovina sprememb…

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?

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.

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

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.

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


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Davčna blahajna - PHP - certifikati

Oddelek: Programiranje
51007 (773) app5771283
»

Pornhub s HTTPS protokolom nad požrešne ISP-je (strani: 1 2 )

Oddelek: Novice / Zasebnost
5821674 (10331) M.B.
»

PHP davčna blagajna

Oddelek: Programiranje
187981 (6005) brble
»

cURL

Oddelek: Omrežja in internet
10988 (778) d4vid
»

Google predstavil igro svetovni monopoly (strani: 1 2 3 4 5 6 7 8 )

Oddelek: Novice / Igre
35027751 (15221) PaX_MaN

Več podobnih tem