2009-11-18 5 views
12

Je cours PHP 5.2.6 sur Windows, j'ai extension=php_curl.dll et extension=php_openssl.dll décommenté dans php.ini; en tant que tel, je peux voir ce qui suit dans phpinfo:Comment utiliser le protocole SSL dans 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 

Je ne suis pas sûr que d'avoir cURL activé est vital pour cela, mais comme il a mentionné OpenSSL je pensais que je l'inclure ici de toute façon pour être complet.


Ce que je veux faire est simple: faire une requête POST à ​​un autre serveur via SSL à l'aide fsockopen.
Mon code à ce jour est le suivant:

$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; 
} 

Cela fonctionne bien bien sûr, si je passe juste à $host et utiliser le port 80. Mais je vraiment besoin d'envoyer ce sur SSL, et maintenant il ne fonctionne pas. $response est défini sur false, $errno reste à 0 et $errstr est défini sur php_network_getaddresses: getaddrinfo failed: No such host is known.. Je sais que ce n'est pas un problème de serveur en panne, ou une faute de frappe dans le nom d'hôte, etc., parce que cela fonctionne si je passe sur le port 80 non sécurisé. Les problèmes ne commencent que lorsque j'essaie de passer à SSL.

Que dois-je faire pour que cela fonctionne?

+0

Pas vraiment lié à la réponse, mais avez-vous envisagé d'utiliser le protocole tls à la place? TLSv1 est essentiellement la quatrième version de SSL, et l'a largement remplacée par l'implémentation SSL de facto. – Powerlord

Répondre

37

Cela peut sembler évident, mais avez-vous essayé à la place?

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

Je ne sais pas si le // est nécessaire ou non, mais les ssl et tls exemples sur le PHP Internet Transports page ont.

P.S. J'ai aussi une "chose" sur les variables incluses dans les chaînes, au cas où vous vous demandez pourquoi il utilise la concaténation de chaînes maintenant.

+0

Gosh Je me sens comme un idiot. Tout ce qu'il a fallu c'était ça! Merci beaucoup. Et je ne me dérange pas la bête noire sur les variables incluses vs concaténées. Nous avons tous nos bizarreries. – SoaperGEM

Questions connexes