我正在Windows上运行Web服务器。它在https上使用证书和宿主Web。
例如,当我将URL放在chrome浏览器中时,它会将客户列表作为JSON。
https://windows-hostname.xyz.com/api/customers另外,当我在Chrome浏览器中跨组织的机器上放置这个URL时,它运行得非常好,并返回数据。它执行而不是抛出证书错误--因为它使用的证书是由公司证书颁发者颁发的有效证书。
但是,当我编写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服务器上运行MMC ->添加/删除快照->选择左潘中的证书->添加到右潘->计算机帐户->)
我可以右键单击证书和导出的证书与.CER扩展(基-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文件并编写nodejs程序,该程序可以连接到这个Web应用程序而不会出现SSL错误?
此外,I不能忽略证书错误。
谢谢你,阿图尔
发布于 2021-05-14 05:15:01
感谢@dave_thompson_085的努力和帮助。我可以解决这个问题。不是很难。基本上,当我将证书导出为CER文件(bas-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-----现在,当我拥有包含证书链中所有证书的.CER文件时,我的早期程序就可以工作了。
此外,我们还可以使用下面的openssl命令获取链中的所有证书。
openssl s_client -connect windows-hostname.xyz.com:443 -showcerts此命令提供2个证书,而不是顶级证书。我不知道它是否还会起作用。
最简单的方法是右键单击并导出证书链中的所有证书并创建一个文件。
谢谢你,阿图尔
https://stackoverflow.com/questions/67519541
复制相似问题