LoginSignup
0

More than 3 years have passed since last update.

phpのcURL、SplFileObjectでsslエラーが出たときに試したいこと

Posted at

あぁ、休日の一覧データが欲しい。
欲しい、
欲しい、

別のサーバ(内閣府)からcsvで取得してみる。
せっかくなのでcurlとSplFileObjectの2方法で試す。

$url = 'https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv';

# curl
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);

# SplFileObject
$file = new NoRewindIterator(new SplFileObject($url));

curlは$dataに設定されない。(errnoは35)
SplFileObjectはエラーが発生。

PHP Fatal error:  Uncaught RuntimeException: SplFileObject::__construct(): SSL operation failed with code 1. OpenSSL Error messages:
error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small

curl_errno([35] => 'CURLE_SSL_CONNECT_ERROR')
調べて見つけたページ
ふーん。。。

接続先の鍵が短いのか?(たぶんopensslのバージョンが古いかなにか。)
なら短い鍵でも大丈夫なようにすれば良さそう。
オプションを調べる。

curl_setoptにCURLOPT_SSL_CIPHER_LISTを発見。
stream_context_createsslオプションにciphersを発見。

sslオプションを設定してみる。

$url = 'https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv';

# curl
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');
$data = curl_exec($ch);
curl_close($ch);

#SplFileObject
$ctx = stream_context_create([
  'ssl' => array(
    'ciphers' => 'TLSv1'
  )
]);
$file = new NoRewindIterator(new SplFileObject($url, 'r', false, $ctx));

できた!

内閣府のsslキーって短いんだ。。。大丈夫なのか?
終わり:v:

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0