前に、AWS SDK for PHPでS3にファイルアップロードしようとしたら証明書関係のエラーの記事で紹介はしたのですが、メソッドによっては対策方法である下記のオプションが指定できないものもあるので、このようなメソッドを利用する場合の対策方法を紹介します。

“curlopts” => array(CURLOPT_SSL_VERIFYPEER => false)

はじめに、下記のようなスクリプトを実行します。

require_once("/opt/aws/php/latest/sdk.class.php");
$s3 = new AmazonS3(
    "AAAAAAAAAAAAAAAAAAAA",
    "ssssssssssssssssssssssssssssssssssssssss"
);
$response = $s3->get_bucket_filesize("cdn.cloudpack.jp", true);
print($response);

そうすると、次のようなエラーになりました。
(cdn.cloudpack.jp.s3.amazonaws.comは*.s3.amazonaws.comの証明書でもエラー)

PHP Fatal error:  Uncaught exception 'RequestCore_Exception' with message 'cURL resource: Resource id #9; cURL error: SSL: certificate subject name '*.s3.amazonaws.com' does not match target host name 'cdn.cloudpack.jp.s3.amazonaws.com' (51)' in /opt/aws/php/1.4.7/lib/requestcore/requestcore.class.php:824
Stack trace:
#0 /opt/aws/php/1.4.7/services/s3.class.php(728): RequestCore->send_request()
#1 /opt/aws/php/1.4.7/services/s3.class.php(1397): AmazonS3->authenticate('cdn.cloudpack.j...', Array)
#2 /opt/aws/php/1.4.7/services/s3.class.php(1950): AmazonS3->list_objects('cdn.cloudpack.j...')
#3 /opt/suzuki/bin/get-bucket-filesize(9): AmazonS3->get_bucket_filesize('cdn.cloudpack.j...', true)
#4 {main}
  thrown in /opt/aws/php/1.4.7/lib/requestcore/requestcore.class.php on line 824

対策用のオプションが使えないメソッドは、SSLの通信をしないようにして対策することができます。

SSLの通信をしない方法は、次のように「$s3->use_ssl = false;」で実現可能です。

require_once("/opt/aws/php/latest/sdk.class.php");
$s3 = new AmazonS3(
    "AAAAAAAAAAAAAAAAAAAA",
    "ssssssssssssssssssssssssssssssssssssssss"
);
$s3->use_ssl = false;
$response = $s3->get_bucket_filesize("cdn.cloudpack.jp", true);
print($response);

HTTPSの通信にはなりませんが、これで対策はできます。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら