Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 当使用SSL证书连接到Windows服务器上运行的Web API时,NodeJs抛出SSL错误_Node.js_Ssl - Fatal编程技术网

Node.js 当使用SSL证书连接到Windows服务器上运行的Web API时,NodeJs抛出SSL错误

Node.js 当使用SSL证书连接到Windows服务器上运行的Web API时,NodeJs抛出SSL错误,node.js,ssl,Node.js,Ssl,我正在Windows上运行Web API服务器。它在https上使用证书和主机Web API 例如,当我在chrome浏览器中将URL放在下面时,它会将客户列表作为JSON数组给出 https://windows-hostname.xyz.com/api/customers 此外,当我将此URL放在整个组织的任何机器上的Chrome浏览器中时,它运行良好并返回数据。它不会抛出证书错误,因为它使用的证书是公司证书颁发者颁发的有效证书 然而,当我编写Nodejs程序来访问相同的URL时。它向我抛出

我正在Windows上运行Web API服务器。它在https上使用证书和主机Web API

例如,当我在chrome浏览器中将URL放在下面时,它会将客户列表作为JSON数组给出

https://windows-hostname.xyz.com/api/customers
此外,当我将此URL放在整个组织的任何机器上的Chrome浏览器中时,它运行良好并返回数据。它不会抛出证书错误,因为它使用的证书是公司证书颁发者颁发的有效证书

然而,当我编写Nodejs程序来访问相同的URL时。它向我抛出SSL错误

const superagent = require('superagent');
var baseUrl = 'https://windows-hostname.xyz.com';
superagent
    .get(baseUrl + "/api/customers")
    .set("accept", "application/json")
    .end(function(err, resp){
       // throws ERROR - err = Error: unable to get local issuer certificate at TLSSocket.onConnectSecure
    }

我已在“受信任的根证书颁发机构”下安装了证书(在windows server上运行MMC->添加/删除管理单元->在左窗格中选择证书->添加到右窗格->计算机帐户->)

我可以右键单击证书并导出扩展名为.CER(BASE-64编码)的证书。我无法导出私钥

我更改了上述程序以使用此导出的证书。然后它抛出错误:无法在TLSSocket.onConnectSecure获取本地颁发者证书

const superagent = require('superagent');
var ca = fs.readFileSync('exported.cer');
var baseUrl = 'https://windows-hostname.xyz.com';
superagent
    .get(baseUrl + "/api/customers")
    .set("accept", "application/json")
    .ca(ca)
    .end(function(err, resp){
       // throws ERROR - err = Error: unable to get local issuer certificate at TLSSocket.onConnectSecure 
    }
我的问题是如何使用这个导出的.CER文件并编写能够连接到此Web应用程序而不发生SSL错误的nodejs程序

另外,我不能忽略证书错误

谢谢,
Atul

感谢@dave_thompson_085为您的努力和帮助。 我可以解决这个问题。这并不十分困难。基本上,当我将证书导出为CER文件(BASE-64编码)时,它并不包括证书链中的所有证书。例如,未包括颁发者证书

因此,我创建了单个exported.CER文件,该文件连接证书链中的所有证书,包括从顶部开始的所有颁发者

-----BEGIN CERTIFICATE-----
XXXXIszCCBpugAwIBAgITKQAANSmJkY5OfHmEGgAAAAA1AAAAAAAAAAABBBBBBBBB
YYYYMR33333333333333333333YD55555555555555555555LGQBGR11223344553
...
-----END CERTIFICATE-----
Bag Attributes: <Empty Attributes>
subject=DC = com, DC = xyz, DC = domain, CN = Company Root CA
issuer=DC = com, DC = xyz, DC = domain, CN = Company Root CA

-----BEGIN CERTIFICATE-----
XXXXYYYYYYYYYYwIBAgITKQAAN77777777777777777777TAN1111111111111111
YYYYMRMwEQYKCZImiZPyLG99999999999999999999ImiZPyLGQBGR11223344553
...
-----END CERTIFICATE-----
Bag Attributes: <Empty Attributes>
subject=DC = com, DC = xyz, DC = domain, CN = Issuer

issuer=DC = com, DC = xyz, DC = domain, CN = Company Root CA
-----BEGIN CERTIFICATE-----
XXXXYYYYYYYYYYwIBAgITKQAANSmJkY5OfHmEGgAAAAA1KTANBgkqhkiG9w0BAQsF
YYYYMRMwEQYKCZI00011111111111111111111111111111yLGQBGR11223344553
...
-----END CERTIFICATE-----
此命令提供2个证书,而不是顶级证书。我不确定它是否仍然有效

最简单的方法是右键单击并导出证书链中的所有证书,然后创建一个文件

谢谢,
Atul

服务器可能没有发送所需的链证书,Chrome等浏览器可以“填写”,而nodejs等软件则不能。如果您有(或获得)OpenSSL,请尝试
OpenSSL s_client-connect$hostname:443-CAfile exported.cer PS:您在“受信任的根”(或任何其他地方)中的CA证书副本不应该也没有私钥是完全正确的,因此您无法导出它,因为它不存在。您可以在窗口显示中看到,其图标左侧没有黄色键(右侧只有圆形密封)。
 openssl s_client -connect windows-hostname.xyz.com:443  -showcerts