在 RFC 标准中,公钥验证方式是唯一必须实现的验证方式(The only REQUIRED authentication)。所有实现都必须(MUST, RFC2119)支持这种方法。在 /etc/ssh/sshd_config 文件中使用 PubkeyAuthentication yes 开启公钥验证方式。
此验证方式需要用户先准备一个非对称加密的密钥对,将公钥保存至 SSH 服务器的 ~/.ssh/authorized_key 文件中。客户端登录时,在本地用私钥加密某个信息,并将结果发送给服务器,服务器将通过公钥验证收到的密文是否来自指定的用户。
私钥通常以加密的形式存储在客户主机上,用户必须在生成签名之前提供一个口令(passphrase)。 即使不是这样,签名操作也涉及一些昂贵的计算。 为了避免不必要的处理和用户互动,提供以下信息来查询使用 "公钥 "方法的认证是否可以接受。
C: byte SSH_MSG_USERAUTH_REQUEST
C: string user name in ISO-10646 UTF-8 encoding [RFC3629]
C: string service name in US-ASCII
C: string "publickey"
C: boolean FALSE
C: string public key algorithm name
C: string public key blob任何公钥算法都可以被提供给认证使用,如果请求中的算法不被服务器支持,它必须直接拒绝该请求。
服务器必须以 SSH_MSG_USERAUTH_FAILURE 或以下方式回应该消息。
S: byte SSH_MSG_USERAUTH_PK_OK
S: string public key algorithm name from the request
S: string public key blob from the request之后,客户端会使用私钥加密一个消息(消息的构成方式参见 RFC 4252),将结果发送给服务器。下面消息中的 signature 即为加密运算后的内容。
C: byte SSH_MSG_USERAUTH_REQUEST
C: string user name
C: string service name
C: string "publickey"
C: boolean TRUE
C: string public key algorithm name
C: string public key to be used for authentication
C: string signature使用公钥方式登录的优点是,密钥对基本不可能被写在纸上(密钥是很长的随机文本,社会工程攻击中只能通过更困难的间接方式窃取这么长的内容);在网络上传输、保存的通常是密钥对的公钥文件,而非私钥文件。
更加显而易见的好处是,私钥文件是保存在客户端的计算机上的。使用 SSH 命令时就无需再反复输入密码。因此网络上很多教程使用此方式作为免密码登录的方式。与此同时,因为需要预先将公钥放在服务器上(通常是通过网络上传),其也确实不便于配置。
交互式(keyboard-interactive)