在密钥交换完成后,进入 SSH 验证协议阶段。这个阶段所有数据加密传输。
所有验证请求必须使用以下消息格式。只定义了前几个域,其余的域依赖于验证方法。
byte SSH_MSG_USERAUTH_REQUEST
string user name,采用 ISO-10646 UTF-8 编码[RFC3629]
string service name,采用 US-ASCII
string method name,采用 US-ASCII
.... 方法特有的域
user name: 用户名。
service name: 规定了验证完成后启动的服务。
method name: 验证方式名。
常用的验证方式有:
keyboard-interactive: 键盘交互验证。
publickey: 公钥认证。
gssapi-with-mic: gssapi 方式认证。
公钥认证方法
1. 客户端请求
客户端可先使用以下消息来询问使用 "publickey" 方法验证是否可被接受。
byte SSH_MSG_USERAUTH_REQUEST
string user name,采用 ISO-10646 UTF-8 编码[RFC3629]
string service name,US-ASCII 编码
string "publickey"
boolean FALSE
string public key algorithm name
string public key blob
public key algorithm name: 公钥算法名。
public key blob: 可包含证书。
2. 服务端响应
服务器必须以 SSH_MSG_USERAUTH_FAILURE 或 SSH_MSG_USERAUTH_PK_OK 进行应答。
1) 公钥算法不支持或者拒绝验证
任何公钥算法都可供用于验证。如果服务器不支持一些算法,它必须简单的拒绝请求。
如果服务器拒绝验证请求,它必须进行如下响应:
byte SSH_MSG_USERAUTH_FAILURE
name-list authentications that can continue
boolean partial success
authentications that can continue: 一个逗号分隔的名称列表,包含服务器认为可用的 'method name' 值。
partial success: 如果验证请求被成功的处理了,则 'partial success' 的值必须为 TRUE,表示需要更多的验证。如果请求没有被成功处理,该值必须为 FALSE。
2) 服务端支持该验证方式
如果服务器支持该公钥算法,则发送:
byte SSH_MSG_USERAUTH_PK_OK
string public key algorithm name from the request
string public key blob from the request
3. 客户端发送
要执行实际的验证,客户端可在其后发送一个用私钥生成的签名。
客户端也可直接发送签名,而不首先检验该密钥是否可接受。发送签名的数据包如下:
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
4. 服务端响应
当服务器接收到该消息,它必须检查提供的密钥是否可接受。如果是,还必须检查签名是否正确。如果两个检查都成功,则该方法成功。
服务器也可要求进一步验证。如果不需要更多的验证, 服务器必须以 SSH_MSG_USERAUTH_SUCCESS 响应。
byte SSH_MSG_USERAUTH_SUCCESS
如果请求失败或需要更多的验证,服务器必须以 SSH_MSG_USERAUTH_FAILURE 响应。
byte SSH_MSG_USERAUTH_FAILURE
name-list authentications that can continue
boolean partial success
参考文档
http://git.oschina.net/lowkey2046/libssh/tree/master/document