Ошибка безопасности AWS SSL: 60: SSL-сертификат …: невозможно получить сертификат локального эмитента

Я пытаюсь подключить файлы S3 Amazon с моего (локального) компьютера Windows 8, на котором запущен AppServ 2.5.10, который включает Apache 2.2.8, php 5.2.6, mysql 5.0.51b и phpMyAdmin 2.10.3), используя Amazon SDK для php. Чтобы быть совместимым с функцией пространства имен Amazon SDK, я заменил php на версию 5.3.28, загрузив его ZIP-файл и распаковал его.

Мой PHP-код прекрасно работает для доступа к файлу S3 в Amazon EC2, но он не удался на моем локальном хосте Windows. Однако, когда я запускаю php srcipt для чтения файла Buzz Amazon S3 в локальной локальной машине Windows, я получил ошибку 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-> execut eHandles () # 4 C: \ AppServ \ www \ ecity \ ven в C: \ AppServ \ www \ ecity \ vendor \ aws \ aws-sdk-php \ src \ Aws \ Common \ Client \ AbstractClient.php в строке 288

Я загружаю certifate из http://curl.haxx.se/ca/cacert.pem и определяю его в php.ini следующим образом: curl.cainfo = "C: \ AppServ \ cacert.pem", но я все равно получаю то же самое ошибка. Кажется, php не соблюдает curl.cainfo, определенные в php.ini.

Моя версия php – 5.3.28 accourding to localhost / phpinfo.php. Я также проверил параметр cainfo как правильный как C: \ AppServ \ cacert.pem, используя echo ini_get ("curl.cainfo"); в скрипте php. Версия Php выше 5.3 должна поддерживать curl.cainfo в php.ini.

В командной строке Windows я проверяю поведение завитки и, похоже, работает нормально.

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. 

Это потому, что я использовал Apache в Windows, который не соответствует php 5.3.28 zip-файла, который я загрузил из http://windows.php.net/download/ VC9 x86 Thread Safe (2014-Jun-11 01:09:56) ) zip версия.

В моем файле httpd-ssl.conf apache у меня есть следующая настройка, даже используемая с локального хоста в Windows 8.

 <VirtualHost _default_:443> DocumentRoot "C:/AppServ/www" ServerName localhost:443 ServerAdmin webmaster@localhost.com 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> 

Теперь мне интересно, в чем проблема и как подключиться к файлам Buzz Amazon S3 и базе данных RDS без создания этих завитушек, не удается получить проблемы с сертификатами локального эмитента с моего локального хоста Windows 8. Любой совет?

Как упоминалось в комментариях Джереми Линдблом , решение для AWS SDK v2 – установить параметр ssl.certificate_authority при ssl.certificate_authority экземпляра 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


Добавлю, что это было изменено в 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

Я получал ту же ошибку. Если вы хотите использовать 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, который не является безопасным для использования безопасного пути. Введите _ curl.cainfo = "/path/to/file.cacert.pem"_ в файле php.ini:

Решение :

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