我有一个中央 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/