无法将BeSimpleSOAP客户端与证书连接

时间:2014-01-31 13:04:50

标签: php soap ssl certificate

我正在尝试使用PHP SOAP客户端发送测试消息。我正在使用BeSimpleSoap库,因为我遇到了标准PHP SOAP calss和NuSOAP类的问题。 我已经成功下载了受PKI保护的文件。部分代码是:

$OIB_URL="https://xxxx:8444/kpoib/kp_lista_aktiviranih_korisnika.txt";
$Cert_path="C:\\PKI\\servercert.pem";
$key_path="C:\\PKI\\cert_file.pem";
$FINA_APIS_cert="C:\\PKI\\FINA_APIS.pem";
$cert_password="xxx";

$handle = curl_init();
$options = array( 
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_SSL_VERIFYPEER => TRUE,
    CURLOPT_CAINFO         => $FINA_APIS_cert,
    CURLOPT_VERBOSE        => TRUE,
    CURLOPT_SSL_VERIFYHOST => FALSE,
    CURLOPT_SSLCERTPASSWD  => $cert_password ,
    CURLOPT_SSLCERT        => $Cert_path,
    CURLOPT_SSLKEY         => $key_path,
    CURLOPT_SSLVERSION     => 3,
    CURLOPT_URL            => $OIB_URL
);

curl_setopt_array($handle, $options);


$OIB_File=(string)curl_exec($handle);
if (curl_errno($handle)) {
  echo 'Error: ' . curl_error($handle);
}
curl_close($handle);

文件是:

  • soap_cert.pem是CA以PEM格式签署的证书
  • cert_file.pem是加密的私钥和我的PEM格式的IIS证书
  • FINA_APIS.pem是我正在与之通信的服务器的证书和CA root自签名证书

我不知道如何将这些证书和密钥传递给SoapClient以发送测试消息。 我试过这个:

    $par_data=array("KorisnickiPretinacPoruka" => 
        array("Zaglavlje"=>
            array("IdPosiljatelja"=>"000000001","IdPoruke"=>$UUID,"DatumVrijemeSlanja"=>$date_time,"RazinaSigurnosti"=>2),
                "Poruka" =>array("PinPrimatelja"=>$OIB,"OznakaDrzave"=>"HR","Predmet"=>$title,"Sadrzaj"=>$rows_lines)));

    $par_envelope=array( "GsbEnvelope" =>  
        array( "MessageHeader" => 
            array("SenderId" => "000000001",
                "ServiceId" => "000000002",
                "MessageId" => $UUID,
                "SenderTimeStamp" => $date_time),
                "Content" => array("MimeType" =>"application/xml","Data" =>array("encoding"=>"EMBEDDED","any"=>$par_data))));


    $client = new BeSimple\SoapClient\SoapClient("GSBService.wsdl", array( 
                    "trace"=>1,
                    "exceptions"=>1,
                    "local_cert" =>$key_path,
                    "passphrase"=>$cert_password,
                    "connection_timeout" => 30));


    print_r( $client->sendMessage($par_envelope));



    echo "<p>Request :".htmlspecialchars($client->__getLastRequest()) ."</p>";
    echo "<p>Response:".htmlspecialchars($client->__getLastResponse())."</p>";
    echo "<p>Debug:".soapDebug($client)."</p>";

结果是:

Fatal error: Uncaught SoapFault exception: [HTTP] Could not connect to host in C:\xampp\htdocs\NIAS\BeSimpleSoap-master\src\BeSimple\SoapClient\SoapClient.php:146 Stack trace: #0 C:\xampp\htdocs\NIAS\BeSimpleSoap-master\src\BeSimple\SoapClient\SoapClient.php(203): BeSimple\SoapClient\SoapClient->__doHttpRequest(Object(BeSimple\SoapClient\SoapRequest)) #1 C:\xampp\htdocs\NIAS\BeSimpleSoap-master\src\BeSimple\SoapClient\SoapClient.php(183): BeSimple\SoapClient\SoapClient->__doRequest2(Object(BeSimple\SoapClient\SoapRequest)) #2 [internal function]: BeSimple\SoapClient\SoapClient->__doRequest('<?xml version="...', 'http://www.apis...', 'http://www.apis...', 1, 0) #3 C:\xampp\htdocs\NIAS\HZZO-OKP-SOAP.php(131): SoapClient->__call('sendMessage', Array) #4 C:\xampp\htdocs\NIAS\HZZO-OKP-SOAP.php(131): BeSimple\SoapClient\SoapClient->sendMessage(Array) #5 {main} thrown in C:\xampp\htdocs\NIAS\BeSimpleSoap-master\src\BeSimple\SoapClient\SoapClient.php on line 146

1 个答案:

答案 0 :(得分:2)

错误是“无法连接到主机”而不是某些证书错误,因此您必须检查是否已连接到服务。

试试这个:

$client = new BeSimple\SoapClient\SoapClient("GSBService.wsdl", array( 
                "trace"=>1,
                "exceptions"=>1,
                "local_cert" =>$key_path,
                "passphrase"=>$cert_password,
                "connection_timeout" => 30));

// set direct location to service
$client->__setLocation(xxx);

print_r( $client->sendMessage($par_envelope));

HTH。