如何生成SSH代理签名响应

2024-10-04 05:20:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个内部管理系统,它还需要实现SSH代理。到目前为止,我已经正确地实现了SSH_AGENTC_REQUEST_IDENTITIESSSH_AGENT_IDENTITIES_ANSWER,这使得SSH随后按照https://tools.ietf.org/id/draft-miller-ssh-agent-00.html发送{}

我要解决的问题是如何签署请求,此时我只需要支持ssh-rsa。我已经尝试按照https://tools.ietf.org/html/rfc4253实现这一点,但是我似乎无法生成一个将进行身份验证的回复。在

根据我对本规范的理解,SSH_AGENTC_SIGN_REQUEST消息的整个数据部分需要使用RSASSA-PKCS1-v1_5进行签名

这里是接收请求的代码

if msgType == SSH_AGENTC_SIGN_REQUEST:
  blobLen = struct.unpack('!I', sock.recv(4))[0]
  blob    = sock.recv(blobLen)
  dataLen = struct.unpack('!I', sock.recv(4))[0]
  data    = sock.recv(dataLen)
  flags   = struct.unpack('!I', sock.recv(4))[0]

  print("blob: %s\ndata: %s\n flags: %d" % (blob, data, flags))

  if base64.b64decode(server["public_key"]) != blob:
    sock.sendall(struct.pack('!IB', 1, SSH_AGENT_FAILURE))
    continue

  signed = rpc.root.signSSHData(server_id, data)
  if not signed:
    sock.sendall(struct.pack('!IB', 1, SSH_AGENT_FAILURE))
    continue

  buff = bytearray()
  buff.extend(struct.pack('!B', SSH_AGENT_SIGN_RESPONSE))
  packBytes(buff, bytes("ssh-rsa", "UTF-8"))
  packBytes(buff, signed)
  head = struct.pack('!I', len(buff))

  sock.sendall(head);
  sock.sendall(buff);

以下是rpc.root.signSSHData的来源:

^{pr2}$

更新1:我相信我已经知道了,似乎data是RFC4252中定义的SSH_MSG_USERAUTH_REQUEST。我会更新我的应用程序,看看它如何进行。在


Tags: dataifrequestsshblobstructpackbuff
1条回答
网友
1楼 · 发布于 2024-10-04 05:20:51

我找到了解决方案,回复格式不正确,下面是更正的代码:

if msgType == SSH_AGENTC_SIGN_REQUEST:
  blobLen = struct.unpack('!I', sock.recv(4))[0]
  blob    = sock.recv(blobLen)
  dataLen = struct.unpack('!I', sock.recv(4))[0]
  data    = sock.recv(dataLen)
  flags   = struct.unpack('!I', sock.recv(4))[0]

  if base64.b64decode(server["public_key"]) != blob:
    sock.sendall(struct.pack('!IB', 1, SSH_AGENT_FAILURE))
    continue

  sig = rpc.root.signSSHData(server_id, data);
  if not sig:
    sock.sendall(struct.pack('!IB', 1, SSH_AGENT_FAILURE))
    continue

  signature = bytearray()
  packBytes(signature, bytes("ssh-rsa", "UTF-8"))
  packBytes(signature, sig)

  buff = bytearray()
  buff.extend(struct.pack('!B', SSH_AGENT_SIGN_RESPONSE))
  packBytes(buff, signature)
  head = struct.pack('!I', len(buff))

  sock.sendall(head);
  sock.sendall(buff);
  continue

相关问题 更多 >