AWS SSL安全性错误:[curl] 60:SSL证书问题...:无法获得本地颁发者证书

时间:2014-07-07 21:43:36

标签: php curl ssl amazon-web-services amazon-s3

我正在尝试从运行AppServ 2.5.10的{​​local} Windows 8计算机连接Amazon的S3文件(包括Apache 2.2.8php 5.2.6mysql 5.0.51bphpMyAdmin 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本地主机获取本地颁发者证书问题。

有什么建议吗?

5 个答案:

答案 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'
));

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 中添加更改,这是新方法:

$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证书... 此解决方案适合我。经过大量研究,我找到了这个解决方案...