Подтвердить что ты не робот

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

Я пытаюсь подключить файлы Amazon S3 с моего (локального) компьютера под управлением 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- > executeHandles() # 4 C:\AppServ\www\ecity\v ru в 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 script. Версия 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-версия.

В моем файле 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>                                  

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

4b9b3361

Ответ 1

Как упоминалось в комментариях Джереми Линдблом, решение для 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'
));

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

Ответ 2

Я получал ту же ошибку. Если вы хотите использовать 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',
],

],
// ...