Использование узла для вызова веб-службы SOAP через https

Я пытаюсь использовать узел-мыло https://github.com/vpulim/node-soap для вызова веб-службы, но у меня возникают проблемы при использовании модуля с https.

В приведенном ниже коде я использую http, и я могу видеть функции и войти describe() из About функция. (Ответы пустые, вероятно, потому что WS настроен так, когда используется http(?))

var soap = require('soap');
var url = "http://XXXXX/service.svc?DocArchiveService/DocArchiveV201409";
var auth = "Basic " + new Buffer("USERXXX" + ":" + "PWYYY").toString("base64");

var args = {};

soap.createClient(url, { wsdl_headers: {Authorization: auth} }, function(err, client) {

    console.log(client.describe().DocArchiveV201409.DocArchiveV201409Soap.About);

    client.DocArchiveV201409.DocArchiveV201409Soap.About(args, function(err, result){
        if (err) throw err;
        console.log(result);
    });
});

Выход:

{ input: {}, output: { AboutResult: 's:string' } }

Сообщение об ошибке (это нормально, поскольку ответ все равно будет пустым):

Ошибка: невозможно выполнить анализ ответа при завершении (E:\Qlikview\SourceDocuments\UnderDevelopment\Node\node_modules\so ap\lib\client.js:383:19)

Моя проблема в том, что при использовании https я получаю неопределенного клиента.

E: \ Qlikview \ SourceDocuments \ UnderDevelopment \ Node \ Soap.js: 23 console.log (клиент); ^ ReferenceError: клиент не определен в Object.anonymous (E:\Qlikview\SourceDocuments\UnderDevelopment\Node\Soa p.js:23:13)

Кто-нибудь использовал нод-мыло с https?

редактировать: как результат ниже предлагает мне сначала иметь сертификат. Я пытался использовать SoapUI без сертификата, и это прекрасно работает. Может быть, есть некоторые параметры для createClient Я могу использовать в нод-мыло?

console.log (err) возвращает:

{ Error: unable to get local issuer certificate
    at Error (native)
    at TLSSocket.<anonymous> (_tls_wrap.js:1079:38)
    at emitNone (events.js:86:13)
    at TLSSocket.emit (events.js:185:7)
    at TLSSocket._finishInit (_tls_wrap.js:603:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:433:38) code: 'UNABLE_TO_GET_IS
SUER_CERT_LOCALLY' }

1 ответ

Решение

Как очищено от tls конкретная ошибка, вы не можете создать мыльный клиент, вызвав soap.createClient, Возвращается err а также undefined клиент, поэтому последующие звонки не удается.

Основная причина позади certificate проблема может быть либо сертификаты мыльного сервера подписаны internal CA или мыльный сервер использует self-signed certificate,

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

  1. [Не рекомендуется] Игнорировать предупреждения, относящиеся к сертификату, отключив SSL проверить по запросу время. например

    var request = require('request');
    var specialRequest = request.defaults({
       strictSSL: false
    );
    
  2. [Рекомендуется] Укажите корневые / промежуточные сертификаты CA для проверки удаленных сертификатов.

    var request = require('request');
    var specialRequest = request.defaults({
       agentOptions: {
          ca: fs.readFileSync('ca.cert.pem') //path of CA cert file
       }
    );
    

Для обоих решений передайте это specialRequest в createClient,

    soap.createClient(url, { 
        wsdl_headers: {Authorization: auth},
        request : specialRequest
    }, function(err, client) {
        //your code
    });

Я просто просмотрел документацию и нашел решение. Это может или не может работать, но стоит попробовать логически. Я не мог протестировать вышеупомянутые решения, но это должно работать.

Надеюсь, это поможет вам.

Для рекомендуемого решения - предоставьте корневые / промежуточные сертификаты CA для проверки удаленных сертификатов, попробуйте следующее:

var request = require('request'); 
var specialRequest = request.defaults({ ca: fs.readFileSync('ca.cert.pem') //path of CA cert file );

var auth = "Basic " + new Buffer.from("myUsername:myPassword").toString("base64"); 
var options = { wsdl_headers: { Authorization: auth }, request: specialRequest };

soap.createClient(url, options, function (err, client) {
    client.myFunction(args, function (err, result) { 
        console.log(result);
    });
});
Другие вопросы по тегам