HTTPS-Resource via PHP-Socket hinter Proxy laden – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self HTTPS-Resource via PHP-Socket hinter Proxy laden Mon, 04 Jul 16 12:21:00 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670423#m1670423 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670423#m1670423 <p>Liebe Mitlesende,</p> <p>ich möchte wie im Titel schon benannt eine HTTPS-Resource laden, die ein PHP-Script hinter einem Proxy über eine Socket-Verbindung vom Webserver anfordert. Folgender Code funktioniert mit http (also ohne <em>s</em>) wie gewünscht (Erfolg durch Trial&Error):</p> <pre><code class="block language-php"><span class="token variable">$response</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token variable">$url</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'https://felix-riesterer.de/'</span><span class="token punctuation">;</span> <span class="token variable">$h</span> <span class="token operator">=</span> <span class="token function">fsockopen</span><span class="token punctuation">(</span> <span class="token comment">// Host directly or via Proxy?</span> <span class="token punctuation">(</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'proxy-server'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'host'</span><span class="token punctuation">]</span> <span class="token punctuation">:</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'proxy-server'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">// Port</span> <span class="token punctuation">(</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'proxy-server'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'proxy-port'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token number">80</span> <span class="token punctuation">:</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'proxy-port'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$h</span> <span class="token operator">!==</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$http</span> <span class="token operator">=</span> <span class="token function">sprintf</span><span class="token punctuation">(</span> <span class="token comment">// generate HTTP request</span> <span class="token string single-quoted-string">'GET http://%1$s/%2$s HTTP/1.1'</span><span class="token operator">.</span><span class="token string double-quoted-string">"\r\n"</span> <span class="token comment">// Proxy Server</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'Host: %1$s'</span><span class="token operator">.</span><span class="token string double-quoted-string">"\r\n"</span> <span class="token comment">// Proxy-Authorization?</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'%3$s'</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'User-Agent: %4$s'</span><span class="token operator">.</span><span class="token string double-quoted-string">"\r\n"</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'Connection: close'</span><span class="token operator">.</span><span class="token string double-quoted-string">"\r\n"</span> <span class="token comment">// empty line to end HTTP headers</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"\r\n"</span><span class="token punctuation">,</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'host'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$url</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'proxy-server'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token string single-quoted-string">''</span> <span class="token punctuation">:</span> <span class="token function">sprintf</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'Proxy-Authorization: Basic %s'</span><span class="token operator">.</span><span class="token string double-quoted-string">"\r\n"</span><span class="token punctuation">,</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'proxy-auth'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'user-agent'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">fputs</span><span class="token punctuation">(</span><span class="token variable">$h</span><span class="token punctuation">,</span> <span class="token variable">$http</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">feof</span><span class="token punctuation">(</span><span class="token variable">$h</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$response</span> <span class="token operator">.=</span> <span class="token function">fread</span><span class="token punctuation">(</span><span class="token variable">$h</span><span class="token punctuation">,</span> <span class="token number">4096</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token function">debug</span><span class="token punctuation">(</span><span class="token variable">$response</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// HTTP/1.1 200 OK\r\nDate: Mon, 04 Jul 2016 11:58:47 GMT\r\nServer...</span> </code></pre> <p>Wenn ich nun den String mit <code class="language-php"><span class="token string single-quoted-string">'GET http://%1$s/%2$s HTTP/1.1'</span></code> durch ein <em>s</em> ergänze, damit er nun auf <code class="language-php"><span class="token string single-quoted-string">'GET https://%1$s/%2$s HTTP/1.1'</span></code> lautet, ändert das nicht das Protokoll - was mich eigentlich auch gewundert hätte.</p> <p>Muss ich nun als Protokoll <em>ssl://felix-riesterer.de</em> verwenden, oder kann ich die bestehende Codebasis durch eine klitzekleine Anpassung dazu bringen, dass HTTPS verwendet wird?</p> <p>Liebe Grüße,</p> <p>Felix Riesterer.</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Mon, 04 Jul 16 12:31:15 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670425#m1670425 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670425#m1670425 <p>Hallo Felix,</p> <p>ich weiß nicht, ob ich den Knackpunkt erkannt habe, aber ...</p> <blockquote> <pre><code class="block language-php"> <span class="token variable">$http</span> <span class="token operator">=</span> <span class="token function">sprintf</span><span class="token punctuation">(</span> <span class="token comment">// generate HTTP request</span> <span class="token string single-quoted-string">'GET http://%1$s/%2$s HTTP/1.1'</span><span class="token operator">.</span><span class="token string double-quoted-string">"\r\n"</span> <span class="token comment">// das ist definitiv falsch!</span> <span class="token comment">// Protokoll und Hostname haben in</span> <span class="token comment">// dieser Zeile nichts verloren!</span> <span class="token comment">// Proxy Server</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'Host: %1$s'</span><span class="token operator">.</span><span class="token string double-quoted-string">"\r\n"</span> <span class="token comment">// Proxy-Authorization?</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'%3$s'</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'User-Agent: %4$s'</span><span class="token operator">.</span><span class="token string double-quoted-string">"\r\n"</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'Connection: close'</span><span class="token operator">.</span><span class="token string double-quoted-string">"\r\n"</span> <span class="token comment">// empty line to end HTTP headers</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"\r\n"</span><span class="token punctuation">,</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'host'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$url</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'proxy-server'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token string single-quoted-string">''</span> <span class="token punctuation">:</span> <span class="token function">sprintf</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'Proxy-Authorization: Basic %s'</span><span class="token operator">.</span><span class="token string double-quoted-string">"\r\n"</span><span class="token punctuation">,</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'proxy-auth'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'user-agent'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>An der kommentierten Stelle ist definitiv fehlerhaftes HTTP; es überrascht mich, dass der Server das anscheinend klaglos akzeptiert. Korrekt heißt die erste Zeile des Requests beispielsweise:</p> <pre><code class="block language-http"><span class="token request-line"><span class="token method property">GET</span> <span class="token request-target url">/sub/somedoc.txt</span> <span class="token http-version property">HTTP/1.1</span></span> </code></pre> <blockquote> <p>Wenn ich nun den String mit <code class="language-php"><span class="token string single-quoted-string">'GET http://%1$s/%2$s HTTP/1.1'</span></code> durch ein <em>s</em> ergänze, damit er nun auf <code class="language-php"><span class="token string single-quoted-string">'GET https://%1$s/%2$s HTTP/1.1'</span></code> lautet, ändert das nicht das Protokoll - was mich eigentlich auch gewundert hätte.</p> </blockquote> <p>Eben. Das ändert nur den Lieferschein, der <strong>in</strong> der Sendung liegt.</p> <blockquote> <p>Muss ich nun als Protokoll <em>ssl://felix-riesterer.de</em> verwenden</p> </blockquote> <p>AFAIS ja, und zwar beim fsockopen(), denn HTTPS ist ja genau das: HTTP über eine zuvor hergestellte SSL-Verbindung. Ich habe das aber auch noch nie gemacht, daher <em>vermute</em> ich nur, dass es so gehen muss.</p> <p>Ciao,<br>  Martin</p> <div class="signature">-- <br> Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.<br> - Douglas Adams, The Hitchhiker's Guide To The Galaxy </div> HTTPS-Resource via PHP-Socket hinter Proxy laden Mon, 04 Jul 16 12:43:43 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670427#m1670427 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670427#m1670427 <p>Tach!</p> <blockquote> <p>Wenn ich nun den String mit <code class="language-php"><span class="token string single-quoted-string">'GET http://%1$s/%2$s HTTP/1.1'</span></code> durch ein <em>s</em> ergänze, damit er nun auf <code class="language-php"><span class="token string single-quoted-string">'GET https://%1$s/%2$s HTTP/1.1'</span></code> lautet, ändert das nicht das Protokoll - was mich eigentlich auch gewundert hätte.</p> </blockquote> <p>Bei HTTPS muss der Proxy normalerweise auf Durchzug stellen, sonst wäre er ein man in the middle. Er darf nur die Pakete zum Ziel leiten und zurück. Was darin ist, sieht er nicht. Nicht mal den Pfad der URL braucht er, nur die IP. Er kann in dem Fall auch nicht HTTP sprechen. Such mal nach "https over proxy", da liest man dann sowas wie CONNECT. Mehr weiß ich aber auch nicht.</p> <p>dedlfix.</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Mon, 04 Jul 16 12:56:21 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670428#m1670428 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670428#m1670428 <p>Hi,</p> <blockquote> <p>ich möchte wie im Titel schon benannt eine HTTPS-Resource laden, die ein PHP-Script hinter einem Proxy über eine Socket-Verbindung vom Webserver anfordert. Folgender Code funktioniert mit http (also ohne <em>s</em>) wie gewünscht (Erfolg durch Trial&Error):</p> <pre><code class="block language-php"> <span class="token comment">// Port</span> <span class="token punctuation">(</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'proxy-server'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'proxy-port'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token number">80</span> <span class="token punctuation">:</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'proxy-port'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span> </code></pre> </blockquote> <blockquote> <p>Wenn ich nun den String mit <code class="language-php"><span class="token string single-quoted-string">'GET http://%1$s/%2$s HTTP/1.1'</span></code> durch ein <em>s</em> ergänze, damit er nun auf <code class="language-php"><span class="token string single-quoted-string">'GET https://%1$s/%2$s HTTP/1.1'</span></code> lautet, ändert das nicht das Protokoll - was mich eigentlich auch gewundert hätte.</p> </blockquote> <blockquote> <p>Muss ich nun als Protokoll <em>ssl://felix-riesterer.de</em> verwenden, oder kann ich die bestehende Codebasis durch eine klitzekleine Anpassung dazu bringen, dass HTTPS verwendet wird?</p> </blockquote> <p>https geht üblicherweise (soweit nicht anders deklariert) über Port 443, nicht 80. Hast Du den Port auch angepaßt? Ist aus Deinem Schnipsel nicht erkennbar, da nicht erkennbar ist, ob etwas und wenn ja was in <code>$t->settings['proxy-port']</code> steckt ...</p> <p>cu,<br> Andreas a/k/a MudGuard</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Tue, 05 Jul 16 11:04:57 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670569#m1670569 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670569#m1670569 <p>Nachtrag,</p> <p>bin jetzt mit der EDV-Abteilung im Dialog, um das Problem zu lösen. Auf der einen Seite muss ich natürlich korrektes HTTP verwenden, auf der anderen Seite aber muss der Proxy auch so konfiguriert sein, dass mein Ansinnen umsetzbar ist. Ja, mit einem Browser kann man HTTPS-Resourcen über diesen Proxy aufrufen, also muss es prinzipiell auch mit PHP über eine Socket-Verbindung klappen. Mit dem Wie lasse ich mir eben von denen helfen, die ihre Finger am Proxy haben.</p> <p>Wenn ich neue Erkenntnisse habe, poste ich sie hier.</p> <p>Liebe Grüße,</p> <p>Felix Riesterer.</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Wed, 06 Jul 16 09:06:21 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670664#m1670664 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670664#m1670664 <p>Hallo,</p> <p>wie wäre es, wenn du einfach eine fertige HTTP-Client-Library nutzt? In Zeiten von PSR-7 existieren davon einige zueinander kompatible, die bekannteste ist wohl <a href="http://docs.guzzlephp.org/en/latest/index.html" rel="nofollow noopener noreferrer">Guzzle</a>, sehr einfach über composer zu installieren.</p> <p>Manuelles fsockopen und HTTP mit String-Operationen schreiben will später doch niemand mehr warten.</p> <p>Viele Grüße, Matti</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Mon, 04 Jul 16 14:04:41 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670433#m1670433 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670433#m1670433 <p>Lieber Martin,</p> <blockquote> <blockquote> <pre><code class="block language-php"> <span class="token string single-quoted-string">'GET http://%1$s/%2$s HTTP/1.1'</span><span class="token operator">.</span><span class="token string double-quoted-string">"\r\n"</span> <span class="token comment">// das ist definitiv falsch!</span> <span class="token comment">// Protokoll und Hostname haben in</span> <span class="token comment">// dieser Zeile nichts verloren!</span> </code></pre> </blockquote> <p>An der kommentierten Stelle ist definitiv fehlerhaftes HTTP; es überrascht mich, dass der Server das anscheinend klaglos akzeptiert. Korrekt heißt die erste Zeile des Requests beispielsweise:</p> <pre><code class="block language-http"><span class="token request-line"><span class="token method property">GET</span> <span class="token request-target url">/sub/somedoc.txt</span> <span class="token http-version property">HTTP/1.1</span></span> </code></pre> </blockquote> <p>das habe ich alles schon so durchprobiert. Warum es in der von Dir vorgeschlagenen Weise nicht klappen will, ist mir unbekannt. Auf den Proxy habe ich keinerlei administrativen Einfluss. Daher schrieb ich von "Trial&Error".</p> <blockquote> <blockquote> <p>Muss ich nun als Protokoll <em>ssl://felix-riesterer.de</em> verwenden</p> </blockquote> <p>AFAIS ja, und zwar beim fsockopen(), denn HTTPS ist ja genau das: HTTP über eine zuvor hergestellte SSL-Verbindung. Ich habe das aber auch noch nie gemacht, daher <em>vermute</em> ich nur, dass es so gehen muss.</p> </blockquote> <p>Werde das morgen mal in der Schule testen. Vielen Dank!</p> <p>Liebe Grüße,</p> <p>Felix Riesterer.</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Mon, 04 Jul 16 14:20:02 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670436#m1670436 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670436#m1670436 <p>Tach!</p> <blockquote> <p>An der kommentierten Stelle ist definitiv fehlerhaftes HTTP; es überrascht mich, dass der Server das anscheinend klaglos akzeptiert. Korrekt heißt die erste Zeile des Requests beispielsweise:</p> <pre><code class="block language-http"><span class="token request-line"><span class="token method property">GET</span> <span class="token request-target url">/sub/somedoc.txt</span> <span class="token http-version property">HTTP/1.1</span></span> </code></pre> </blockquote> <p>Nicht, wenn man mit einem Proxy spricht. Da fehlt Protokoll und Host und so weiß er gar nicht, wie und wohin er den Request schicken soll. Und nein, das steht auch nicht in der Host-Zeile, denn da steht der Proxy selbst drin.</p> <p>Aber wenn ich da nochmal genauer schaue, dann scheint mir als Ergebnis<br> GET http://proxy_adresse/https://felix-riesterer.de/ HTTP/1.1<br> rauszukommen und das ist definitiv verkehrt.</p> <p>dedlfix.</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Mon, 04 Jul 16 14:06:10 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670434#m1670434 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670434#m1670434 <p>Lieber dedlfix,</p> <blockquote> <p>Bei HTTPS muss der Proxy normalerweise auf Durchzug stellen, sonst wäre er ein man in the middle.</p> </blockquote> <p>daher die Nachfrage nach <code>ssl://felix-riesterer.de/</code> anstelle von <code>https://felix-riesterer.de/</code>.</p> <blockquote> <p>Such mal nach "https over proxy", da liest man dann sowas wie CONNECT. Mehr weiß ich aber auch nicht.</p> </blockquote> <p>Vielen Dank für die Stichworte!</p> <p>Liebe Grüße,</p> <p>Felix Riesterer.</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Mon, 04 Jul 16 13:07:33 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670429#m1670429 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670429#m1670429 <p>Tach!</p> <blockquote> <p>https geht üblicherweise (soweit nicht anders deklariert) über Port 443, nicht 80.</p> </blockquote> <p>Das ist erstmal nur die Verbindung zum Proxy. Der muss für HTTPS nicht auf einem Extraport lauschen, sondern kann das auch über Port 80 oder einen beliebigen anderen abfackeln.</p> <p>dedlfix.</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Mon, 04 Jul 16 14:07:33 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670435#m1670435 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670435#m1670435 <p>Lieber dedlfix,</p> <blockquote> <p>Das ist erstmal nur die Verbindung zum Proxy. Der muss für HTTPS nicht auf einem Extraport lauschen, sondern kann das auch über Port 80 oder einen beliebigen anderen abfackeln.</p> </blockquote> <p>in meinem Fall Port 8080 sowohl für HTTP als auch HTTPS.</p> <p>Liebe Grüße,</p> <p>Felix Riesterer.</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Mon, 04 Jul 16 14:29:39 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670437#m1670437 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670437#m1670437 <p>Tach,</p> <blockquote> <blockquote> <p>Bei HTTPS muss der Proxy normalerweise auf Durchzug stellen, sonst wäre er ein man in the middle.</p> </blockquote> <p>daher die Nachfrage nach <code>ssl://felix-riesterer.de/</code> anstelle von <code>https://felix-riesterer.de/</code>.</p> </blockquote> <p>nein, du kommunizierst zuerst mit dem Proxy via HTTP und (falls der Proxy das via CONNECT handelt) machst einen CONNECT-Request:</p> <pre><code class="block language-http">CONNECT server.example.com:80 HTTP/1.1 <span class="token header"><span class="token header-name keyword">Host</span><span class="token punctuation">:</span> <span class="token header-value">server.example.com:443</span></span> </code></pre> <p>Wenn du dann ein 200er-Ergebnis bekommst, ist ab der nächsten Zeile die Kommunikation dann TCP mit dem angeforderten Host, in deinem Falle dann also HTTP über TLS über TCP.</p> <p>mfg<br> Woodfighter</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Mon, 04 Jul 16 14:56:13 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670446#m1670446 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670446#m1670446 <p>Hallo,</p> <blockquote> <blockquote> <pre><code class="block language-http"><span class="token request-line"><span class="token method property">GET</span> <span class="token request-target url">/sub/somedoc.txt</span> <span class="token http-version property">HTTP/1.1</span></span> </code></pre> </blockquote> <p>Nicht, wenn man mit einem Proxy spricht. Da fehlt Protokoll und Host und so weiß er gar nicht, wie und wohin er den Request schicken soll. Und nein, das steht auch nicht in der Host-Zeile, denn da steht der Proxy selbst drin.</p> </blockquote> <p>da hatte ich eine andere Vorstellung - aber eben kein <em>Wissen</em>. Ich dachte, der Proxy wird ganz normal angesprochen, als sei er der Ziel-Host, und macht dann selbst eine DNS-Abfrage auf den gewünschten Hostnamen und leitet den Request weiter. Ob HTTP oder HTTPS, hätte er - nach meiner Vorstellung - danach entschieden, ob der Request <strong>vom</strong> Client schon verschlüsselt käme oder nicht.</p> <p>Aber wie gesagt, HTTP mit Proxy habe ich auch noch nie genauer untersucht.</p> <blockquote> <p>Aber wenn ich da nochmal genauer schaue, dann scheint mir als Ergebnis</p> <pre><code class="block language-http"><span class="token request-line"><span class="token method property">GET</span> <span class="token request-target url">http://proxy_adresse/https://felix-riesterer.de/</span> <span class="token http-version property">HTTP/1.1</span></span> </code></pre> <p>rauszukommen und das ist definitiv verkehrt.</p> </blockquote> <p>Yo, das sieht irgendwie falsch aus.</p> <p>So long,<br>  Martin</p> <div class="signature">-- <br> Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.<br> - Douglas Adams, The Hitchhiker's Guide To The Galaxy </div> HTTPS-Resource via PHP-Socket hinter Proxy laden Mon, 04 Jul 16 14:36:59 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670439#m1670439 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670439#m1670439 <p>Tach!</p> <blockquote> <p>nein, du kommunizierst zuerst mit dem Proxy via HTTP und (falls der Proxy das via CONNECT handelt) machst einen CONNECT-Request:</p> <pre><code class="block language-http">CONNECT server.example.com:80 HTTP/1.1 <span class="token header"><span class="token header-name keyword">Host</span><span class="token punctuation">:</span> <span class="token header-value">server.example.com:443</span></span> </code></pre> </blockquote> <p>Wobei bei Host der Name vom Proxy eingetragen werden muss und beim CONNECT die Zieladresse. Zweimal denselben Namen zu verwenden wäre sinnlos. Wozu braucht man einen Proxy, wenn man den Server direkt ansprechen kann (wenn nicht grad sein Port 80 gefirewallt ist)?</p> <p>dedlfix.</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Mon, 04 Jul 16 14:41:51 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670441#m1670441 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670441#m1670441 <p>Tach,</p> <blockquote> <p>Tach!</p> <blockquote> <p>nein, du kommunizierst zuerst mit dem Proxy via HTTP und (falls der Proxy das via CONNECT handelt) machst einen CONNECT-Request:</p> <pre><code class="block language-http">CONNECT server.example.com:80 HTTP/1.1 <span class="token header"><span class="token header-name keyword">Host</span><span class="token punctuation">:</span> <span class="token header-value">server.example.com:443</span></span> </code></pre> </blockquote> <p>Wobei bei Host der Name vom Proxy eingetragen werden muss und beim CONNECT die Zieladresse. Zweimal denselben Namen zu verwenden wäre sinnlos.</p> </blockquote> <p>äh, korrekt; hatte das Beispiel aus der <a href="https://tools.ietf.org/html/rfc7231#section-4.3.6" rel="nofollow noopener noreferrer">RFC</a>, die ich eigentlich auch verlinken wollte, kopiert, aber nur den Port angepasst</p> <blockquote> <p>Wozu braucht man einen Proxy, wenn man den Server direkt ansprechen kann (wenn nicht grad sein Port 80 gefirewallt ist)?</p> </blockquote> <p>Das Beispiel geht ursprünglich davon aus, dass es um ein SSL-Upgrade geht, ähnlich STARTTLS in anderen Protokollen.</p> <p>mfg<br> Woodfighter</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Mon, 04 Jul 16 14:59:46 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670448#m1670448 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670448#m1670448 <p>Hallo,</p> <blockquote> <p>Wozu braucht man einen Proxy, wenn man den Server direkt ansprechen kann (wenn nicht grad sein Port 80 gefirewallt ist)?</p> </blockquote> <p>transparentes Caching, Logging, Content-Filterung, ...?</p> <p>So long,<br>  Martin</p> <div class="signature">-- <br> Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.<br> - Douglas Adams, The Hitchhiker's Guide To The Galaxy </div> HTTPS-Resource via PHP-Socket hinter Proxy laden Tue, 05 Jul 16 11:22:33 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670571#m1670571 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670571#m1670571 <p>Tach!</p> <blockquote> <p>Ja, mit einem Browser kann man HTTPS-Resourcen über diesen Proxy aufrufen, also muss es prinzipiell auch mit PHP über eine Socket-Verbindung klappen. Mit dem Wie lasse ich mir eben von denen helfen, die ihre Finger am Proxy haben.</p> </blockquote> <p>Du kannst dir auch vom Leitungshai helfen lassen. Zumindest bis zu dem Teil, an dem die Verschlüsslung ansetzt, kannst du zuschauen, was die Beteiligten so tun.</p> <p>Das ist ja dann übrigens noch das nächste Problem. Wenn du Low-Level arbeiten willst, sprich selbst das Protokoll sprechen willst, musst du auch den Teil mit der Verschlüsslung selbst lösen.</p> <p>Nimm mal lieber Curl oder die PHP-Dateifunktionen. Dem Curl kann man sicher einen Proxy verkaufen, den Dateifunktionen muss man das über den <a href="http://php.net/manual/en/context.http.php" rel="noopener noreferrer">Stream-Kontext</a> mitgeben.</p> <p>dedlfix.</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Tue, 05 Jul 16 13:48:00 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670586#m1670586 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670586#m1670586 <p>Nochmal Nachtrag.</p> <blockquote> <p>Wenn ich neue Erkenntnisse habe, poste ich sie hier.</p> </blockquote> <p>mit stream_context geht's jetzt:</p> <pre><code class="block language-php"><span class="token comment">// new data</span> <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token variable">$stream</span> <span class="token operator">=</span> <span class="token function">stream_context_create</span><span class="token punctuation">(</span> <span class="token keyword">Array</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'http'</span> <span class="token operator">=></span> <span class="token keyword">Array</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'method'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'GET'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'timeout'</span> <span class="token operator">=></span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'header'</span> <span class="token operator">=></span> <span class="token keyword">array</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'Connection: close'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'User-agent: '</span><span class="token operator">.</span><span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'user-agent'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Proxy-Authorization: Basic '</span><span class="token operator">.</span><span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'proxy-auth'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'protocol_version'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'1.1'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'proxy'</span> <span class="token operator">=></span> <span class="token function">sprintf</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'tcp://%1$s:%2$s'</span><span class="token punctuation">,</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'proxy-server'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'proxy-port'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'request_fulluri'</span> <span class="token operator">=></span> <span class="token constant boolean">true</span> <span class="token comment">/* without this option we get an HTTP error! */</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'ssl'</span> <span class="token operator">=></span> <span class="token keyword">Array</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'SNI_enabled'</span> <span class="token operator">=></span> <span class="token constant boolean">true</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'SNI_server_name'</span> <span class="token operator">=></span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'host'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$fp</span> <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span> <span class="token function">sprintf</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'https://%1$s/%2$s'</span><span class="token punctuation">,</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token property">settings</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'host'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token comment">// ensure absolute path</span> <span class="token function">preg_replace</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'~^/?~'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">,</span> <span class="token variable">$display</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'url'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'r'</span><span class="token punctuation">,</span> <span class="token constant boolean">false</span><span class="token punctuation">,</span> <span class="token variable">$stream</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$fp</span> <span class="token operator">!==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">feof</span><span class="token punctuation">(</span><span class="token variable">$fp</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$response</span> <span class="token operator">.=</span> <span class="token function">fread</span><span class="token punctuation">(</span><span class="token variable">$fp</span><span class="token punctuation">,</span> <span class="token number">4096</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">fclose</span><span class="token punctuation">(</span><span class="token variable">$fp</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$response</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$filename</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'downloaded.html'</span><span class="token punctuation">;</span> <span class="token function">file_put_contents</span><span class="token punctuation">(</span><span class="token variable">$filename</span><span class="token punctuation">,</span> <span class="token variable">$response</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Liebe Grüße,</p> <p>Felix Riesterer.</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Tue, 05 Jul 16 13:44:07 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670585#m1670585 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670585#m1670585 <p>Lieber dedlfix,</p> <blockquote> <p><a href="http://php.net/manual/en/context.http.php" rel="noopener noreferrer">Stream-Kontext</a></p> </blockquote> <p>DAS war der entscheidende Hinweis! Mega-vielen Dank! dedlfix for the win!!!</p> <p>Liebe Grüße,</p> <p>Felix Riesterer.</p> HTTPS-Resource via PHP-Socket hinter Proxy laden Wed, 06 Jul 16 12:49:11 Z https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670685#m1670685 https://forum.selfhtml.org/self/2016/jul/4/https-resource-via-php-socket-hinter-proxy-laden/1670685#m1670685 <p>Lieber Matti,</p> <blockquote> <p><a href="http://docs.guzzlephp.org/en/latest/index.html" rel="nofollow noopener noreferrer">Guzzle</a></p> </blockquote> <p>interessantes Modul! Vielen Dank für diese Anregung.</p> <p>Ich habe mir <a href="http://docs.guzzlephp.org/en/latest/request-options.html#proxy" rel="nofollow noopener noreferrer">die Docs im Berreich Proxy</a> angeschaut. Im Vergleich zu <a href="https://forum.selfhtml.org/m1670586" rel="noopener noreferrer">meiner Lösung</a> sehe ich - wie gesagt für meinen Einsatzzweck - keinen Vorteil.</p> <p>Liebe Grüße,</p> <p>Felix Riesterer.</p>