我正在尝试从运行AppServ 2.5.10
的{local} Windows 8计算机连接Amazon的S3文件(包括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来读取Windows本地主机中的Amazon S3
存储桶文件时,我收到如下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 \厂商\狂饮\狂饮\ SRC \狂饮\ HTTP \卷曲\ CurlMulti.php:342 堆栈跟踪:
#0 C:\的appserv \ WWW \ ecity \厂商\狂饮\狂饮\ SRC \狂饮\ HTTP \卷曲\ CurlMulti.php(283): 狂饮\ HTTP \卷曲\ CurlMulti-> isCurlException(对象(狂饮\ HTTP \消息\请求), 对象(Guzzle \ Http \ Curl \ CurlHandle),数组)
#1 C:\的appserv \ WWW \ ecity \厂商\狂饮\狂饮\ SRC \狂饮\ HTTP \卷曲\ CurlMulti.php(248): 狂饮\ HTTP \卷曲\ CurlMulti-> processResponse(对象(狂饮\ HTTP \消息\请求), 对象(Guzzle \ Http \ Curl \ CurlHandle),数组)
#2 C:\的appserv \ WWW \ ecity \厂商\狂饮\狂饮\ SRC \狂饮\ HTTP \卷曲\ CurlMulti.php(231): Guzzle \ Http \ Curl \ CurlMulti-> processMessages()
#3 C:\的appserv \ WWW \ ecity \厂商\狂饮\狂饮\ SRC \狂饮\ HTTP \卷曲\ CurlMulti.php(215): Guzzle \ Http \ Curl \ CurlMulti-> executeHandles()
#4 C:\ AppServ \ www \ ecity \ ven in C:\的appserv \ WWW \ ecity \供应商\ AWS \ AWS-SDK-PHP的\ src \ AWS \ COMMON \客户端\ AbstractClient.php 在第288行
我从http://curl.haxx.se/ca/cacert.pem下载证书,并在php.ini中定义如下:
curl.cainfo = "C:\AppServ\cacert.pem"
但我仍然遇到同样的错误。看来php并不尊重curl.cainfo
中定义的php.ini
。
根据5.3.28
,我的php版本为localhost/phpinfo.php
。
我还使用
将cainfo
参数检查为C:\AppServ\cacert.pem
echo ini_get( "curl.cainfo" ) ;
在php脚本中。
高于5.3
的Php版本应支持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.
是不是因为我在Windows中使用了Apache,它与我从http://windows.php.net/download/ VC9 x86线程安全(2014年6月11日01:09:56)下载的php 5.3.28
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本地主机获取本地颁发者证书问题。
有什么建议吗?
答案 0 :(得分:32)
正如评论中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
答案 1 :(得分:6)
我遇到了同样的错误如果您想使用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',
],
],
// ...
答案 2 :(得分:6)
对于使用WampServer的用户,请打开@IBOutlet var gestureGroup: WKInterfaceGroup!
@IBAction func gestureDblTap(_ gesture: WKTapGestureRecognizer ) {
print("hello world")
}
@IBAction func gestureHoldDown(_ gesture: WKLongPressGestureRecognizer ) {
print("Holding down")
}
文件,然后向下滚动到底部并添加以下内容:
php.ini
确保您使用的当前php版本的文件夹中包含curl.cainfo = "C:\wamp\bin\php\php7.2.3\cacert.pem"
文件。就我而言,我将它放在cacert.pem
文件夹中。
答案 3 :(得分:1)
$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,则将Scheme添加到http
答案 4 :(得分:0)
我对此问题有非常简单的解决方案。您可以在没有任何证书文件的情况下执行此操作。
进入 Laravel根文件夹->供应商-> guzzlehttp-> guzzle-> src
打开 Client.php
找到 $ defaults 数组。看起来像这样..
$defaults = [
'allow_redirects' => RedirectMiddleware::$defaultSettings,
'http_errors' => true,
'decode_content' => true,
'verify' => true,
'cookies' => false
];
现在的主要任务是更改验证键的值。
'verify' => false,
因此,在此之后,它将不检查CURL请求的SSL证书... 此解决方案适合我。经过大量研究,我找到了这个解决方案...