質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

2073閲覧

Laravel内のcurlでSSL利用できない

yamayamak

総合スコア131

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2018/11/17 00:56

編集2018/11/17 00:57

Laravel 5.5.19を利用しています。

以下のコードで、Laravel内のcurlでSSL利用(HTTPS)できません。
HTTP-Codeは0(ゼロ)になります。
HTTPのSSLでないサイトの場合(HTTP)は同じコードで正常に取得できます。
(HTTP-Codeは200でHTTPコードが取得できます。)

関係ないかもしれませんが、最近になって取得できなくなった気もしていますので、バージョンを記載させて頂きます。

php

1$ch = curl_init(); 2curl_setopt( $ch, CURLOPT_URL, "https://www.google.com" ); 3curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE); 4curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, FALSE); 5curl_setopt( $ch, CURLOPT_TIMEOUT, 5 ); 6curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); 7$result = curl_exec( $ch ); 8$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 9curl_close( $ch ); 10\Log::debug("CurlTest:" . $httpCode );

また、同じAWS-Linux上において、curlコマンドを実行したらSSL利用(HTTPS)しても問題なくHTTPコードが取得できて動作しています。

Linux

1uname -a 2Linux ip-172-31-18-75 4.14.62-65.117.amzn1.x86_64 #1 SMP Fri Aug 10 20:03:52 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 3 4curl -V 5curl 7.53.1 (x86_64-redhat-linux-gnu) libcurl/7.53.1 NSS/3.28.4 zlib/1.2.8 libidn2/0.16 libpsl/0.6.2 (+libicu/50.1.2) libssh2/1.4.2 nghttp2/1.21.1 6Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 7Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz HTTP2 UnixSockets HTTPS-proxy PSL 8 9curl "https://www.google.com" 10問題なく動作します。

SSL証明書CheckはOFFにしているし同じサーバのCurlコマンドで取得できているので、SSL証明書の設定ではないと考えています。

問題などあればご教授をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

おそらく証明書の検証で失敗しているはずですので、
エラー内容を表示してみてください。

php

1$ch = curl_init(); 2curl_setopt( $ch, CURLOPT_URL, "https://www.google.com" ); 3curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE); 4curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, FALSE); 5curl_setopt( $ch, CURLOPT_TIMEOUT, 5 ); 6curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); 7if( ! $result = curl_exec($ch)) { 8 \Log::debug("CurlError:" . curl_error($ch)); 9} 10 11$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 12curl_close( $ch ); 13\Log::debug("CurlTest:" . $httpCode );

以下追記

CA証明書がないエラーが発生する場合がある時の対応
一旦試してもらえますか?

composer require composer/ca-bundle

php

1$ch = curl_init(); 2curl_setopt( $ch, CURLOPT_URL, "https://www.google.com" ); 3 4$caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath(); 5if (is_dir($caPathOrFile) || (is_link($caPathOrFile) && is_dir(readlink($caPathOrFile)))) { 6 curl_setopt($curl, CURLOPT_CAPATH, $caPathOrFile); 7} else { 8 curl_setopt($curl, CURLOPT_CAINFO, $caPathOrFile); 9} 10 11curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE); 12curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, FALSE); 13curl_setopt( $ch, CURLOPT_TIMEOUT, 5 ); 14curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); 15if( ! $result = curl_exec($ch)) { 16 \Log::debug("CurlError:" . curl_error($ch)); 17} 18 19$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 20curl_close( $ch ); 21\Log::debug("CurlTest:" . $httpCode ); 22

投稿2018/11/17 01:17

編集2018/11/17 02:59
moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamayamak

2018/11/17 01:22

curl_error($ch)は確認していたのですが何も表示されないです。 コードを上記の通り実行しましたが、以下のようになります。 [2018-11-17 10:19:33] testing.DEBUG: CurlError: 特にエラー内容が表示されていませんが、実行には失敗しているようです。 これはSSL証明書のエラーでしょうか? php.iniの設定でcurl.cainfoを設定していませんが、コマンドで取得できていますので関係ないかと考えていました。 よろしくお願いします。
moonphase

2018/11/17 01:27

コマンドとLaravelで参照している証明書ストアが異なると想定しています。 私の環境ではそのPHPコードをそのまま実行したら `200` が返ってきました。
yamayamak

2018/11/17 01:37

ありがとうございます。確かに、同じサーバ環境でPHPスクリプトにして実行したら200が返ってきてます。 LaravelのSSL設定を確認していますが違いになりそうなところがわからないです。継続して調査しますが何かわかればご教授をお願いします。
yamayamak

2018/11/17 03:08 編集

大変ありがとうございます。 ただ、すみませんが、あまり環境を変更したくないため、Composerで追加したくなので、 //curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($curl, CURLOPT_SSLCERT, '/var/www/html/laravel/ssl/ssl.pem'); curl_setopt($curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_DEFAULT); の部分を追記修正して試してみましたがNGでした。 pemファイルは読み込みエラーが出なくなったので読み込めてると思いますが、 curl_errorは何もなく、curl_getinfo($ch, CURLINFO_HTTP_CODE)は0(ゼロ)で全く同じ状態でした。 現状では原因がわからず、Laravel上でもコマンドで実行すれば正常に動作するので、以下のコードを追記し失敗時にコマンドで実行(exec)するようにしようと考えてます。 if ( $httpCode != 200 ) { \Log::info("CurlError doCommand" . $httpCode ); $cmd = "curl \"$url\""; exec($cmd, $arr, $res); if ($res === 0) { $httpCode = 201; } else { $httpCode = 999; } } return $httpCode; のような感じで修正するように考えています。
guest

0

自己解決

原因がわからないので失敗した場合はコマンドを実行するように、
以下のコードを追加しました。

php

1if ( $httpCode != 200 ) { 2 \Log::info("CurlError doCommand" . $httpCode ); 3 $cmd = "curl \"$url\""; 4 exec($cmd, $arr, $res); 5 if ($res === 0) { 6 $httpCode = 201; 7 } else { 8 $httpCode = 999; 9 } 10} 11return $httpCode;

投稿2018/11/18 08:27

yamayamak

総合スコア131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamayamak

2018/12/12 13:34

LaravelからのCurlプログラムを実行した場合のみエラーが発生していました。 最終的には、sudo yum updateでAWSを最新化したら回復しました。 (反映にはsudo service httpd restartで再起動が必要)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問