2014-07-07 3 views
22

Я пытаюсь подключить файлы 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-файл и распаковал его.Ошибка безопасности SSL AWS: [скручивание] 60: сертификат SSL ...: невозможно получить сертификат локального эмитента

Мой PHP-код прекрасно работает для доступа к файлу S3 в Amazon EC2, но он не удался на моем локальном хосте Windows. Однако, когда я бегу PHP srcipt читать Amazon S3 ведро файл в Windows, локальной хост-машине, я получил сообщение об ошибке SSL следующим образом:

Фатальная ошибка: Uncaught исключение «жрать \ Http \ Exception \ CurlException» с сообщением «[завитка ] 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: \ App Serv \ www \ ecity \ vendor \ guzzle \ guzzle \ src \ Guzzle \ Http \ Curl \ CurlMulti.php (231): Guzzle \ Http \ Curl \ CurlMulti-> processMessages() # 3 C: \ AppServ \ www \ ecity \ [215]: Guzzle \ Http \ Curl \ CurlMulti-> executeHandles() # 4 C: \ AppServ \ www \ ecity \ ven в C: \ AppServ \ WWW \ ecity \ поставщика \ AWS \ AWS-СДК-PHP \ SRC \ Aws \ Common \ Client \ AbstractClient.php на линии 288

I скачать 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. 

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

В файле HTTPD-ssl.conf моего сервера Apache, У меня есть следующие настройки даже я использую с локального хоста в ОС 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>         

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

+4

Вы пробовали [установка 'ssl.certificate_authority' вариант] (http://docs.aws.amazon.com/aws-sdk -php/guide/latest/faq.html # what-do-i-do-about-a-curl-ssl-certificate-error) при создании экземпляра SDK? –

+0

Спасибо! Джереми. Вы, эксперт AWS, сразу поняли проблему. – user2818066

+0

Нет проблем! :-) –

ответ

26

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

+8

Также вы можете установить для проверки значение false для целей тестирования. '$ клиента = новый DynamoDbClient ([ 'области' => 'мы-запад-2', 'версии' => 'последнего', 'HTTP' => [ 'проверить' => ложно ] ]); ' –

5

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

], 
// ... 
+1

Это работает, но просто упомянуть, что это то же самое, что отключить SSL через' verify = false'. –

+0

Да Если вы хотите использовать http, вы можете использовать только для тестирования. –

Смежные вопросы

 Смежные вопросы