web-dev-qa-db-fra.com

Erreur de sécurité SSL AWS: [curl] 60: problème de certificat SSL ...: impossible d'obtenir le certificat d'émetteur local

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?

25
user2818066

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'
));

http://docs.aws.Amazon.com/aws-sdk-php/guide/latest/faq.html#what-do-i-do-about-a-curl-ssl-certificate-error


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

33
Benjamin

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.

9
BlackPearl

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',
],

],
// ...
6
Ramesh Chand

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 ...

0
pankaj