首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SSL证书连接到运行在Windows服务器上的Web时NodeJs引发SSL错误

问使用SSL证书连接到运行在Windows服务器上的Web时NodeJs引发SSL错误
EN

Stack Overflow用户
提问于 2021-05-13 12:50:13
回答 1查看 507关注 0票数 0

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

例如,当我将URL放在chrome浏览器中时,它会将客户列表作为JSON。

代码语言:javascript
复制
https://windows-hostname.xyz.com/api/customers

另外,当我在Chrome浏览器中跨组织的机器上放置这个URL时,它运行得非常好,并返回数据。它执行而不是抛出证书错误--因为它使用的证书是由公司证书颁发者颁发的有效证书。

但是,当我编写Nodejs程序来访问相同的URL时。它会引发SSL错误。

代码语言:javascript
复制
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服务器上运行MMC ->添加/删除快照->选择左潘中的证书->添加到右潘->计算机帐户->)

我可以右键单击证书和导出的证书与.CER扩展(基-64编码)。我不可能导出私钥。

我修改了上面的程序来使用这个导出的证书。然后抛出错误:无法在TLSSocket.onConnectSecure获得本地颁发者证书。

代码语言:javascript
复制
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文件并编写nodejs程序,该程序可以连接到这个Web应用程序而不会出现SSL错误?

此外,I不能忽略证书错误。

谢谢你,阿图尔

EN

回答 1

Stack Overflow用户

发布于 2021-05-14 05:15:01

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

因此,我创建了一个exported.CER文件,该文件连接证书链中的所有证书--包括自上而下的所有颁发者。

代码语言:javascript
复制
-----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-----

现在,当我拥有包含证书链中所有证书的.CER文件时,我的早期程序就可以工作了。

此外,我们还可以使用下面的openssl命令获取链中的所有证书。

代码语言:javascript
复制
 openssl s_client -connect windows-hostname.xyz.com:443  -showcerts

此命令提供2个证书,而不是顶级证书。我不知道它是否还会起作用。

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

谢谢你,阿图尔

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67519541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档