php - AWS SSL 安全错误 : [curl] 60: SSL certificate prob. ..:无法获取本地颁发者证书

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

我正在尝试从运行 AppServ 2.5.10(包括 Apache 2.2.8php 5.2.6mysql 5.0.51bphpMyAdmin 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'
));

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

关于php - AWS SSL 安全错误 : [curl] 60: SSL certificate prob. ..:无法获取本地颁发者证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24620393/

相关文章:

ios - Xamarin IOS - HttpClient - 在一台 iPad 而不是另一台 iPad 上工作的 API

ssl - Curl 一直说 "SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure"但它应该是 TLS

php - Laravel 队列和跨类的持久变量

php - 链接尚未链接的电子邮件地址

php - 如何使用php中的api将数据粘贴到pastebin?

php - 什么会导致 curl 在尝试访问本地文件时返回 false?

php - 并行发出 7 个 soap api 请求的最快或最可靠的方法

php - enctype ="multipart/form-data"和 enctype ="multipart/form-data;charset=utf-8"有什么区别

java - Spring Boot POST 请求特定负载不被接受

c# - 在 Microsoft.Web.Administration.Application 对象上配置 SSL?