Php AWS SSL安全错误:[curl]60:SSL证书问题…:无法获取本地颁发者证书

Php AWS SSL安全错误:[curl]60:SSL证书问题…:无法获取本地颁发者证书,php,curl,ssl,amazon-web-services,amazon-s3,Php,Curl,Ssl,Amazon Web Services,Amazon S3,我正在尝试使用php的Amazon SDK从运行AppServ 2.5.10(包括Apache2.2.8、PHP5.2.6、mysql 5.0.51b和phpMyAdmin 2.10.3)的(本地主机)Windows 8计算机连接Amazon的S3文件 为了与amazonsdk的名称空间功能兼容,我将php替换为5.3.28版,方法是下载压缩文件并解压缩 我的php代码可以很好地访问AmazonEC2中的S3文件,但在我的Windows本地主机中失败了 但是,当我在Windows本地主机上运行p

我正在尝试使用php的Amazon SDK从运行AppServ 2.5.10(包括Apache2.2.8、
PHP5.2.6
mysql 5.0.51b
phpMyAdmin 2.10.3
)的(本地主机)Windows 8计算机连接Amazon的S3文件

为了与
amazonsdk的
名称空间功能兼容,我将php替换为
5.3.28版
,方法是下载压缩文件并解压缩

我的php代码可以很好地访问
AmazonEC2
中的
S3
文件,但在我的Windows本地主机中失败了

但是,当我在Windows本地主机上运行php srcipt来读取
Amazon S3
bucket文件时,我得到了如下SSL错误:

curl.cainfo = "C:\AppServ\cacert.pem"
致命错误:未捕获异常“Guzzle\Http\exception\CurlException” 消息“[curl]60:SSL证书问题:无法获取本地证书 颁发者证书[url] “在 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->iscurleException(对象(Guzzle\Http\Message\Request), 对象(Guzzle\Http\Curl\CurlHandle),数组)

#一, 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),数组)

#二, C:\AppServ\www\ecity\vendor\guzzle\guzzle\src\guzzle\Http\Curl\CurlMulti.php(231): Guzzle\Http\Curl\CurlMulti->processMessages()

#三, C:\AppServ\www\ecity\vendor\guzzle\guzzle\src\guzzle\Http\Curl\CurlMulti.php(215): Guzzle\Http\Curl\CurlMulti->executeHandles()

#四, C:\AppServ\www\ecity\venin C:\AppServ\www\ecity\vendor\aws\aws sdk php\src\aws\Common\Client\AbstractClient.php 在线288

我从下载证书,并在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与我从VC9 x86线程安全(2014-Jun-11 01:09:56)zip版本下载的php
5.3.28
zip文件不匹配

在我的apache的httpd-ssl.conf文件中,我甚至在Windows8的本地主机上使用了以下设置

<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>                                  

DocumentRoot“C:/AppServ/www”
ServerName本地主机:443
服务器管理员webmaster@localhost.com
ErrorLog“C:/AppServ/Apache2.2/logs/error.log”
TransferLog“C:/AppServ/Apache2.2/logs/access.log”
斯伦金安
SSLCipherSuite全部:!ADH:!出口56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile“C:/AppServ/Apache2.2/conf/mydomain.cert”
SSLCertificateKeyFile“C:/AppServ/Apache2.2/conf/mydomain.key”
发展+标准
发展+标准
浏览器匹配“*MSIE.*”\
nokeepalive ssl不干净关闭\
降级-1.0力响应-1.0
CustomLog“C:/AppServ/Apache2.2/logs/ssl_request.log”\
%t%h%{SSL\u协议}x%{SSL\u密码}x\%r\%b
现在我想知道是什么问题,以及如何连接到
amazons3
bucket文件和
RDS
数据库而不产生这些
curl
无法从我的windows8本地主机获取本地颁发者证书问题

有什么建议吗?

如评论中所述,AWS SDK v2的解决方案是在实例化SDK时设置
ssl.certificate\u authority
选项:

$aws=aws\Common\aws::factory(数组)(
“地区”=>“美国西部2号”,
“ssl.certificate\u authority'=>”/path/to/updated/cacert.pem”
));


我要补充的是,这在AWS SDK v3中已更改,以下是新方法:

$client=新的DynamoDbClient([
“地区”=>“美国西部2号”,
'版本'=>'最新',
“http'=>[
'验证'=>'/path/to/my/cert.pem'
]
]);

我遇到了相同的错误,如果您想使用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”uu是不安全的:

解决方案

'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',
],

],
// ...

对于使用WampServer的用户,请打开
php.ini
文件,然后向下滚动至底部并添加以下内容:

curl.cainfo=“C:\wamp\bin\php\php7.2.3\cacert.pem”


确保当前使用的php版本的文件夹中有
cacert.pem
文件。在我的例子中,我把它放在
php7.2.3
文件夹中。

我有这个问题的非常简单的解决方案。您可以在没有任何证书文件的情况下执行此操作

继续Laravel根文件夹->Vender->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证书。。。 这个解决方案对我来说是可行的。经过多次研究,我找到了这个解决方案

$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中

您在实例化SDK时尝试过吗?谢谢!杰里米。你的AWS专家确实立即发现了这个问题。对我来说,它的作用是@user2818066 m