SSL化したMinIOコンテナからfile_get_contentsするメモ

AWSのストレージサービス「S3」の代わりに「minio」をDockerで構築してローカルでPHP開発してたら
SSL対応した「minio」ストレージからファイルをURL経由で取得する時にSSLの関係でエラーが発生したので対応方法をメモ

実行環境

実際に開発していた環境は以下の通り

  • minioコンテナ(オレオレ証明書利用)
  • WEB開発用コンテナ(PHP8.3)

実際にやった事

  1. minioに以下のサンプルjsonファイルをアップロード
1
2
sample.json
{"key":"hoge","value":"fuga"}
  1. PHP側でminioにアップロードしたjsonを取得する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
    $config = [
        'credentials' => [
            'key' => 'minioadmin',
            'secret' => 'minioadmin',
        ],
        'region' => 'ap-northeast-1',
        'version' => 'latest',
        'endpoint' => 'https://ローカルIPアドレス:9001',
        'use_path_style_endpoint' => true,
        'scheme' => 'http'
    ];
    $s3 = new Aws\S3\S3Client( $config );

    $path = '/sample/sample.json';
    $option = [
        'Bucket' => 'sample-Buket',
        'Key' => $path
    ];

    // 有効期限付きURLで取得する
    $response = $s3->getCommand( 'GetObject',  $option);
    $request = $s3->createPresignedRequest( $response, '+5 minutes'); // 有効期限 5分すぎると無効になる
    $url = (string)$request->getUri();
    
    // ファイルを一旦UTF-8に変換する
    $data = file_get_contents($obj); // ← ここでSSLの関係で空になって返ってくる
    $data = mb_convert_encoding( $data, 'UTF-8', 'SJIS-win,UTF-8,eucJP-win' );
    $oResponse = json_decode( $data, true, 512, JSON_THROW_ON_ERROR );

対応した事

  1. file_get_contentsにSSL証明書チェック無効の設定を付与する
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
    $config = [
        'credentials' => [
            'key' => 'minioadmin',
            'secret' => 'minioadmin',
        ],
        'region' => 'ap-northeast-1',
        'version' => 'latest',
        'endpoint' => 'https://ローカルIPアドレス:9001',
        'use_path_style_endpoint' => true,
        'scheme' => 'http'
    ];
    $s3 = new Aws\S3\S3Client( $config );

    $path = '/sample/sample.json';
    $option = [
        'Bucket' => 'sample-Buket',
        'Key' => $path
    ];

    // 有効期限付きURLで取得する
    $response = $s3->getCommand( 'GetObject',  $option);
    $request = $s3->createPresignedRequest( $response, '+5 minutes'); // 有効期限 5分すぎると無効になる
    $url = (string)$request->getUri();
    
    // ローカル環境対策のSSL証明チェック無効設定
    $context = stream_context_create([
        'http' => [
            'timeout' => 30,
            'ignore_errors' => true
        ],
        'ssl' => [
            'verify_peer' => false,
            'verify_peer_name' => false
        ]
    ]);
    
    // ファイルを一旦UTF-8に変換する
    $data = file_get_contents($obj, false, $context); // ← データの取得ができる
    $data = mb_convert_encoding( $data, 'UTF-8', 'SJIS-win,UTF-8,eucJP-win' );
    $oResponse = json_decode( $data, true, 512, JSON_THROW_ON_ERROR );

まとめ

file_get_contentsにSSL証明書チェックのオプションをつければ一応ローカルminioを使ってのファイル取得が出来た。
もしかするとオレオレ証明書を使わなかったり等、別の解決策もあるかもだけど取り敢えずローカルの開発なんでこれでいこう。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。