千年之恋
RFC 4252 SSH认证协议

RFC 4252 SSH认证协议

RFC 4252 SSH认证协议

认证协议框架

由服务端告诉客户端哪些认证方法可以用来认证。客户端有自由尝试服务端列出的所有方法。认证方法用它们的名称来标识,并且不允许使用”none”认证方法。

服务端应该有认证超时机制,推荐超时时间为10分钟。此外。服务器应该限制错误认证次数,推荐超过20次认证失败就断开连接。

认证请求

请求报文

byte SSH_MSG_USERAUTH_REQUEST
string user name in ISO-10646 UTF-8 encoding [RFC3629]
string service name in US-ASCII
string method name in US-ASCII
…. method specific fields

user name 和 service name在每个认证请求中都存在,且有可能改变。如果不能完成认证请求,则服务端应该在user name 或者 service name改变的时候断开连接。

service name 指明认证之后采用的服务。如果服务器端该服务不可用,则服务端需要断开连接。如果服务不可用,则禁止进行用户认证。

服务器对于任何不理解的请求应该直接拒绝。

当客户端发送新的SSH_MSG_USERAUTH_REQUEST请求时,必须抛弃之前的SSH_MSG_USERAUTH_REQUEST

method name remark
“publickey” REQUIRED
“password” OPTIONAL
“hostbased” OPTIONAL
“none” NOT RECOMMENDED

method name 定义值

服务端接收和拒绝报文

若服务器拒绝认证请求,则必须发送如下报文

byte SSH_MSG_USERAUTH_FAILURE
name-list authentications that can continue
boolean partial success

‘authentications that can continue’是一个逗号分割的method name列表。

认证请求处理成功则设置partial success为true,否则设置为false.

若服务器接收认证请求,则必须发送如下报文:

byte SSH_MSG_USERAUTH_SUCCESS

none认证

客户端可以发送none认证方法到服务端来请求认证方法列表。若服务端无需认证,则服务端必须接收请求并返回认证成功报文,否则服务端返回认证失败并返回认证方法列表。

认证完成

在发送SSH_MSG_USERAUTH_SUCCESS报文后,认证过程结束。在这之后接收到的认证报文都应该忽略。

Banner消息

在认证开始到认证结束之前,可以发送SSH_MSG_USERAUTH_BANNER消息。报文结构如下:

byte SSH_MSG_USERAUTH_BANNER
string message in ISO-10646 UTF-8 encoding [RFC3629]
string language tag [RFC3066]

客户端应该显示Banner消息,但是也可以显式禁止。message可以多行,使用CRLF隔开。

认证协议编码

命名 编码
SSH_MSG_USERAUTH_REQUEST 50
SSH_MSG_USERAUTH_FAILURE 51
SSH_MSG_USERAUTH_SUCCESS 52
SSH_MSG_USERAUTH_BANNER 53

“publickey”认证方法

publickey是必须实现的认证方法。客户端发送使用私钥创造的签名到服务端,服务端必须检查私钥是否是来自用户,签名是否合法。

请求报文结构如下:

byte SSH_MSG_USERAUTH_REQUEST
string user name in ISO-10646 UTF-8 encoding [RFC3629]
string service name in US-ASCII
string “publickey”
boolea FALSE
string public key algorithm name
string 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

“password”密码认证

报文结构:

byte SSH_MSG_USERAUTH_REQUEST
string user name
string service name
string “password”
boolean FALSE
string plaintext password in ISO-10646 UTF-8 encoding [RFC3629]

注意’plaintext password’需要使用iso-10646 utf-8编码格式。如果客户端读取到其他编码格式的密码(比如 ISO 8859-1 - ISO Latin1),则客户端必须转化为utf-8编码格式再传输。

如果服务端发现密码过期了,需要修改密码,则可以发送如下报文:

byte SSH_MSG_USERAUTH_PASSWD_CHANGEREQ
string prompt in ISO-10646 UTF-8 encoding [RFC3629]
string language tag [RFC3066]

客户端可以尝试其他认证方法,或者使用下列报文结构回应。客户端也可以直接发送此报文而不用服务器来询问。

byte SSH_MSG_USERAUTH_REQUEST
string user name
string service name
string “password”
boolean TRUE
string plaintext old password in ISO-10646 UTF-8 encoding [RFC3629]
string plaintext new password in ISO-10646 UTF-8 encoding [RFC3629]

服务器的回应必须是SSH_MSG_USERAUTH_SUCCESS,SSH_MSG_USERAUTH_FAILURE或者SSH_MSG_USERAUTH_PASSWD_CHANGEREQ

响应消息 含义
SSH_MSG_USERAUTH_SUCCESS 密码已经改变或者认证成功
SSH_MSG_USERAUTH_FAILURE with partial success 密码已经改变,但是需要进一步认证
SSH_MSG_USERAUTH_FAILURE without partial success 密码没有改变。要么修改密码不被支持,要么旧密码错误。如果服务端发送了SSH_MSG_USERAUTH_PASSWD_CHANGEREQ报文,则说明服务端时支持修改密码的
SSH_MSG_USERAUTH_CHANGEREQ 密码没有改变.因为新密码不被接受(例如密码强度不够)

“hostbased”加密方法

客户端发送如下报文:

byte SSH_MSG_USERAUTH_REQUEST
string user name
string service name
string “hostbased”
string public key algorithm for host key
string public host key and certificates for client host
string client host name expressed as the FQDN in US-ASCII
string user name on the client host in ISO-10646 UTF-8 encoding[RFC3629]
string signature

signature是以下数据按照以下顺序的摘要

string session identifier
byte SSH_MSG_USERAUTH_REQUEST
string user name
string service name
string “hostbased”
string public key algorithm for host key
string public host key and certificates for client host
string client host name expressed as the FQDN in US-ASCII
string user name on the client host in ISO-10646 UTF-8 encoding [RFC3629]

服务端必须校验host key是否属于客户端,是否允许该客户端登录以及摘要signature是否正确。