javascript - Node.js:使用唯一的公钥对客户端进行身份验证(类似于 Github SSH key 身份验证)

标签 javascript node.js authentication ssl ssl-certificate

我有一个中央 Web 服务器 (Node.js),还有几台客户端计算机(也运行 Node)。这些客户端将把数据推送到网络服务器中,因此,为了安全起见,客户端最初将在主服务器上注册 - 生成自己唯一的 SSL 私钥/公钥并将公钥存储在服务器上。

现在,注册后,每次客户端尝试与服务器通信时,都需要提供其公钥(?)来验证自己的身份。

我正在尝试了解如何解决这个问题。我应该将客户端的所有公钥的内容存储在常规数据库集合中吗?

我如何真正让客户“出示”他们的证书及其数据?我见过一些像client-certificate-auth这样的包但我认为这对我的用例没有帮助。

编辑:我忘了提及,我将通过 HTTPS(端口 443)进行通信,因此我认为这可以解决实际的安全部分。我只是想确保没有恶意的、未注册的客户端使用 pub/private 加密/SSL 证书将数据推送到服务器。

最佳答案

如果您要走这条路,请使用 Subtle Crypto API 。最有可能的是,您不应该这样做。

您希望 JavaScript 中生成的私钥在客户端保密,而公钥则安全地发送并存储在服务器上。

在身份验证过程中,客户端通过与其公钥关联的一些唯一标识符来说明其公钥是什么,例如id 或常用名或用户名。

然后,服务器使用客户端的公钥加密的消息有效负载发出质询。

用户使用他的私钥解密消息,然后使用正确的解密响应进行响应。

这不提供安全性,您必须通过已建立的 SSL 连接来执行此操作。

它是传统 cookie 和 session token 的替代方案,只是不同、更难,而不是更好。

私钥在任何时候都不会到达服务器。客户端不使用其私钥进行加密,这不是公钥加密的工作原理。

但是它可以发送数字签名,并且服务器可以验证这一点。这是唯一标识符的替代方案;确保您指定一个真实且足够长的随机数来进行签名。

要执行数字签名质询,服务器会向客户端发送质询字符串,客户端使用其私钥对质询进行签名并响应服务器,然后服务器使用公钥公钥必须是签名的一部分,并且服务器必须知道信任公钥,因此它必须有一种方法来查找它快点。

另一种选择是依靠用户的知识来设置自己的客户端证书,在这种情况下,Paul 的答案中提到的 passport-client-cert 可以处理这个问题。

关于javascript - Node.js:使用唯一的公钥对客户端进行身份验证(类似于 Github SSH key 身份验证),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39760798/

相关文章:

node.js - 如何使用 MSVC10 编译器在 x64 窗口的 Node Canvas 中启用 jpeg 支持?

angularjs - 未捕获( promise ): Login providers not ready yet. 您的控制台上是否有错误?

JavaMail 通过 vps 发送电子邮件,不需要身份验证,但得到 AuthenticationFailedException - 为什么?

javascript - JQuery AJAX URL 本地或绝对

javascript - 如何创建浏览器插件?

javascript - 嵌套表单上的提交按钮在 IE7 中提交外部表单

javascript - Node Express.js 更改所提供文件的路径

node.js - 使用 dynamoose.js 时如何避免将 aws config 设置为外部环境变量

javascript - 如何检查给定的单词是否包含在字符串中?

node.js - 对 nodejs 应用程序使用 firebase 身份验证