2009-11-18 14 views
12

Estoy ejecutando PHP 5.2.6 en Windows, tengo extension=php_curl.dll y extension=php_openssl.dll sin comentarios en php.ini; como tal, puedo ver lo siguiente en phpinfo:¿Cómo obtengo SSL trabajando en fsockopen?

curl 
cURL support  enabled 
cURL Information libcurl/7.16.0 OpenSSL/0.9.8g zlib/1.2.3 

openssl 
OpenSSL support  enabled 
OpenSSL Version  OpenSSL 0.9.8g 19 Oct 2007 

No estoy seguro de que tener activado el enrollamiento es vital para esto, pero ya que se menciona OpenSSL que pensé en lo incluyo aquí de todos modos para la integridad.


Lo que quiero hacer es simple: hacer una petición POST a otro servidor a través de SSL usando fsockopen.
Mi código hasta ahora es la siguiente:

$host = 'www.redacted.com'; 
$data = 'user=redacted&pass=redacted&action=redacted'; 
$response = ""; 

if ($fp = fsockopen("ssl:{$host}", 443, $errno, $errstr, 30)) { 

    $msg = 'POST /wsAPI.php HTTP/1.1' . "\r\n"; 
    $msg .= 'Content-Type: application/x-www-form-urlencoded' . "\r\n"; 
    $msg .= 'Content-Length: ' . strlen($data) . "\r\n"; 
    $msg .= 'Host: ' . $host . "\r\n"; 
    $msg .= 'Connection: close' . "\r\n\r\n"; 
    $msg .= $data; 
    if (fwrite($fp, $msg)) { 
     while (!feof($fp)) { 
      $response .= fgets($fp, 1024); 
     } 
    } 
    fclose($fp); 

} else { 
    $response = false; 
} 

Esto funciona bien, por supuesto, si sólo pase en $host y utilizar el puerto 80. Pero realmente tengo que enviar este a través de SSL, y en este momento no está funcionando. $response se establece en false, $errno se queda en 0, y $errstr se establece en php_network_getaddresses: getaddrinfo failed: No such host is known.. Sé que no es un problema que el servidor esté inactivo, o un error tipográfico en el nombre de host, etc., porque SÍ funciona si reviso el puerto 80 de forma no segura. Los problemas solo comienzan cuando intento cambiar a SSL.

¿Qué debo hacer para que esto funcione?

+0

No está realmente relacionado con la respuesta, pero ¿ha considerado usar el protocolo tls en su lugar? TLSv1 es esencialmente la cuarta versión de SSL, y la ha reemplazado ampliamente como la implementación de facto de SSL. – Powerlord

Respuesta

37

Esto puede sonar obvio, pero ¿ha intentado esto en su lugar?

if ($fp = fsockopen('ssl://'. $host, 443, $errno, $errstr, 30)) { 

no estoy seguro de si es necesaria o no la //, pero los ssl y tls ejemplos en la PHP Internet Transports page ellos tienen.

P.S. También tengo una "cosa" sobre las variables incluidas en cadenas, en caso de que se pregunte por qué utiliza la concatenación de cadenas ahora.

+0

Gosh Me siento como un idiota. ¡Todo lo que tomó fue esto! Muchas gracias. Y no me importa que la mascota se preocupe por las variables incluidas concatenadas. Todos tenemos nuestras peculiaridades. – SoaperGEM