我正在尝试从运行 AppServ 2.5.10
(包括 Apache 2.2.8
、php 5.2.6
、mysql 5.0.51b
和 phpMyAdmin 2.10.3
) 使用 Amazon SDK
for php。
为了与 Amazon SDK 的
命名空间功能兼容,我将 php 替换为版本 5.3.28
,方法是下载其压缩文件并解压缩。
我的 php 代码可以正常访问 Amazon EC2
中的 S3
文件,但在我的 Windows 本地主机中却失败了。
但是,当我运行 php srcipt 以读取 Windows 本地主机中的 Amazon S3
存储桶文件时,我收到如下 SSL 错误:
Fatal error: Uncaught exception 'Guzzle\Http\Exception\CurlException' with message '[curl] 60: SSL certificate problem: unable to get local issuer certificate [url] https://images-st.s3.amazonaws.com/us/123977_sale_red_car.png' in C:\AppServ\www\ecity\vendor\guzzle\guzzle\src\Guzzle\Http\Curl\CurlMulti.php:342 Stack trace:
#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\ven in C:\AppServ\www\ecity\vendor\aws\aws-sdk-php\src\Aws\Common\Client\AbstractClient.php on line 288
我从 http://curl.haxx.se/ca/cacert.pem 下载证书并在 php.ini 中定义如下:
curl.cainfo = "C:\AppServ\cacert.pem"
但我仍然遇到同样的错误。 php 似乎不支持 php.ini
中定义的 curl.cainfo
。
根据 localhost/phpinfo.php
,我的 php 版本是 5.3.28
。
我还使用
检查了cainfo
参数是否正确,如 C:\AppServ\cacert.pem
echo ini_get( "curl.cainfo" ) ;
在 php 脚本中。
5.3
以上的PHP版本应支持php.ini
中的curl.cainfo
。
在 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 与我从 http://windows.php.net/download/ 下载的 php 5.3.28
zip 文件不匹配吗? VC9 x86 线程安全 (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>
现在我想知道问题是什么以及如何在不产生这些 curl
的情况下连接到 Amazon S3
存储桶文件和 RDS
数据库无法获取来 self 的 Windows 8 本地主机的本地颁发者证书问题。
有什么建议吗?
最佳答案
如 Jeremy Lindblom 所述在评论中,AWS SDK v2的解决方案是在实例化SDK时设置ssl.certificate_authority
选项:
$aws = Aws\Common\Aws::factory(array(
'region' => 'us-west-2',
'ssl.certificate_authority' => '/path/to/updated/cacert.pem'
));
我要补充一点,这在 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
关于php - AWS SSL 安全错误 : [curl] 60: SSL certificate prob. ..:无法获取本地颁发者证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24620393/