J'essaie de connecter les fichiers S3 d'Amazon à partir de ma machine (localhost) Windows 8 exécutant AppServ 2.5.10
(qui comprend Apache 2.2.8
, php 5.2.6
, mysql 5.0.51b
et phpMyAdmin 2.10.3
) en utilisant Amazon SDK
pour php.
Afin d'être compatible avec Amazon SDK's
fonctionnalité d'espace de noms, j'ai remplacé php par la version 5.3.28
en téléchargeant son fichier compressé et en le décompressant.
Mon code php fonctionne bien pour accéder à S3
fichier dans Amazon EC2
mais il a échoué dans mon hôte local Windows.
Cependant, lorsque je lance le php srcipt pour lire Amazon S3
fichier bucket sur la machine hôte locale Windows, j'ai une erreur SSL comme suit:
Erreur fatale: exception non interceptée "Guzzle\Http\Exception\CurlException" avec le message "[curl] 60: problème de certificat SSL: impossible d'obtenir le certificat d'émetteur local [url] https: //images-st.s3.amazonaws .com/us/123977_sale_red_car.png 'dans C:\AppServ\www\ecity\vendor\guzzle\guzzle\src\Guzzle\Http\Curl\CurlMulti.php: 342 Trace de pile:
# 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 dans C:\AppServ\www\ecity\vendor\aws\aws-sdk-php\src\Aws\Common\Client\AbstractClient.php sur la ligne 288
Je télécharge le certificat depuis http://curl.haxx.se/ca/cacert.pem et le définit dans php.ini comme suit:
curl.cainfo = "C:\AppServ\cacert.pem"
mais j'ai toujours la même erreur. Il semble que php n'honore pas le curl.cainfo
défini dans php.ini
.
Ma version php est 5.3.28
selon localhost/phpinfo.php
.
J'ai également vérifié que le paramètre cainfo
est correct en tant que C:\AppServ\cacert.pem
en utilisant
echo ini_get( "curl.cainfo" ) ;
dans le script php.
Version Php supérieure à 5.3
doit prendre en charge curl.cainfo
dans php.ini
.
Dans la ligne de commande de Windows, je vérifie le comportement des boucles et cela semble fonctionner correctement.
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.
Est-ce parce que j'ai utilisé Apache dans Windows qui ne correspond pas à php 5.3.28
Fichier Zip que j'ai téléchargé à partir de http://windows.php.net/download/ VC9 x86 Thread Safe (2014-Jun-11 01:09:56) Version Zip.
Dans le fichier httpd-ssl.conf de mon Apache, j'ai le paramètre suivant même si j'utilise à partir d'un hôte local dans 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>
Maintenant, je me demande quel est le problème et comment se connecter à Amazon S3
les fichiers de compartiment et la base de données RDS
sans produire ces curl
ne peuvent pas obtenir de problèmes de certificat d'émetteur local de mon hôte local Windows 8.
Aucun conseil?
Comme mentionné par Jeremy Lindblom dans les commentaires, la solution pour AWS SDK v2 consiste à définir le ssl.certificate_authority
option lors de l'instanciation du SDK:
$aws = Aws\Common\Aws::factory(array(
'region' => 'us-west-2',
'ssl.certificate_authority' => '/path/to/updated/cacert.pem'
));
J'ajouterai que cela a été changé dans le AWS SDK v3 , voici la nouvelle méthode:
$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
Pour ceux qui utilisent WampServer, ouvrez le php.ini
fichier puis faites défiler vers le bas et ajoutez ce qui suit:
curl.cainfo = "C:\wamp\bin\php\php7.2.3\cacert.pem"
Assurez-vous d'avoir le cacert.pem
fichier dans le dossier de la version php actuelle que vous utilisez. Dans mon cas, je l'ai dans le php7.2.3
dossier.
J'obtenais la même erreur Si vous souhaitez utiliser http, vous pouvez utiliser la solution ci-dessous:
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)
Je l'ai résolu en utilisant la méthode http ce n'est pas sûr d'utiliser une manière sécurisée entrez _ curl.cainfo = "/path/to/file.cacert.pem"_ dans le fichier php.ini:
Solution:
'options' => [
'scheme' => 'http',
],
Exemple de code complet:
// ...
'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',
],
],
// ...
J'ai une solution très simple de ce problème. Vous pouvez le faire sans aucun fichier de certificat.
Allez Dossier racine Laravel -> Vender -> guzzlehttp -> guzzle -> src
open Client.php
find $ defaults Array. qui ressemblent à ça ..
$defaults = [
'allow_redirects' => RedirectMiddleware::$defaultSettings,
'http_errors' => true,
'decode_content' => true,
'verify' => true,
'cookies' => false
];
Maintenant, le travail principal consiste à modifier la valeur de vérifier la touche ..
'verify' => false,
Donc, après cela, il ne vérifiera pas le certificat SSL pour la demande CURL ... Cette solution fonctionne pour moi. Je trouve cette solution après de nombreuses recherches ...