I am trying to connect Amazon’s S3 files from my (localhost) Windows 8 machine running AppServ 2.5.10
(which includes 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\供应商\guzzle\guzzle\src\Guzzle\Http\Curl\CurlMulti.php(283): Guzzle\Http\Curl\CurlMulti->isCurlException(对象(Guzzle\Http\Message \Request), 对象(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), 对象(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 脚本中。
高于 5.3
的 Php 版本应支持 curl.cainfo
在 php.ini
中。
在 Windows 的命令行中,我检查了 curl 行为,它似乎工作正常。
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.
是因为我在 Windows 中使用的 Apache 不匹配 php 5.3.28
zip 文件我从 http://windows.php.net/download/ VC9 x86 Thread Safe (2014-Jun-11 01: 09:56) 压缩版。
在我的 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
无法从我的本地颁发者证书获取问题8 本地主机。
有什么建议吗?
原文由 user2818066 发布,翻译遵循 CC BY-SA 4.0 许可协议
正如 Jeremy Lindblom 在评论中提到的, AWS SDK v2 的解决方案是在实例化 SDK 时设置
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
我要补充一点,这是在 AWS SDK v3 中更改的,这是新方法:
http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/configuration.html#verify