He estado intentando acceder a este servicio REST en particular desde una página PHP que he creado en nuestro servidor. Reduje el problema a estas dos líneas. Entonces mi página PHP se ve así:
<?php
$response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json");
echo $response; ?>
La página muere en la línea 2 con los siguientes errores:
- Advertencia: file_get_contents (): la operación SSL falló con el código 1. OpenSSL Mensajes de error: error: 14090086: rutinas SSL: SSL3_GET_SERVER_CERTIFICATE: la verificación del certificado falló en ... php en la línea 2
- Advertencia: file_get_contents (): no se pudo habilitar el cifrado en ... php en la línea 2
- Advertencia: file_get_contents (
https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json
): no se pudo abrir la secuencia: la operación falló en ... php en la línea 2
Estamos usando un servidor Gentoo. Recientemente actualizamos a PHP versión 5.6. Fue después de la actualización cuando apareció este problema.
Encontré cuando reemplazo el servicio REST con una dirección como https://www.google.com
; mi página funciona bien
En un intento anterior, configuré “verify_peer”=>false
y pasé eso como un argumento a file_get_contents, como se describe aquí: file_get_contents ignorando execute_peer => false? Pero como señaló el escritor; No hizo ninguna diferencia.
Le pregunté a uno de nuestros administradores de servidores si existen estas líneas en nuestro archivo php.ini:
- extension = php_openssl.dll
- allow_url_fopen = Activado
Me dijo que, dado que estamos en Gentoo, openssl se compila cuando construimos; y no está configurado en el archivo php.ini.
También confirmó que allow_url_fopen
está funcionando. Debido a la naturaleza especializada de este problema; No encuentro mucha información para obtener ayuda. ¿Alguno de ustedes se ha encontrado con algo como esto? Gracias.
Respuestas:
Este fue un enlace enormemente útil para encontrar:
http://php.net/manual/en/migration56.openssl.php
Un documento oficial que describe los cambios realizados para abrir ssl en PHP 5.6. Desde aquí aprendí un parámetro más que debería haber establecido en false: "verificar_nombre_peer" => falso
Entonces mi código de trabajo se ve así:
fuente
file_get_contents($url, false, stream_context_create(array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false))));
No deberías simplemente desactivar la verificación. En su lugar, debe descargar un paquete de certificados, ¿tal vez lo hará el paquete curl ?
Luego solo tiene que ponerlo en su servidor web, dando al usuario que ejecuta php permiso para leer el archivo. Entonces este código debería funcionar para usted:
Con suerte, el certificado raíz del sitio al que está intentando acceder está en el paquete curl. Si no es así, esto todavía no funcionará hasta que obtenga el certificado raíz del sitio y lo coloque en su archivo de certificado.
fuente
stream_context_set_default
que puede usarse para que no tenga que pasarla a file_get_contents cada vezSolucioné esto asegurándome de que OpenSSL estaba instalado en mi máquina y luego agregué esto a mi php.ini:
fuente
cert.pem
archivo y configuré elphp.ini
siguiente, y funcionó:openssl.cafile=D:\Tools\GnuWin32\bin\cacert.pem
Puede solucionar este problema escribiendo una función personalizada que use curl, como en:
Luego, solo use en
file_get_contents_curl
lugar defile_get_contents
cuando llame a una url que comienza con https.fuente
Trabajando para mí, estoy usando PHP 5.6. La extensión openssl debe estar habilitada y al llamar a google map api verificar_peer hacer falso El siguiente código funciona para mí.
fuente
Si su versión de PHP es 5, intente instalar cURL escribiendo el siguiente comando en el terminal:
fuente
cURL
.sudo port install php70-curl
Básicamente, debe establecer la variable de entorno SSL_CERT_FILE en la ruta del archivo PEM del certificado SSL descargado del siguiente enlace: http://curl.haxx.se/ca/cacert.pem .
Me llevó mucho tiempo resolver esto.
fuente
los siguientes pasos solucionarán este problema,
curl.cainfo
y pegue la ruta absoluta donde descargó el Certificado.curl.cainfo ="C:\wamp\htdocs\cert\cacert.pem"
Espero que ayude !!
fuente
Solo quería agregar a esto ya que me encontré con el mismo problema y nada de lo que pude encontrar en ningún lugar funcionaría (por ejemplo, descargar el archivo cacert.pem, configurar cafile en php.ini, etc.)
Si está utilizando NGINX y su certificado SSL viene con un "certificado intermedio", debe combinar el archivo de certificado intermedio con su archivo principal "mydomain.com.crt" y debería funcionar. Apache tiene una configuración específica para los certificados intermedios, pero NGINX no, por lo que debe estar dentro del mismo archivo que su certificado regular.
fuente
La razón de este error es que PHP no tiene una lista de autoridades de certificación confiables.
PHP 5.6 y posteriores intentan cargar las CA confiables por el sistema automáticamente. Los problemas con eso se pueden solucionar. Ver http://php.net/manual/en/migration56.openssl.php para más información.
PHP 5.5 y versiones anteriores son realmente difíciles de configurar correctamente, ya que debe especificar manualmente el paquete CA en cada contexto de solicitud, algo que no desea espolvorear alrededor de su código. Así que decidí por mi código que para las versiones de PHP <5.6, la verificación SSL simplemente se deshabilita:
fuente
Tenía el mismo error con PHP 7 en XAMPP y OSX.
La respuesta mencionada anteriormente en https://stackoverflow.com/ es buena, pero no resolvió completamente el problema para mí. Tuve que proporcionar la cadena de certificados completa para que file_get_contents () volviera a funcionar. Así lo hice:
Obtener certificado raíz / intermedio
En primer lugar, tuve que averiguar cuál es la raíz y el certificado intermedio.
La forma más conveniente es tal vez una herramienta de certificación en línea como ssl-shopper
Allí encontré tres certificados, un certificado de servidor y dos certificados de cadena (uno es la raíz y el otro aparentemente el intermedio).
Todo lo que necesito hacer es buscar en Internet para ambos. En mi caso, esta es la raíz:
thawte DV SSL SHA256 CA
Y lleva a su url thawte.com . Así que simplemente puse este certificado en un archivo de texto e hice lo mismo para el intermedio. Hecho.
Obtenga el certificado de host
Lo siguiente que tuve que hacer es descargar mi certificado de servidor. En Linux u OS X se puede hacer con openssl:
Ahora reúnelos a todos
Ahora solo combine todos en un solo archivo. (Tal vez sea bueno simplemente ponerlos en una carpeta, solo los fusioné en un archivo). Puedes hacerlo así:
dile a PHP dónde encontrar la cadena
Existe esta práctica función openssl_get_cert_locations () que le dirá dónde PHP está buscando archivos cert. Y existe este parámetro, que le dirá a file_get_contents () dónde buscar archivos cert. Tal vez las dos formas funcionen. Preferí la forma del parámetro. (En comparación con la solución mencionada anteriormente).
Entonces este es mi código PHP
Eso es todo. file_get_contents () está funcionando nuevamente. Sin CURL y con suerte sin fallas de seguridad.
fuente
chain.pem
? Es estochain.crt
?Después de ser víctima de este problema en centOS después de actualizar php a php5.6, encontré una solución que funcionó para mí.
Obtenga el directorio correcto para que sus certificados se coloquen de forma predeterminada con esto
Luego, use esto para obtener el certificado y colocarlo en la ubicación predeterminada que se encuentra en el código anterior
fuente
Tenía el mismo problema SSL en mi máquina de desarrollador (php 7, xampp en Windows) con un certificado autofirmado que intentaba encontrar un archivo " https: // localhost / ...". Obviamente, el ensamblaje del certificado raíz (cacert.pem) no funcionó. Acabo de copiar manualmente el código del archivo apache server.crt en el archivo cacert.pem descargado e hice la entrada openssl.cafile = path / to / cacert.pem en php.ini
fuente
Otra cosa para intentar es reinstalar
ca-certificates
como se detalla aquí .Y otra cosa que debe intentar es permitir explícitamente el certificado de un sitio en cuestión como se describe aquí (especialmente si ese sitio es su propio servidor y ya tiene el .pem al alcance).
Me encontré con este error SO exacto después de actualizar a PHP 5.6 en CentOS 6 tratando de acceder al servidor en sí, que tiene un certificado de seguridad barato que tal vez necesitaba ser actualizado, pero en su lugar instalé un certificado de letencrypt y con estos dos pasos anteriores lo hice el truco. No sé por qué fue necesario el segundo paso.
Comandos útiles
Ver la versión de openssl:
Ver la configuración actual de PHP cli ssl:
fuente
En cuanto a errores similares a
¿Ha verificado los permisos de los certificados y directorios a los que hace referencia openssl?
Puedes hacerlo
Para obtener algo similar a esto
Este problema me frustró por un tiempo, hasta que me di cuenta de que mi carpeta "certs" tenía 700 permisos, cuando debería haber tenido 755 permisos. Recuerde, esta no es la carpeta para las claves sino los certificados. Recomiendo leer este enlace en los permisos de SSL.
Una vez que lo hice
El problema se solucionó, al menos para mí de todos modos.
fuente
Tuve el mismo problema para otra página segura al usar
wget
ofile_get_contents
. Una gran cantidad de investigación (incluidas algunas de las respuestas a esta pregunta) resultó en una solución simple: instalar Curl y PHP-Curl. Si he entendido correctamente, Curl tiene la CA raíz de Comodo que resolvió el problemaInstale el complemento Curl y PHP-Curl, luego reinicie Apache
Todo ahora trabajando.
fuente