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