【问题标题】:Connecting to https with soapClient使用soapClient连接到https
【发布时间】:2015-07-25 06:03:01
【问题描述】:

过去几天我一直在试图弄清楚为什么我的肥皂客户端无法连接,感谢任何帮助。非常简单的问题,我的肥皂客户;

$soapClient = new SoapClient("AXLAPI.wsdl", array('trace'=>true, 'exceptions'=>true,'location'=>"https://ip_address:8443/axl",
'login' => "username",'password'=> "password"));

产生这个非常常见的错误;

Fatal error: Uncaught SoapFault exception: [HTTP] Could not connect to host in /var/www/html/axl_test.php:18 Stack trace: #0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'https://ip_address...', 'CUCM:DB ver=8.5...', 1, 0) #1 /var/www/html/axl_test.php(18): SoapClient->__call('getLine', Array) #2 /var/www/html/axl_test.php(18): SoapClient->getLine(Array) #3 {main} thrown in /var/www/html/axl_test.php on line 18

我在另一台服务器上运行完全相同的代码,它运行良好。我很肯定这与 SSL 问题有关,因为wireshark 捕获了多次重传。此外,当我故意将用户名和密码更改为错误时,错误保持不变。因此,它必须在握手期间发生。我可以毫无问题地从soap客户端服务器访问远程服务器并且能够登录。

该错误似乎表明它正在尝试通过 HTTP 进行连接,但我的 URL 专门要求使用 HTTPS。我真的不明白问题出在哪里。

【问题讨论】:

  • 这不是 SOAP 错误; "Could not connect to hosts" 表示无法建立 TCP 连接。使用某物。像curl https://ip_address:8443/... 一样检查您是否可以建立与该端口的连接。由于它是一个非标准端口,它很可能被您网络中的某种防火墙阻止了。
  • 您在代理服务器或防火墙后面吗?
  • 我根本不在任何防火墙后面。
  • helmbert - 当我尝试使用 curl 连接时,它说证书是自签名的,我可以使用 -k 进行不安全的连接。当我这样做时,我得到一个空白输出。但我可以连接到 curl google.com 并能够获取该页面。
  • helmbert - 另外,我应该补充一点,当我从正在运行的服务器运行 curl -k 命令时,我也会得到空白输出。

标签: php soap debian


【解决方案1】:

在解决这个问题几天后,我解决了这个问题。这里的一些答案是正确的,自签名证书存在问题(因此必须使 Soap 客户端不在乎),但另一个问题是 url 本身。无论出于何种原因,输入 IP 地址都不起作用,使用 FQDN 就可以了。所以,完整的代码是这样的;

<?php
error_reporting(E_ALL);
ini_set('display_errors', True);
?>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="style1.css">
<title>AXL Test</title>

<?php

$context = stream_context_create(array('ssl' => array('verify_peer' => false, 'allow_self_signed' => true)));

$soapClient = new SoapClient("AXLAPI.wsdl", array('stream_context' => $context, 'trace'=>true, 'exceptions'=>true,'location'=>"https://hostname.domain.name:8443/axl",'login' => "username",'password'=> "password")); 
$response = $soapClient->getLine(array("routePartitionName"=>"partitionName", "pattern"=>"pattern"));
echo "<TR><TD class='body'>" .  $response->return->line->description . "</TD><TD class='body'>";

?>

这个问题特别令人烦恼,因为我使用的是来自另一台服务器的久经考验的代码,而自签名证书和 FQDN 并不重要。现在它确实发生了,我不知道为什么。无论如何,我让它工作了。感谢所有提供反馈的人,我希望这对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2015-03-22
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多