使用 Nodejs 调用需要证书的 SOAP 服务

Posted

技术标签:

【中文标题】使用 Nodejs 调用需要证书的 SOAP 服务【英文标题】:Calling a SOAP service requiring certificate using Nodejs 【发布时间】:2019-05-23 20:16:37 【问题描述】:

Nodejs SOAP 客户端抛出错误 [ERR_TLS_CERT_ALTNAME_INVALID]:主机名/IP 与证书的替代名称不匹配:

我正在尝试在 nodejs 中使用 soap 调用 SOAP 服务。但是我收到错误 [ERR_TLS_CERT_ALTNAME_INVALID]: Hostname/IP does not match certificate's altnames: IP: XXX.XXX.XXX.XXX is not in the cert's list:。我是 nodejs 的新手,不知道如何调用需要 nodejs 证书的 SOAP 服务。也欢迎在 Nodejs 中调用需要证书的 SOAP 服务的其他方式。

var url = "https://soapserviceurl?wsdl";

soap.createClient(url, function (err, client)  
    if (err) 
        console.log("Error Occurred!!");
        console.log(err);       
    
    else 
        console.log(client.describe());
    
);

【问题讨论】:

【参考方案1】:

请尝试

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" //this is insecure 
要么:

    var soap = require('soap'),
        request = require('request'),
        fs = require('fs');

    var url = "https://soapserviceurl?wsdl";
    
    var req = request.defaults(
       strictSSL: false
    );

    soap.createClient(url,  
            request : req
    , function(err, client) 
    	//your code
    );

或者:

soap.createClient(url,  
            request : req,
    		wsdl_options: 
            cert: fs.readFileSync('cert/cert.pem'), //path to pem
            key: fs.readFileSync('cert/cert.key'),   //path to private key
            rejectUnauthorized: false
        
    , function(err, client) 
    	//your code
);

【讨论】:

谢谢。前两种方法效果很好。我已经使用站点信息(网址开头的小锁符号)从浏览器复制了证书。如何获取私钥? 您可以尝试使用 OpenSSL 等实用程序生成它。但我想你会得到另一个错误,关于不受信任的自签名证书,因为它们不是由 CA 生成的,受信任的机构(应该将它提供给你的组织)。

以上是关于使用 Nodejs 调用需要证书的 SOAP 服务的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 PHP 中使用 x.509 证书对 SOAP 调用进行数字签名

用于使用 SOAP Web 服务的 CXF SSL 配置

https SOAP 的示例免费测试站点

SOAP java客户端HTTPS / SSL

NODEJS SOAP:未将对象引用设置为对象的实例

在 JBoss EAP 6.2 中无法通过 SSL 连接到 SOAP 服务