unable ssl_cacert problem issuer error php curl ssl amazon-web-services amazon-s3

php - ssl_cacert - Error de seguridad de AWS SSL:[curl] 60: problema de certificado SSL...: no se puede obtener el certificado de emisor local



curl error 60 ssl certificate problem unable to get local issuer certificate (3)

Como menciona Jeremy Lindblom en los comentarios, la solución para AWS SDK v2 es establecer la opción ssl.certificate_authority al crear instancias del SDK:

$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

Añadiré que esto fue cambiado en AWS SDK v3 , aquí está el nuevo método:

$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

Estoy intentando conectar los archivos S3 de Amazon desde mi máquina (localhost) de Windows 8 con AppServ 2.5.10 (que incluye Apache 2.2.8 , php 5.2.6 , mysql 5.0.51b y phpMyAdmin 2.10.3 ) usando Amazon SDK para php.

Para ser compatible con Amazon SDK''s función de espacio Amazon SDK''s nombres de Amazon SDK''s , reemplacé php con la versión 5.3.28 descargando su archivo comprimido y descomprimiéndolo.

Mi código php funciona bien para acceder al archivo S3 en Amazon EC2 pero falló en mi host local de Windows.

Sin embargo, cuando ejecuto php srcipt para leer el archivo del cubo de Amazon S3 en la máquina host local de Windows, recibí un error SSL como el siguiente:

Error fatal: excepción no detectada ''Guzzle / Http / Exception / CurlException'' con el mensaje ''[curl] 60: problema del certificado SSL: no se puede obtener el certificado de emisor local [url] https://images-st.s3.amazonaws.com/us/123977_sale_red_car.png ''en C: / AppServ / www / ecity / vendor / guzzle / guzzle / src / Guzzle / Http / Curl / CurlMulti.php: 342 Seguimiento de pila:

# 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 en C: / AppServ / www / ecity / vendor / aws / aws-sdk-php / src / Aws / Common / Client / AbstractClient.php on line 288

Descargo el certificado de http://curl.haxx.se/ca/cacert.pem y lo defino en php.ini de la siguiente manera:

curl.cainfo = "C:/AppServ/cacert.pem"

pero todavía tengo el mismo error. Parece que php no curl.cainfo el curl.cainfo definido en php.ini .

Mi versión de php es 5.3.28 acuerdo con localhost/phpinfo.php .

También verifiqué que el parámetro cainfo fuera correcto como C:/AppServ/cacert.pem usando

echo ini_get( "curl.cainfo" ) ;

en el script php.

La versión Php superior a 5.3 admitirá curl.cainfo en php.ini .

En la línea de comandos de Windows, compruebo el comportamiento del curl y parece funcionar bien.

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.

¿Es porque utilicé Apache en Windows que no coincide 5.3.28 el archivo zip php 5.3.28 que descargué de http://windows.php.net/download/ VC9 x86 Thread Safe (2014-Jun-11 01:09:56) versión zip

En el archivo httpd-ssl.conf de mi apache, tengo la siguiente configuración, incluso la utilizo desde el host local en Windows 8.

<VirtualHost _default_:443> DocumentRoot "C:/AppServ/www" ServerName localhost:443 ServerAdmin [email protected] 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>

Ahora me pregunto cuál es el problema y cómo conectarme a los archivos de bucket de Amazon S3 y la base de datos RDS sin producir estos curl no puede obtener problemas de certificado de emisor local desde mi host local de Windows 8.

¿Algún consejo?


Para aquellos que usan WampServer, abra el archivo php.ini , desplácese hacia abajo hasta la parte inferior y agregue lo siguiente:

curl.cainfo = "C:/wamp/bin/php/php7.2.3/cacert.pem"

Asegúrese de tener el archivo cacert.pem en la carpeta de la versión actual de php que está utilizando. En mi caso, lo tengo en la carpeta php7.2.3 .


Recibí el mismo error. Si desea usar http, puede usar la siguiente solución:

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)

Lo resolví utilizando el método http Esto no es seguro para usar de manera segura enter _ curl.cainfo = "/path/to/file.cacert.pem"_ en el archivo php.ini:

Solución :

''options'' => [ ''scheme'' => ''http'', ],

Código de ejemplo completo:

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