2011年12月1日木曜日

"AWS SDK for PHP"のS3関係のメソッドで証明書関係のエラー対策

スズキです。

とりあえず、下記で紹介はしたのですが、
"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の通信をしないようにして対策できます。
"curlopts" => array(CURLOPT_SSL_VERIFYPEER => false)
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の通信にはならないけど...
--------
http://www.suz-lab.com

0 コメント: