7. Public Key Authentication Method: "publickey" (公钥认证方法: "publickey")
唯一必需的认证 'method name' 是 "publickey" 认证。所有实现必须支持此方法, 但是, 并非所有用户都需要拥有公钥, 并且大多数本地策略在不久的将来不太可能要求所有用户进行公钥认证。
使用此方法, 拥有私钥就是认证。此方法通过发送使用用户私钥创建的签名来工作。服务器必须检查密钥是否是用户的有效认证器, 并且必须检查签名是否有效。如果两者都成立, 则必须接受认证请求, 否则必须拒绝。请注意, 服务器可能在成功认证后需要额外的认证。
私钥通常以加密形式存储在客户端主机上, 用户必须在生成签名之前提供密码。即使它们不是, 签名操作也涉及一些昂贵的计算。为了避免不必要的处理和用户交互, 提供了以下消息用于查询使用 'public key algorithm' 的认证是否可接受。
byte SSH_MSG_USERAUTH_REQUEST
string user name in ISO-10646 UTF-8 encoding [RFC3629]
string service name in US-ASCII
string "publickey"
boolean FALSE
string public key algorithm name
string public key blob
公钥算法在传输层规范 [SSH-TRANS] 中定义。'public key blob' 可能包含证书。
任何公钥算法都可以提供用于认证。特别是, 该列表不受密钥交换期间协商的内容的约束。如果服务器不支持某些算法, 它必须简单地拒绝请求。
服务器必须使用 SSH_MSG_USERAUTH_FAILURE 或以下消息响应此消息:
byte SSH_MSG_USERAUTH_PK_OK
string public key algorithm name from the request
string public key blob from the request
要执行实际认证, 客户端然后可以发送使用私钥生成的签名。客户端可以在不首先验证密钥是否可接受的情况下直接发送签名。使用以下数据包发送签名:
byte SSH_MSG_USERAUTH_REQUEST
string user name
string service name
string "publickey"
boolean TRUE
string public key algorithm name
string public key to be used for authentication
string signature
'signature' 的值是相应私钥对以下数据按此顺序的签名:
string session identifier
byte SSH_MSG_USERAUTH_REQUEST
string user name
string service name
string "publickey"
boolean TRUE
string public key algorithm name
string public key to be used for authentication
当服务器收到此消息时, 它必须检查提供的密钥是否可用于认证, 如果是, 它必须检查签名是否正确。
如果两个检查都成功, 则此方法成功。请注意, 服务器可能需要额外的认证。服务器必须响应 SSH_MSG_USERAUTH_SUCCESS (如果不需要更多认证), 或 SSH_MSG_USERAUTH_FAILURE (如果请求失败, 或需要更多认证)。
"publickey" 认证方法使用以下特定于方法的消息编号。
SSH_MSG_USERAUTH_PK_OK 60