node.js – 主机名/ IP与证书的altname不匹配

我正在尝试使用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. documentation of the TLS module意味着将服务器证书添加到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

正如文档所暗示的.在创建企业社会责任时,我被问及常见的问题,如国家,州,…和通用名称(CN).正如您在“网络上”所述的SSL证书一样,您不会将您的姓名提供为CN,而是您要使用的主机名.

这可能是我失败的地方.

我试过了

> localhost
> 192.168.178.31
> eisbaer
> eisbaer.fritz.box

最后两个是本机名称和我机器的完全合格的本地名称.

任何想法我在这里做错什么?

最近有一个addition to 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是返回一个指示服务器有效性的布尔值.如果有问题,那么已经改变了(在v4.3.1之前)到返回(不抛出)的函数,如果它有效,那么它是未定义的.

翻译自:https://stackoverflow.com/questions/14088787/hostname-ip-doesnt-match-certificates-altname

转载注明原文:node.js – 主机名/ IP与证书的altname不匹配