当前位置: 首页 > 面试题库 >

主机名/ IP与证书的altname不匹配

姬高扬
2023-03-14
问题内容

我正在尝试使用带有自签名证书的Node.js 0.8.8创建TLS服务器/客户端设置。

基本的服务器代码如下所示

var tlsServer = tls.createServer({
  key: fs.readFileSync('server-key.pem'),
  cert: fs.readFileSync('server-cert.pem')
}, function (connection) {
  // [...]
});
tlsServer.listen(3000);

现在,当我尝试连接到该服务器时,我使用以下代码:

var connection = tls.connect({
  host: '192.168.178.31',
  port: 3000,

  rejectUnauthorized: true,
  ca: [ fs.readFileSync('server-cert.pem') ]
}, function () {
  console.log(connection.authorized);
  console.log(connection.authorizationError);
  console.log(connection.getPeerCertificate());
});

如果我删除线

ca: [ fs.readFileSync('server-cert.pem') ]

从客户端代码,Node.js抛出一个错误告诉我DEPTH_ZERO_SELF_SIGNED_CERT。据我了解,这是由于它是一个自签名证书,并且没有其他方信任此证书。

如果我删除

rejectUnauthorized: true,

同样,错误也消失了-但connection.authorized等于错误false,实际上意味着我的连接未加密。无论如何,使用getPeerCertificate()我可以访问服务器发送的证书。由于我想强制执行加密连接,因此我了解我可能不会删除此行。

现在,我了解到可以使用该ca属性指定我希望Node.js信任的任何CA。TLS模块的文档表明,将服务器证书添加到ca阵列就足够了,然后一切都应该很好。

如果这样做,该错误消失了,但是我得到了一个新错误:

Hostname/IP doesn't match certificate's altnames

对我来说,这意味着CA现在基本上是受信任的了,因此现在还可以,但是证书是为我使用的另一台主机制作的。

我使用创建证书

$ openssl genrsa -out server-key.pem 2048
$ openssl req -new -key server-key.pem -out server-csr.pem
$ openssl x509 -req -in server-csr.pem -signkey server-key.pem -out server-cert.pem

如文档所示。创建CSR时,系统会询问我一些常见的问题,例如国家,州,…和通用名(CN)。正如“在网络上”告诉您SSL证书时,您 没有
提供您的名称作为CN,而是您要使用的主机名。

这可能是我失败的地方。

我试过了

  • localhost
  • 192.168.178.31
  • eisbaer
  • eisbaer.fritz.box

最后两个是我的计算机的本地名称和标准本地名称。

知道我在做什么错吗?


问题答案:

最近,node.js新增了一个功能,该功能允许使用自定义功能覆盖主机名检查。它已添加到v0.11.14,并将在下一个稳定版本(0.12)中可用。现在,您可以执行以下操作:

var options = {
  host: '192.168.178.31',
  port: 3000,
  ca: [ fs.readFileSync('server-cert.pem') ],
  checkServerIdentity: function (host, cert) {
    return undefined;
  }
};
options.agent = new https.Agent(options);
var req = https.request(options, function (res) {
  //...
});

现在,它将接受任何服务器身份,但仍会加密连接并验证密钥。

请注意
,在以前的版本(例如v0.11.14)中,checkServerIdentity会返回,boolean指示服务器的有效性。如果存在问题并且有效,则已将其更改为(之前v4.3.1)为功能return(未显示throw)错误undefined



 类似资料:
  • 问题内容: 我有代码: 当我在带有Node 0.9.4的桌面上运行它时,我在控制台中得到了这个: 当我在带有节点0.6.12的Netbook上运行它时,它们都可以正常运行而没有错误(302响应-我认为是正确的)。 有问题的Node.js主机名/ IP与证书的altnames不匹配 ,Rojuinex写道:“是的,浏览器问题…对不起”。“浏览器问题”是什么意思? UPD。在节点v0.8上回滚后,此问

  • 问题内容: 我尝试使用自签名证书连接到服务器。我使用此代码接受所有证书。 但是尽管如此,我收到以下错误: 我确定我的证书代码已执行,那么可能是什么问题? 问题答案: 您可以使用

  • 我试图从java调用Heroku的开发人员api,但是我得到了以下异常: 我的代码如下所示: https://stackoverflow.com/a/7266768 https://stackoverflow.com/a/3904473 https://stackoverflow.com/a/25356821 建议我应该重写证书主机名检查,这肯定违背了这一点(当然生产还没有准备好)?

  • 问题内容: 我一直在使用以下代码连接到Google的服务之一。这段代码在我的本地机器上运行良好: 我将这段代码放到了已阻止Google.com的生产环境中。根据要求,他们允许我访问IP:74.125.236.52,这是Google的IP之一,从而允许与Google服务器通信。我编辑了主机文件,也添加了该条目。 仍然无法访问URL,我想知道为什么。所以我将上面的代码替换为: 现在我得到这样的错误:

  • 我有一个httpsendpoint,我需要从wso2 API管理器访问它。(使用1.10)。我已经将证书文件添加到“client-truststore.jks”文件中。但现在它给出了如下错误。 我已经更新了Axis2.xml文件,如下所示。 如何使用WSO2 APIManager解决此问题以访问此https后端服务

  • 问题内容: 我在Android上使用HttpClient连接到https://someUrl.com/somePath。问题在于该站点的证书用于* .someUrl.com,而不是someUrl.com,因此我得到了SSLException。是的,网站上有些脚,是的,但是除非我能解决问题,否则我将陷入困境。有没有办法让HttpClient放松并接受证书? 问题答案: 这是我的(编辑)解决方案: 除