AppServ 2.5.10
(Apache 2.2.8
、php 5.2.6
、mysql 5.0.51b
およびphpMyAdmin 2.10.3
を含む)を実行している(localhost)Windows 8マシンからAmazonのS3ファイルを接続しようとしています。 Amazon SDK
for php。
Amazon SDK's
名前空間機能と互換性を持たせるため、zipファイルをダウンロードして解凍することにより、phpをバージョン5.3.28
に置き換えました。
私のphpコードはS3
のAmazon EC2
ファイルにアクセスするには正常に機能しますが、Windowsローカルホストでは失敗しました。
ただし、WindowsローカルホストマシンでAmazon S3
バケットファイルを読み取るためにphp srciptを実行すると、次のようにSSLエラーが発生しました。
致命的なエラー:キャッチされない例外 'Guzzle\Http\Exception\CurlException'メッセージ '[curl] 60:SSL証明書の問題:ローカル発行者証明書[url]を取得できません https://images-st.s3.amazonaws .com/us/123977_sale_red_car.png 'C:\ AppServ\www\ecity\vendor\guzzle\guzzle\src\Guzzle\Http\Curl\CurlMulti.php:342スタックトレース:
#0 C:\ AppServ\www\ecity\vendor\guzzle\guzzle\src\Guzzle\Http\Curl\CurlMulti.php(283):Guzzle\Http\Curl\CurlMulti-> isCurlException(Object(Guzzle\Http\Message\Request)、Object(Guzzle\Http\Curl\CurlHandle)、Array)
#1 C:\ AppServ\www\ecity\vendor\guzzle\guzzle\src\Guzzle\Http\Curl\CurlMulti.php(248):Guzzle\Http\Curl\CurlMulti-> processResponse(Object(Guzzle\Http\Message\Request)、Object(Guzzle\Http\Curl\CurlHandle)、Array)
#2 C:\ AppServ\www\ecity\vendor\guzzle\guzzle\src\Guzzle\Http\Curl\CurlMulti.php(231):Guzzle\Http\Curl\CurlMulti-> processMessages()
#3 C:\ AppServ\www\ecity\vendor\guzzle\guzzle\src\Guzzle\Http\Curl\CurlMulti.php(215):Guzzle\Http\Curl\CurlMulti-> executeHandles()
#4 C:\ AppServ\www\ecity\ven in C:\ AppServ\www\ecity\vendor\aws\aws-sdk-php\src\Aws\Common\Client\AbstractClient.php on line 288
http://curl.haxx.se/ca/cacert.pem から証明書をダウンロードし、php.iniで次のように定義します。
curl.cainfo = "C:\AppServ\cacert.pem"
しかし、私はまだ同じエラーを受け取りました。 phpはcurl.cainfo
で定義されているphp.ini
を尊重していないようです。
私のphpバージョンは5.3.28
に従ってlocalhost/phpinfo.php
です。
cainfo
パラメーターがC:\AppServ\cacert.pem
として正しいことも確認しました
echo ini_get( "curl.cainfo" ) ;
phpスクリプト内。
5.3
より上位のPHPバージョンは、curl.cainfo
でphp.ini
をサポートします。
Windowsのコマンドラインでcurlの動作を確認し、正常に動作しているようです。
C:\Users\Jordan>curl https://s3-us-west-2.amazonaws.com/images-st/aaa.txt
curl: (60) SSL certificate problem: unable to get local issuer certificate
......
C:\Users\Jordan>curl --cacert C:\AppServ\cacert.crt https://s3-us-west-2.amazonaws.com/images-st/aaa.txt
This is aaa.txt file.
Stored in Amazon S3 bucket.
Php 5.3.28
Zipファイルと一致しないWindowsでApacheを使用したためです http://windows.php.net/download/ VC9 x86 Thread Safe(2014- Jun-11 01:09:56)Zipバージョン。
Apacheのhttpd-ssl.confファイルには、Windows 8のローカルホストから使用する場合でも、次の設定があります。
<VirtualHost _default_:443>
DocumentRoot "C:/AppServ/www"
ServerName localhost:443
ServerAdmin [email protected]
ErrorLog "C:/AppServ/Apache2.2/logs/error.log"
TransferLog "C:/AppServ/Apache2.2/logs/access.log"
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "C:/AppServ/Apache2.2/conf/mydomain.cert"
SSLCertificateKeyFile "C:/AppServ/Apache2.2/conf/mydomain.key"
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "C:/Apache2.2/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "C:/AppServ/Apache2.2/logs/ssl_request.log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
今、私はこれらのRDS
を生成せずにAmazon S3
バケットファイルとcurl
データベースに接続し、Windows 8ローカルホストからローカル発行者証明書の問題を取得できない問題とは何かを疑問に思っています。
何かアドバイス?
コメントの Jeremy Lindblom で述べたように、AWS SDK v2の解決策はssl.certificate_authority
SDKのインスタンス化時のオプション:
$aws = Aws\Common\Aws::factory(array(
'region' => 'us-west-2',
'ssl.certificate_authority' => '/path/to/updated/cacert.pem'
));
これはAWS SDK v3で変更されたことを追加します。新しいメソッドは次のとおりです。
$client = new DynamoDbClient([
'region' => 'us-west-2',
'version' => 'latest',
'http' => [
'verify' => '/path/to/my/cert.pem'
]
]);
http://docs.aws.Amazon.com/aws-sdk-php/v3/guide/guide/configuration.html#verify
WampServerを使用している場合は、php.ini
ファイルを開き、下にスクロールして次を追加します。
curl.cainfo = "C:\wamp\bin\php\php7.2.3\cacert.pem"
使用している現在のphpバージョンのフォルダーにcacert.pem
ファイルがあることを確認してください。私の場合、php7.2.3
フォルダーにあります。
Httpを使用したい場合は同じエラーが発生していましたが、以下のソリューションを使用できます:
Error executing "PutObject" on "https://s3-ap-southeast-2.amazonaws.com/mybucketname/TestBanner1_e1d8d74e41"; AWS HTTP error: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
私はhttpメソッドを使用して解決しましたが、これは安全な方法を使用するのは安全ではありませんphp.iniファイルに_ curl.cainfo = "/path/to/file.cacert.pem"_を入力してください:
ソリューション:
'options' => [
'scheme' => 'http',
],
完全なサンプルコード:
// ...
's3bucket' => [
'class' => \frostealth\yii2\aws\s3\Storage::className(),
'region' => 'ap-southeast-2',
'credentials' => [ // Aws\Credentials\CredentialsInterface|array|callable
'key' => 'JGUTEHCDE.............OSHS',
'secret' => 'SJEUC-----------jzy1-----rrT',
],
'bucket' => 'yours3bucket',
//'cdnHostname' => 'http://example.cloudfront.net',
'defaultAcl' => \frostealth\yii2\aws\s3\Storage::ACL_PUBLIC_READ,
'debug' => false, // bool|array
'options' => [
'scheme' => 'http',
],
],
// ...
この問題の非常に簡単な解決策があります。証明書ファイルなしでこれを行うことができます。
進むLaravel Root Folder-> Vender-> guzzlehttp-> guzzle-> src
open Client.php
find $ defaults Array。このように見える..
$defaults = [
'allow_redirects' => RedirectMiddleware::$defaultSettings,
'http_errors' => true,
'decode_content' => true,
'verify' => true,
'cookies' => false
];
今、主な仕事はverify key ..の値を変更することです.
'verify' => false,
したがって、この後、CURLリクエストのSSL証明書はチェックされません...このソリューションは私のために働いています。私は多くの研究の後にこの解決策を見つけます...