Я хочу использовать веб-службу третьей стороны. Чтобы использовать веб-службу, мне нужно подключиться к HTTPS. Моя проблема в том, что для процесса разработки у меня есть тест api с недопустимым сертификатом. Я хотел бы установить SoapClient no для проверки сертификата сервера. Вот как я пытался:
$opts = array( 'ssl' => array( 'verify_peer' => false ), 'https' => array( 'curl_verify_ssl_peer' => false, 'curl_verify_ssl_host' => false ) ); $streamContext = stream_context_create($opts); $client = new SoapClient("https://urlToSoapWs", array( 'login' => 'user', 'password' => 'pwd', 'authentication' => SOAP_AUTHENTICATION_BASIC, 'local_cert' => file_get_contents('C:/somelocation/1.pem'), 'passphrase' => 'passphrase', 'stream_context' => $streamContext ));
Я также пробовал CURL и работал! Но я хочу использовать SoapClient. Код CURL можно найти ниже:
// create a new cURL resource $ch = curl_init("https://urlToSoapWs"); // setting the request type to POST: curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml")); // setting the authorization method to BASIC: curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); // supplying your credentials: curl_setopt($ch, CURLOPT_USERPWD, "user:pwd"); $body = "<SOAP-ENV:Envelope>somexmlhere</SOAP-ENV:Envelope>"; // filling the request body with your SOAP message: curl_setopt($ch, CURLOPT_POSTFIELDS, $body); // configuring cURL not to verify the server certificate: curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSLCERT, "pathToTheCertificatePemFile"); curl_setopt($ch, CURLOPT_SSLCERTPASSWD, "pwd"); //curl_setopt($ch, CURLOPT_SSLCERTTYPE, "PEM"); curl_setopt($ch, CURLOPT_SSLKEY, "pathTotheKeyFile"); curl_setopt($ch, CURLOPT_SSLKEYPASSWD, "pwd"); // telling cURL to return the HTTP response body as operation result // value when calling curl_exec: curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // calling cURL and saving the SOAP response message in a variable which // contains a string like "<SOAP-ENV:Envelope ...>...</SOAP-ENV:Envelope>": $result = curl_exec($ch); // closing cURL: curl_close($ch);
Если вы обнаружили ошибку в коде, который я предоставил с помощью SoapClient, отправьте его. Благодарю.
Возможно, недействительный Сертификат – проблема, больше SSLv2 / 3 Handshake; вы можете вручную указать Cipher следующим образом:
$stream_opts = array( // 'ssl'=>array('ciphers'=>"3DES" // also working // further ciphers on http://www.openssl.org/docs/apps/ciphers.html 'ssl'=>array('ciphers'=>"SHA1" ) ); $myStreamContext = stream_context_create($stream_opts); $soapOptions['stream_context'] = $stream_opts; $soapClient = new SoapAuthClient("https://...", $soapOptions);
Удачи!
Похоже, вы попали в эту аутентификацию и ошибку SSL в SoapClient . Вы можете перекомпилировать php с патчем, включенным в эту ссылку, или подождать, пока они не интегрируют его в официальную сборку.