所以,今天早些时候我遇到了一个问题,我的客户机是用node写的,因为我连接到的服务器使用了自签名证书,所以出现了呕吐.所以,我像任何不知情的开发人员一样,在tls.connect命令中添加了选项rejectUnauthorized: false.

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

更重要的是,那个服务器,你知道那个有自签名证书的吗?这里和那里之间的流真的加密了吗?

推荐答案

documentation中所述:

  • rejectUnauthorized:如果是true,则根据提供的CA列表验证服务器证书.如果验证失败,则发出error事件;err.code包含OpenSSL错误代码.默认值:true.

由于您使用的是自签名证书,显然与内置CA不匹配,因此默认情况下,连接将被拒绝,因为它无法验证服务器是他们所说的服务器.

设置为rejectUnauthorized: false表示"我不在乎是否无法验证服务器的身份."显然,这不是一个好的解决方案,因为它使您容易受到MITM攻击.

对于自签名证书,更好的解决方案是在连接客户端时为自定义CA设置适当的ca值.此外,请确保host值与服务器自签名证书的通用名称匹配.例如:

var socket = tls.connect({
  host: 'MyTLSServer',
  port: 1337,
  ca: [ fs.readFileSync('CA.pem') ],
}, function() {
  // Connected!
});

// ...

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

Node.js相关问答推荐

Express 4.18正文解析

Express无法发布

Sass-TypeError:无法读取未定义的属性(正在读取';indexOf';)

从mongodb集合中获取每分钟数据的每小时数据

Nest Js - 在 multer 拦截器中如何设置最大文件上传大小并进行可选文件上传

将 POST 的 json 变量格式化为 lambda

NodeJS:zlib.gzipSync 在不同平台上给出不同的明文输出

结合后端(Express)和前端(Angular)路由

将代码转换为 ES6 Discord.js 的问题

NodeJS 中的流 API 数据如何流动?

Node.js |如何在微服务之间转发标头?

即使部署成功,也不会触发 Firebase 函数来填充 Firestore 集合.为什么?

什么是nestjs错误处理方式(业务逻辑错误vs.http错误)?

如何在不全局安装的情况下在 Node REPL 中要求 node 模块?

使用 NodeJS 将新对象附加到 DynamoDB 中的 JSON 数组

Express.js:没有这样的文件或目录

PhoneGap/Cordova Android 开发

在 Node.js 中混合使用 JavaScript 和 TypeScript

Npm postinstall 仅用于开发

Node.js 中的 PHP exit()/die() 类似功能是什么