2014-07-07 21 views
22

Sto provando a connettere i file S3 di Amazon dal mio (localhost) computer Windows 8 con AppServ 2.5.10 che include Apache 2.2.8, php 5.2.6, mysql 5.0.51b e phpMyAdmin 2.10.3) usando Amazon SDK per php. Per essere compatibile con la funzione namespace di Amazon SDK, ho sostituito php con la versione 5.3.28 per scaricando il file zippato e decompresso.Errore di sicurezza SSL AWS: [curl] 60: probabilita 'del certificato SSL: impossibile ottenere il certificato emittente locale

Il mio codice php funziona correttamente per accedere al file S3 in Amazon EC2 ma non è riuscito nel mio host Windows locale. Tuttavia quando ho eseguito lo srcipt php per leggere il file bucket Amazon S3 nel computer host locale di Windows, ho avuto l'errore SSL come segue:

Fatal error: eccezione Uncaught 'Guzzle \ Http \ Exception \ CurlException' con il messaggio '[ricciolo ] 60: Problema certificato SSL: impossibile ottenere il certificato emittente locale [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 Traccia stack: # 0 C: \ AppServ \ www \ ecity \ vendor \ guzzle \ guzzle \ src \ Guzzle \ Http \ Curl \ CurlMulti.php (283): Guzzle \ Http \ Curl \ CurlMulti-> isCurlException (Object (Guzzle \ Http \ Message \ Richiesta), Oggetto (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: \ App Serve \ 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

scarico il certifate da http://curl.haxx.se/ca/cacert.pem e definirlo in php.ini come segue: curl.cainfo = "C: \ AppServ \ cacert.pem" ma ho ancora lo stesso errore. Sembra che php non onori il curl.cainfo definito in php.ini.

La mia versione di php è 5.3.28 accourding a localhost/phpinfo.php. Ho anche verificato che il parametro cainfo fosse corretto come C: \ AppServ \ cacert.pem utilizzando echo ini_get ("curl.cainfo"); nello script php. La versione PHP superiore a 5.3 supporterà curl.cainfo in php.ini.

Nella riga di comando di Windows, controllo il comportamento del ricciolo e sembra funzionare correttamente.

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. 

E 'becuase becuase ho usato Apache in Windows che non corrisponde php 5.3.28 file zip scaricato dal http://windows.php.net/download/ VC9 x86 thread-safe (2014-Giu-11 01:09:56) versione zip.

Nel file di httpd-ssl.conf di mio apache, ho la seguente impostazione, anche io uso da host locale in 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>         

Ora mi chiedo qual è il problema e come collegarsi ad Amazon I file bucket S3 e il database RDS senza che producono questi arricciamenti non possono ottenere problemi con i certificati emittente locali dal mio host locale Windows 8. Qualche consiglio?

+4

Hai provato [impostando l'opzione 'ssl.certificate_authority'] (http://docs.aws.amazon.com/aws-sdk -php/guide/latest/faq.html # what-do-i-do-about-a-curl-ssl-certificate-error) quando si crea un'istanza dell'SDK? –

+0

Grazie! Jeremy. L'esperto AWS ha capito subito il problema. – user2818066

+0

Nessun problema! :-) –

risposta

26

Come citato da Jeremy Lindblom nei commenti, la soluzione per AWS SDK v2 è quello di impostare l'opzione ssl.certificate_authority quando si crea un'istanza della 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


I' Aggiungo che questo è stato modificato nel AWS SDK v3, ecco il nuovo Metodo:

$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

+8

Inoltre, è possibile impostare la verifica su falso, ai fini del test. '$ client = new DynamoDbClient ([ 'regione' => 'noi-ovest-2', 'versione' => 'ultima', 'http' => [ 'verificare' => false ] ]); ' –

5

mi è stato sempre lo stesso errore Se si desidera utilizzare http quindi è possibile utilizzare sotto soluzione:

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) 

ho risolto esso utilizzando il metodo http questo è non sicuro per usare il modo sicuro inserisci _ curl.cainfo = "/path/to/file.cacert.pem"_ nel file php.ini:

Soluzione:

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

codice di esempio 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', 
], 

], 
// ... 
+1

Questo funziona ma per fare un esempio è come disabilitare SSL con' verify = false'. –

+0

Sì Se si desidera utilizzare http, è possibile utilizzare solo per il test. –

Problemi correlati