公钥认证

问题描述

我一直在设计基于区块链的加密货币,区块链上的某些区块可以由区块所有者更新其数据。我尝试实现ssh风格的公钥身份验证:客户端生成一个密钥对,并将公钥发送到该块,在该块中,它允许“管理员”下列出的公钥更改该块的元数据。这样做的问题是,有人可以发送随机的已知公钥以查看是否允许他们编辑元数据,ssh如何防止人们仅仅发送带有已知公钥的某种字符串来访问ssh的内容? (之所以这样问,是因为我想实现与我的上下文类似的东西)

解决方法

不确定这是否真的是编程问题,但是:

SSH使用公钥密钥始终对“主机”(服务器)和(可选)(但经常)“用户”(客户端)进行身份验证。对于后一种情况,常用且事实上的标准实现OpenSSH为服务器上的每个用户使用一个文件,该文件通常位于用户的主目录下,名为$HOME/.ssh/authorized_keys,其中列出了对该用户有效的公钥。如果客户端进程指定了用户名和该用户的authorized_keys文件中列出的公钥,并使用私钥对某些数据进行签名,包括连接秘密和随机数,则该数据被视为证明用户的身份。 (有关详细信息,请参阅RFC 4252,但对于上下文,请以4253开头。)其他实现也需要具有等效的数据,尽管不一定是确切的文件。主机/服务器通常允许用户/客户端进行多次尝试,以防它具有多个密钥和/或其他尝试方法,但这是可配置的。

SSH本身通常无法控制访问;它只是将用户/客户端的身份建立为在“主机”上配置的用户名。使用该身份控制访问权限(安全人员称之为授权而不是身份验证和身份验证)取决于主机。 许多 SSH主机是Unix,而对于Unix ,相同的规则适用于通过SSH访问Unix,也适用于其他类型的连接:这始于经典的“ chmod位”每个允许对用户,组,其他执行读取,写入,执行的文件,并且可以包括其他内容,例如ACL,SELinux属性,sudo规则,信令进程的组匹配,某些内容(例如NFS)的特殊配置等等。如果SSH主机/服务器不是Unix,则在连接并对其进行身份验证后将应用哪些安全规则或策略,取决于它,并且可能会大不相同。

OpenSSH(在Unix主机上)还实现了authorized_keys文件中的一些选项,这些选项对客户端(通过该连接)可以执行的操作施加其他限制;在您的系统or here under AUTHORIZED_KEYS FILE FORMAT上查看man sshd。此外,如此处所述,OpenSSH支持间接级别:与其直接列出每个适用用户的authorized_keys文件中的每个密钥,您可以使用(指定的)“ CA”密钥对其他密钥进行签名,然后配置authorized_keys以接受任何密钥由列出的CA密钥签名。这些证书本身可能会包含一些限制。参见man ssh-keygen under CERTIFICATES。在具有许多用户,主机或两者的大型环境中,这可能会更加方便。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...