php SSL3_GET_SERVER_CERTIFICATE:证书验证失败

时间:2016-04-07 13:03:14

标签: php macos curl openssl

我在MacOSx El Capitan中运行PHP版本5.6作为XAMPP的一部分,并且在少数https站点上出错。例如:https://www.google.com/

file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

但这些网站上没有返回SSL错误:

  1. GitHub
  2. Composer
  3. PayPal TLS Test
  4. 请先查看我目前为止所尝试过的清单,但没有任何效果。

    首先尝试使用Google:

    1. SSL error SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
    2. PHP - SSL certificate error: unable to get local issuer certificate
    3. HTTPS and SSL3_GET_SERVER_CERTIFICATE:certificate verify failed, CA is OK
    4. 手册

      1。更新了cert.pem文件

      php -r 'print_r(openssl_get_cert_locations());'

      结果是。

      Array
      (
          [default_cert_file] => /Applications/XAMPP/xamppfiles/share/openssl/cert.pem
          [default_cert_file_env] => SSL_CERT_FILE
          [default_cert_dir] => /Applications/XAMPP/xamppfiles/share/openssl/certs
          [default_cert_dir_env] => SSL_CERT_DIR
          [default_private_dir] => /Applications/XAMPP/xamppfiles/share/openssl/private
          [default_default_cert_area] => /Applications/XAMPP/xamppfiles/share/openssl
          [ini_cafile] => /Applications/XAMPP/xamppfiles/share/openssl/cert.pem
          [ini_capath] =>
      )
      

      /Applications/XAMPP/xamppfiles/share/openssl/cert.pem

      中保存this file cacert.pem

      使用以下

      更新了php.ini
      openssl.cafile = /Applications/XAMPP/xamppfiles/share/openssl/cert.pem
      curl.cainfo    = /Applications/XAMPP/xamppfiles/share/openssl/cert.pem
      

      重启Apache但没有成功。试图读取pem文件(没有返回错误)

      echo file_get_contents("/Applications/XAMPP/xamppfiles/share/openssl/cert.pem");
      

      测试用例

      它适用于github.com getcomposer.org paypal.com,但不适用于google.com(google.com也能在我的Windows系统上运行)

      php -r '$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://tlstest.paypal.com/"); var_dump(curl_exec($ch)); var_dump(curl_error($ch));'
      

      结果:PayPal_Connection_OKbool(true)

      但在google.com

      php -r '$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://www.google.com/"); var_dump(curl_exec($ch)); var_dump(curl_error($ch));'
      

      结果:string(63) "SSL certificate problem: unable to get local issuer certificate"

      P.S:禁止同行验证是不可接受的。

1 个答案:

答案 0 :(得分:0)

在我的情况下,确保存在正确的cert.pem文件是不够的。您还需要使用date.timezone键将php.ini中的时区设置为您的实际时区(在我的情况下,我将其设置为America / Los Angeles)。否则,PHP将默认使用UTC,您的系统时钟将显示为关闭。这解决了我在Mac OS X El Capitan(10.11.2)上的问题。