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がまとめて書かれている所)
コメント