PHPからのCurlになぜか失敗する、でもCentOS6のサポート終了でyum updateも上手く行かない場合

スポンサーリンク
Linux
スポンサーリンク
↑管理人が個人でUnity+Live2Dで作成しているスマホゲームです

PHPでスクレイピングするためにCurlを用いる処理を書いたのですが、何故か最近SSLサイトでは止まってしまうようになりました。コンソールからcurlを実行すると

curl: (35) SSL connect error

というエラーが。どうやら使っているSSLが古いようです。CentOS6はサポート終了により、レポジトリのURLが廃止されているため

Loaded plugins: fastestmirror, security
Determining fastest mirrors
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
 Eg. Invalid release/repo/arch combination/
removing mirrorlist with no valid mirrors: /var/cache/yum/x86_64/6/base/mirrorlist.txt
Error: Cannot find a valid baseurl for repo: base

のようなエラーが出てしまいます。なので、

# cd /etc/yum.repos.d
# sed -i -e "s/^mirrorlist=http:\/\/mirrorlist.centos.org/#mirrorlist=http:\/\/mirrorlist.centos.org/g" /etc/yum.repos.d/CentOS-Base.repo
# sed -i -e "s/^#baseurl=http:\/\/mirror.centos.org/baseurl=http:\/\/vault.centos.org/g" /etc/yum.repos.d/CentOS-Base.repo

というようなコマンドを入力して参照するURLを更新してください。するとyum updateできるようになります。
その上で

yum update nss
yum update openssl
yum update curl ※念の為

するとコンソールからのPHP実行ではCurlがきちんと実行できるようになります。
しかし、なぜかWebアクセスからのPHP実行ではCurlが実行されません。
phpinfo();で見てみると、Webで表示する場合と、php -r “phpinfo();” する場合とではcurl情報のSSL Version欄に表示されるNSSのバージョンが異なる事がわかりました。前者のほうが古いNSSバージョンのようです。
Webでの実行とコンソールからの実行ではPHPが使うライブラリが異なるようですが原因が分かりません。
なので、NSSをSSLに使わずOpenSSLを使うcurlを用意する事にしました。

# yum install gcc
# yum -y install openssl-devel
# yum -y install wget
# yum -y install lbzip2

# wget http://curl.haxx.se/download/curl-7.37.0.tar.bz2
# tar xf curl-7.37.0.tar.bz2
# cd curl-7.37.0
# ./configure --enable-libcurl-option
# make
# make install
# vi /etc/ld.so.conf.d/curl-x86_64.conf
※内容
/usr/local/lib
# ldconfig -v
# service httpd restart

このようにすると、Webからでもコンソールからでもphpinfoのcurl情報のSSL VersionがOpenSSL/1.0.1eとなり、Webからでも問題なくPHPがcurlでSSL接続できるようになりました!

参考:http://kayakuguri.github.io/blog/2016/07/07/curl-openssl-tls/

スポンサーリンク

それでも駄目な場合

直接curlを打ってる場合はcurlコマンドにSSLを無視するオプションを付けます。

curl --insecure

または、PHPのSimplePieなどのライブラリを使っている場合は

curl_setopt($fp,CURLOPT_SSL_VERIFYPEER,false);

のようにcurl_exec()のオプションを適切な場所に追加します(SimplePieの場合はlibrary\SimplePie\File.phpのcurl_setoptがまとめて書かれている所)

1 Star2 Stars3 Stars4 Stars5 Stars (まだ投票されていません)
読み込み中...

コメント

広告ブロッカーを無効にしてください。

タイトルとURLをコピーしました