Не удалось подключиться к WSDL

Я работал с более старой версией OpenSSL (OpenSSL 0.9.8o), и я был вынужден использовать новые OpenSSL 1.0.1e-fips, поскольку в результате я не смог подключиться к WSDL:

Message: SoapClient::SoapClient(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Мне нужно отключить проверку сертификатов SSL, я пробовал:

    $client = new SoapClient("https://IP:443/sdk/vimService?wsdl",
        array(
            "trace" => 1,
            "location" => "https://IP:443/sdk/",
            "stream_context" => stream_context_create(
                array(
                    'ssl' => array(
                        'verify_peer'       => false,
                        'allow_self_signed' => true,
                    )
                )
            )
        ) 
    );

`

И он бросает:

Message: SoapClient::SoapClient(): Peer certificate CN= localhost.localdom 'не соответствует ожидаемому CN = SAME IP AS IN SoapClient()'

Затем я добавил 'peer_name'=> 'localhost.localdom', в stream_context, а затем он сказал, что файл XML пуст:

Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML document

PHP 5.5

Ответ 1

Okey, мне удалось найти проблему.

Вы можете избежать этого беспорядка, используя стабильную версию PHP 5.5

Недавно я узнал, что ошибка: "похоже, что у нас нет XML-документа" вызвана из-за версии PHP - PHP 5.6 в 5.5 работает как шарм.

Как исправить это в PHP 5.6

1) Удалите проверку сертификата SSL в PHP 5.6:

В версии 5.6 SSL-сертификация была включена по умолчанию, поэтому, если вы хотите ее отключить, вы должны передать поток контекста:

    "stream_context" => stream_context_create(
        array(
            'ssl' => array(
                'verify_peer'       => false,
                'verify_peer_name'  => false,
            )
        )
    )

2) Удалено ?wsdl и добавлено .wsdl вместо (с ?wsdl, это не сработало для меня)

<?php

$client = new SoapClient("https://IP:443/sdk/vimService.wsdl",
    array(
        "trace" => 1,
        "location" => "https://IP:443/sdk/",
        'exceptions' => 1,
        "stream_context" => stream_context_create(
            array(
                'ssl' => array(
                    'verify_peer'       => false,
                    'verify_peer_name'  => false,
                )
            )
        )
    ) 
);


$soapmsg["_this"] = array( "_" => "ServiceInstance", "type" => "ServiceInstance");

$result = $client->RetrieveServiceContent($soapmsg);
$ServiceContent = $result->returnval;

$soapmsg = NULL;
$soapmsg["_this"] = $ServiceContent->sessionManager;
$soapmsg["userName"] = "USERNAME";
$soapmsg["password"] = "PASSWORD";

$result = $client->Login($soapmsg);
$UserSession = $result->returnval;

echo "User, " . $UserSession->userName . ", successfully logged in!\n";

$soapmsg = NULL;
$soapmsg["_this"] = $ServiceContent->sessionManager;
$result = $client->Logout($soapmsg);

Ответ 2

В моем случае stream_context_create не работал.
Поэтому я загружаю этот файл здесь: https://curl.haxx.se/ca/cacert.pem

и поместил его в мой localhost как: F:\xampp\apache\cert.pem и дал тот же путь для openssl.cafile = F:\xampp\apache\cert.pem в моем phpini

Это сделало localhost для получения сертификата, и все отлично работало...!! Проводя это, если это может помочь кому-то в моей ситуации.

Ответ 3

В моем случае "stream_context" сделал волшебство, я только что добавил код:

'"stream_context" => stream_context_create(
   array(
      'ssl' => array(
           'verify_peer'       => false,
           'verify_peer_name'  => false,
      )
   )
)'

Ответ 4

В моем случае нужно было добавить crypt_method

"stream_context" => stream_context_create(
        array(
            'ssl' => array(
                'verify_peer'       => true,
                'verify_peer_name'  => true,
                'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
            )
        )
    )