2014-07-07 239 views
22

我試圖從我的(本地主機)Windows 8機器運行AppServ 2.5.10 連接亞馬遜的S3文件,其中包括Apache 2.2.8,php 5.2.6,mysql 5.0.51b和phpMyAdmin 2.10.3)使用Amazon SDK for php。 爲了與亞馬遜SDK的名稱空間功能兼容,我使用版本5.3.28替換了php,使用 下載了壓縮文件並將其解壓縮。AWS SSL安全錯誤:[捲曲] 60:SSL證書概率...:無法獲取本地發行者證書

我的php代碼正常工作以訪問Amazon EC2中的S3文件,但在我的Windows本地主機中失敗。 然而,當我運行PHP srcipt閱讀在Windows本地主機亞馬遜S3存儲文件,我得到了SSL錯誤如下:

致命錯誤:未捕獲的異常「狂飲\ HTTP \異常\ CurlException」有消息「[捲曲] 60:SSL證書問題:在C:\ AppServ \ www \ ecity \ vendor \ guzzle \ guzzle \ src \ Guzzle \ Http \ Curl \ CurlMulti.php中無法獲得本地頒發者證書[url] https://images-st.s3.amazonaws.com/us/123977_sale_red_car.png'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 (231):Guzzle \ Http \ Curl \ CurlMulti-> processMessages()#3 C:\ AppServ \ www \ ecity \ Curve \ CurlMulti.php在C:\ AppServ中的供應商\ guzzle \ guzzle \ src \ Guzzle \ Http \ Curl \ CurlMulti.php(215):Guzzle \ Http \ Curl \ CurlMulti-> executeHandles()#4 C:\ AppServ \ www \ ecity \ ven \ WWW \ ecity \供應商\ AWS \ AWS-SDK-PHP的\ src \ AWS \ COMMON \客戶端\ AbstractClient.php上線288

我從http://curl.haxx.se/ca/cacert.pem下載certifate並把它定義在php.ini如下: curl.cainfo =「C:\ AppServ \ cacert.pem」 但我仍然有同樣的錯誤。看起來php不尊重php.ini中定義的curl.cainfo。

我的php版本是5.3.28 accourding到localhost/phpinfo.php。我還使用 echo ini_get(「curl.cainfo」)檢查了cainfo參數 以正確爲C:\ AppServ \ cacert.pem; 在PHP腳本中。高於5.3的PHP版本應該在php.ini中支持curl.cainfo。

在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 28年3月5日的zip文件,我從http://windows.php.net/download/ VC9 86下載線程安全的(2014君11 1點09分56秒)壓縮版本。

在我的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>         

現在我想知道這是什麼問題以及如何連接到亞馬遜S3 bucket文件和RDS數據庫沒有 產生這些curl無法從我的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解決的辦法是實例化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方法,這是消除隔閡。使用安全方式不安全在php.ini文件中輸入_ curl.cainfo =「/path/to/file.cacert.pem"_:

解決方案

'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

這有效,但只是提及它通過'verify = false'來禁用SSL。 –

+0

是如果你想使用http,那麼你只能用於測試。 –

相關問題