带有 ssh public 密钥身份验证的服务器与 libssh
Server with ssh public key authentication with libssh
有人可以举例说明服务器使用 ssh public 密钥身份验证和 libssh 吗?我找到了这个 https://github.com/substack/libssh/blob/master/examples/samplesshd-tty.c,但它是密码验证。可能有人看到过这样的示例,但在 libssh 上使用 public 密钥身份验证。或者可能有人可以更改下面的代码来获取它。
我将此添加到开关(ssh_message_subtype(消息))
case SSH_AUTH_METHOD_PUBLICKEY:
printf("User %s wants to auth with key %s\n",
ssh_message_auth_user(message),
ssh_message_auth_pubkey(message));
if(authenticate_pubkey(session, message)){
ssh_message_auth_reply_success(message,0);
ssh_message_free(message);
return 1;
}
ssh_message_auth_set_methods(message,
SSH_AUTH_METHOD_PUBLICKEY);
// not authenticated, send default message
ssh_message_reply_default(message);
break;
还有这个
static int authenticate_pubkey(ssh_session session, ssh_message message)
{
int rc;
std::string us = ssh_message_auth_user(message);
rc = ssh_userauth_publickey_auto(session, ssh_message_auth_user(message), NULL);
if (rc == SSH_AUTH_ERROR)
{
fprintf(stderr, "Authentication failed: %s\n",
ssh_get_error(session));
return SSH_AUTH_ERROR;
}
return rc;
}
这并不难。但是我建议编写一个基于回调的 ssh 服务器。请参阅 libssh 源代码中的 samplesshd-cb.c 示例。
Public 密钥授权:
首先阅读 RFC 4252 第 7 节。它描述了 public 密钥验证的工作原理。回调为您提供 public 键并告诉您它是对 public 键的探测还是登录。
所以首先你必须阅读授权密钥。通常你有一个包含所有密钥的文件。您使用 ssh_pki_import_pubkey_base64() 读取密钥,然后调用 ssh_key_cmp() 将其与客户端发送的 public 密钥进行比较。如果它是一个探测,你 return 部分成功或身份验证成功,如果它是登录。
有人可以举例说明服务器使用 ssh public 密钥身份验证和 libssh 吗?我找到了这个 https://github.com/substack/libssh/blob/master/examples/samplesshd-tty.c,但它是密码验证。可能有人看到过这样的示例,但在 libssh 上使用 public 密钥身份验证。或者可能有人可以更改下面的代码来获取它。
我将此添加到开关(ssh_message_subtype(消息))
case SSH_AUTH_METHOD_PUBLICKEY:
printf("User %s wants to auth with key %s\n",
ssh_message_auth_user(message),
ssh_message_auth_pubkey(message));
if(authenticate_pubkey(session, message)){
ssh_message_auth_reply_success(message,0);
ssh_message_free(message);
return 1;
}
ssh_message_auth_set_methods(message,
SSH_AUTH_METHOD_PUBLICKEY);
// not authenticated, send default message
ssh_message_reply_default(message);
break;
还有这个
static int authenticate_pubkey(ssh_session session, ssh_message message)
{
int rc;
std::string us = ssh_message_auth_user(message);
rc = ssh_userauth_publickey_auto(session, ssh_message_auth_user(message), NULL);
if (rc == SSH_AUTH_ERROR)
{
fprintf(stderr, "Authentication failed: %s\n",
ssh_get_error(session));
return SSH_AUTH_ERROR;
}
return rc;
}
这并不难。但是我建议编写一个基于回调的 ssh 服务器。请参阅 libssh 源代码中的 samplesshd-cb.c 示例。
Public 密钥授权:
首先阅读 RFC 4252 第 7 节。它描述了 public 密钥验证的工作原理。回调为您提供 public 键并告诉您它是对 public 键的探测还是登录。
所以首先你必须阅读授权密钥。通常你有一个包含所有密钥的文件。您使用 ssh_pki_import_pubkey_base64() 读取密钥,然后调用 ssh_key_cmp() 将其与客户端发送的 public 密钥进行比较。如果它是一个探测,你 return 部分成功或身份验证成功,如果它是登录。