TLS中的'rejectUnauthorized'对我来说具体意味着什么?

60

今天早些时候,我遇到了一个问题,我的客户端是用node编写的,在连接到的服务器使用自签名证书时出现了问题。因此,我添加了选项rejectUnauthorized: false来执行tls.connect命令,就像任何无意识的开发人员一样。

现在我的问题是,这对我意味着什么?我的TLS连接只是一个普通的TCP连接,也可能是一个TLS连接吗?将它写成TLS流是否完全没有用?

更重要的是,那个带有自签名证书的服务器,这里和那里之间的流是否实际上被加密了?

1个回答

86
根据文档,如果rejectUnauthorizedtrue,则会将服务器证书与提供的CA列表进行验证。如果验证失败,则会触发error事件;err.code包含OpenSSL错误代码。默认值为true
由于您正在使用自签名证书,显然内置CA列表中不会有匹配项,因此默认情况下会拒绝连接,因为它无法验证服务器是否是其所说的那个。
通过设置rejectUnauthorized: false,您表示“我不关心是否可以验证服务器的身份。”显然,这不是一个好的解决方案,因为它会使您易受中间人攻击。
针对自签名证书的更好解决方案是,在客户端连接时将适当的ca值设置为自定义CA。同时,确保您的host值与服务器自签名证书的通用名称匹配。例如:
var socket = tls.connect({
  host: 'MyTLSServer',
  port: 1337,
  ca: [ fs.readFileSync('CA.pem') ],
}, function() {
  // Connected!
});

// ...

无论您使用 rejectUnauthorized: false 还是设置 ca,连接都是加密的。


3
节点抛出错误: 'SELF SIGNED CERT IN CHAIN'。有没有更好的方法来解决自签名的问题?主机/CN可以是IP地址吗? - Breedly
我使用了“NODE_TLS_REJECT_UNAUTHORIZED=0”标志来处理它。这不是正确的做法,但适用于开发环境。 - Saranya Garimella
更好的方式和正确的方式已经包含在答案中。它是以“ca:”开头的那一行。 - Amit Naidu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接