Php AWS SSL安全错误:[curl]60:SSL证书问题…:无法获取本地颁发者证书
我正在尝试使用php的Amazon SDK从运行AppServ 2.5.10(包括Apache2.2.8、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
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版本下载的php5.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