Ошибка безопасности 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's функция пространства имен, я заменил php с версией 5.3.28 загрузив его заархивированный файл и разархивировал его.

Мой PHP-код отлично работает для доступа S3 файл в Amazon EC2 но это не удалось на моем локальном хосте Windows.

Однако, когда я запускаю php srcipt, чтобы прочитать 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 (Объект (Guzzle\Http\Message) \Request), Object(Guzzle\Http\Curl\CurlHandle), Массив)

# 1 C: \ AppServ \ www \ ecity \ vendor \ guzzle \ guzzle \ src \ Guzzle \ Http \ Curl \ CurlMulti.php (248): Guzzle \ Http \ Curl \ CurlMulti-> processResponse (Объект (Guzzle\Http\Message) \Request), Object(Guzzle\Http\Curl\CurlHandle), Массив)

# 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 в C:\AppServ\www\ecity\vendor\aws\aws-sdk-php\src\Aws\Common\Client\AbstractClient.php в строке 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.

Версия 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 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>                                  

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

Любой совет?

6 ответов

Как отметил 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'
));

http://docs.aws.amazon.com/aws-sdk-php/guide/latest/faq.html


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

Для тех, кто использует WampServer, откройте php.ini Затем перейдите к файлу и добавьте следующее:

curl.cainfo = "C:\wamp\bin\php\php7.2.3\cacert.pem"

Убедитесь, что у вас есть cacert.pem файл в папке текущей версии php, которую вы используете. В моем случае у меня это в 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, это небезопасно для использования безопасного способа введите _ 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',
],

],
// ...
$s3 = new S3Client
         ([
            'version' => 'latest',
            'scheme' =>'http',
            'region'  => $this->config->item('s3_region'),
            'credentials' => [
                'key'    => $this->config->item('s3_access_key'),
                'secret' => $this->config->item('s3_secret_key')
            ],
        ]);

добавить схему в http, если ваш протокол Http

Я столкнулся с той же проблемой, но после исследования я нашел собственное решение Laravel для ведра AWS S3.

Шаг 1: Зайдите в config/filesystems.php

Шаг 2: Добавьте 'scheme' => 'http'в массиве s3 , как показано ниже:

      's3' => [
            'driver' => 's3',
            'key' => env('AWS_ACCESS_KEY_ID'),
            'secret' => env('AWS_SECRET_ACCESS_KEY'),
            'region' => env('AWS_DEFAULT_REGION'),
            'bucket' => env('AWS_BUCKET'),
            'url' => env('AWS_URL'),
            'endpoint' => env('AWS_ENDPOINT'),
            'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false,
            'scheme'  => 'http'
        ],

Вот и все. Теперь вы можете запустить свое приложение и протестировать его.

После того, как вы переместите свое веб-приложение на рабочий сервер, и если ваше веб-приложение работает по протоколу https , вам необходимо удалить этот атрибут .

У меня очень простое решение этой проблемы. Вы можете сделать это без какого-либо файла сертификата..

Перейдите в папку Laravel Root -> Vender -> guzzlehttp -> guzzle -> src

открыть Client.php

найти $ по умолчанию Массив. это выглядит так...

$defaults = [
    'allow_redirects' => RedirectMiddleware::$defaultSettings,
    'http_errors'     => true,
    'decode_content'  => true,
    'verify'          => true,
    'cookies'         => false
];

Теперь главное задание - изменить значение ключа проверки.

'verify'          => false,

Поэтому после этого он не будет проверять сертификат SSL для запроса CURL... Это решение работает для меня. Я нахожу это решение после многих исследований...

Другие вопросы по тегам