¿Es posible trabajar con FTPS bajo PHP usando el contexto de flujo?

Aprendí que usar ftps (‘ftp_ssl_connect () ‘) bajo PHP para Windows es difícil. Se te pide que inicies un largo viaje de construcción de tus propios binarios para incluir Open SSL … Encontré consejos sobre phpseclib como reemplazo (pero obtener el permiso de openssl.cnf para respaldar la validación de pares también me resulta bastante difícil …) .

Luego di con este artículo y su ejemplo agradablemente simple, que incluye la validación de compañeros de trabajo (para evitar Man-in-the-middle-Attacks), llamó mi atención sobre las transmisiones:

$uri = 'https://www.bankofamerica.com/'; $ctx = stream_context_create(['ssl' => [ 'verify_peer' => true, // important 'cafile' => '/hard/path/to/cacert.pem', 'CN_match' => 'www.bankofamerica.com' ]]); $html = file_get_contents($uri, FALSE, $ctx); // we are good 

Sin embargo, ¿esto es útil para las conexiones ftp? ¿Puedo usar contextos de flujo validados por pares para abrir flujos de ftps? Las sugerencias de php manual , las opciones de contexto SSL también se aplican a sftp, pero carece de más orientación.

Así que estoy locamente adivinando:

 $ctx = stream_context_create(['ftps' => [ 'verify_peer' => true, 'cafile' => 'd:/sandbox/mycerts.pem', 'CN_match' => 'ftp-12345678.mywebhoster.com' ]]); 

¿Derecha? ¿Incorrecto? Usuario + Contraseña como opciones ahora? ¿Y entonces que? Usuario / Contraseña ahora? ¿O después? No tengo ni idea …

  • ¿Cómo escaneo los contenidos del directorio FTP remoto para comenzar?
  • ¿Cómo subir o descargar un archivo desde un servidor ftp?

¿Alguno de eso es posible? (Algunas líneas de código serían muy útiles …) ¿O las transmisiones solo son buenas para el acceso a archivos en singular?

Actualización : Curl puede hacer lo que yo quiera (incluida la validación entre pares y la ubicación de directorios) como se muestra en esta respuesta SO . Lo examinaré más adelante esta semana …

esto funcionara?

¿Puedo usar contextos de flujo validados por pares para abrir flujos de ftps?

Sí. El contenedor de flujo de ftps utiliza las mismas opciones de contexto de SSL que el wrapper de https y estará disponible siempre que tenga habilitada la extensión de openssl en su comstackción de PHP. Puede verificar si el contenedor de ftps está disponible al verificar el resultado de stream_get_wrappers() manera:

  

Si tienes ext / openssl habilitado en tu comstackción de php, verás los ftps listados en el resultado junto con las otras envolturas de flujo disponibles.

¿Cómo asigno las opciones de contexto de SSL?

Así que estoy locamente adivinando

¡Estás muy cerca! Lo único que necesita cambiar en su código es reemplazar "ftps" por "ssl" como se muestra aquí:

  [ 'verify_peer' => true, 'cafile' => 'd:/sandbox/mycerts.pem', 'CN_match' => 'ftp-12345678.mywebhoster.com' ]]); 

Independientemente de si está utilizando https , ftps o cualquier otro contenedor de secuencias, las opciones de contexto que rigen el cifrado SSL / TLS siempre se almacenan en la clave "ssl" .

¿Dónde pongo el usuario / contraseña?

¿Derecha? ¿Incorrecto? Usuario + Contraseña como opciones ahora? ¿Y entonces que? Usuario / Contraseña ahora? ¿O después? No tengo ni idea ...

Los contenedores de flujo ftp y ftps esperan el nombre de usuario y la contraseña en el URI como se muestra aquí:

  

No se deje engañar por nuestra especificación del usuario / pase en texto claro aquí. El contenedor de flujo solo enviará el nombre de usuario y la contraseña después de establecer una conexión cifrada.

Poniendolo todo junto

La familia de funciones opendir() admite el contenedor ftp (desde PHP 5.0). Utiliza estas funciones de la misma manera que lo haría con las rutas del sistema de archivos local:

  [ 'verify_peer' => true, 'cafile' => 'd:/sandbox/mycerts.pem', 'CN_match' => 'ftp-12345678.mywebhoster.com' ]]); $dirHandle = opendir('ftps://username:[email protected]/', $ctx); while (($file = readdir($dirHandle)) !== false) { echo "filename: $file\n"; } closedir($dirHandle); 

Nota sobre la coincidencia de nombres SSL / TLS

Si no funciona inicialmente, debe probar sin pasar el contexto adicional $ctx contiene las opciones de SSL. El campo CN (nombre común) del certificado del servidor debe coincidir con el valor "CN_match" que especifique (con coincidencia de comodines limitada para subdominios). Además, antes de la próxima versión de PHP-5.6 no hay soporte para nombres coincidentes con el campo Nombre alternativo del sujeto en el certificado de la parte remota. A menos que esté trabajando con una vista previa de desarrollo para 5.6, no tendrá esta capacidad (coincidencia de SAN) y la rutina de verificación de pares fallará si el servidor depende de la SAN.