PHPからのSSL:ソケットとcURL

今日、この眠い夏の朝、PHPスクリプトからのSSL接続について説明します。 理論だけでなく、実用的な問題を解決するために、Googleブログサービスblogger.comにログインして説明します。



ソケットから始めましょう。 ヘルプは、HTTPSプロトコルを使用する可能性を宣言したので、試してみてください。 POST変数のセットは、 開発者ガイドから取得されます 。 Habraparserは石鹸をリンクでフレーム化するため、「@」は(at)に置き換えられます。



 $postvars = array( 
      

"Email" => "mail(at)gmail.com",

"Passwd" => "pass",

"service" => "blogger"

);



$postdata = "";

foreach ( $postvars as $key => $value )

$postdata .= "&".rawurlencode($key)."=".rawurlencode($value);

$postdata = substr( $postdata, 1 );



$fp = fsockopen("ssl://google.com", 443);

$send = "";

$send .= "POST /accounts/ClientLogin HTTP/1.1\r\n";

$send .= "Host: google.com\r\n";

$send .= "Content-length: ".strlen($postdata)."\r\n";

$send .= "Content-type: text/plain\r\n";

$send .= "Connection: close\r\n";

$send .= "\r\n";

$send .= $postdata."\r\n\r\n";



fputs($fp, $send);

$html = fread($fp, 1000000);

fclose($fp);



echo "".$html." ";




$postvars = array(

"Email" => "mail(at)gmail.com",

"Passwd" => "pass",

"service" => "blogger"

);



$postdata = "";

foreach ( $postvars as $key => $value )

$postdata .= "&".rawurlencode($key)."=".rawurlencode($value);

$postdata = substr( $postdata, 1 );



$fp = fsockopen("ssl://google.com", 443);

$send = "";

$send .= "POST /accounts/ClientLogin HTTP/1.1\r\n";

$send .= "Host: google.com\r\n";

$send .= "Content-length: ".strlen($postdata)."\r\n";

$send .= "Content-type: text/plain\r\n";

$send .= "Connection: close\r\n";

$send .= "\r\n";

$send .= $postdata."\r\n\r\n";



fputs($fp, $send);

$html = fread($fp, 1000000);

fclose($fp);



echo "".$html." ";








fsockopen関数では、httpsは使用しませんが、サーバー名の前のプレフィックスとしてsslを使用します。 ヘルプのプレーンテキストで書かれています。 その後、すべてが簡単です。 HTTPヘッダーを作成し、オープンソケットに押し込みます。 答えを読んで、



Error=BadAuthentication







要するに、時間の試練を省き、ソケットの機能の周りで踊ると、成功しませんでした。 つまり、GET要求は正常に返されましたが、POSTデータを送信することはできませんでした。 たぶんこれはGoogleサーバーにのみ接続されていますが、どこか他の場所で機能します。



UPD。 anabolik habrayuzerに感謝します。1人のヘッダー行を変更して、

$send .= "Content-type: application/x-www-form-urlencoded\r\n";





その後、すべてがすぐに動作します。 どうもありがとう。 あらゆる方法で感謝=)。



2番目のメソッドに渡します。



cURLに関するmanページを開き、喜んでいます。 どのような構成でも、リクエストには非常に多くの可能性があります。 うまくいくはずです。 したがって、curl_setoptに進みます。 必要になります

CURLOPT_URLはリクエストURLです。

CURLOPT_POST-POSTリクエストを送信すると言います。

CURLOPT_POSTFIELDS-実際に変数をPOSTします。

CURLOPT_RETURNTRANSFER-要求の結果を返し、ブラウザに出力しません。



SSLパラメーターについて:

CURLOPT_SSL_VERIFYPEER-0に設定すると、リモートサーバーは証明書を確認しません。 それ以外の場合は、この証明書を送信する必要があります。

CURLOPT_CAINFO-CURLOPT_SSL_VERIFYPEERが1に設定されている場合、証明書ファイルを指定します

CURLOPT_SSLVERSION-通常は自動的に決定されるSSLバージョン(2または3)を示す整数。

CURLOPT_SSL_VERIFYHOST-証明書で指定されたリモートサーバーの名前を確認するかどうか。 値を「2」に設定すると、ホスト名もチェックされます。 (正直なところ、このフラグが何をするのかまだわかりません)



以上です。 Googleの場合は、証明書を持ってこなかったことを示すだけで済みます。 コードを書いています。



$postvars = array(

"Email" => "mail(at)gmail.com",

"Passwd" => "pass",

"service" => "blogger"

);



$postdata = "";

foreach ( $postvars as $key => $value )

$postdata .= "&".rawurlencode($key)."=".rawurlencode($value);

$postdata = substr( $postdata, 1 );



$ch = curl_init();

curl_setopt ($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin");

curl_setopt ($ch, CURLOPT_POST, 1);

curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec ($ch);

curl_close($ch);



echo $result;








$結果変数には、3行ありますが、そのうち1行のみが必要です。最後の行は「Auth = "で始まります」。 しかし、これについては、おそらく次回。



これは私のブログからのクロスポストです。



All Articles