Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C libssh2公钥身份验证仅在接受密钥请求时需要密码短语_C_Ssh_Libssh2 - Fatal编程技术网

C libssh2公钥身份验证仅在接受密钥请求时需要密码短语

C libssh2公钥身份验证仅在接受密钥请求时需要密码短语,c,ssh,libssh2,C,Ssh,Libssh2,我正在使用libssh2使网络程序更加安全 我希望我的程序以尽可能类似于OpenSSH客户端ssh(1)的方式进行身份验证。OpenSSH客户机将只请求服务器实际接受的密钥的密码短语 我从中了解到,ssh客户端发送使用公钥的请求,如果被接受,它可以使用密码短语解锁私钥 libssh2提供了一个函数,该函数接受私钥和公钥文件名以及密码短语。使用此函数非常简单,但这意味着我必须获取私钥的密码短语,即使服务器最初不接受公钥。对于拥有大量不同密钥的用户来说,这显然是一个问题(我的程序目前正在迭代~/.s

我正在使用
libssh2
使网络程序更加安全

我希望我的程序以尽可能类似于OpenSSH客户端ssh(1)的方式进行身份验证。OpenSSH客户机将只请求服务器实际接受的密钥的密码短语

我从中了解到,ssh客户端发送使用公钥的请求,如果被接受,它可以使用密码短语解锁私钥

libssh2提供了一个函数,该函数接受私钥和公钥文件名以及密码短语。使用此函数非常简单,但这意味着我必须获取私钥的密码短语,即使服务器最初不接受公钥。对于拥有大量不同密钥的用户来说,这显然是一个问题(我的程序目前正在迭代~/.ssh目录中的密钥文件)

我已经尝试阅读了
libssh2
函数的手册页,如果没有对ssh协议的更详细的了解,大多数手册页看起来都太简短,我无法理解。事实上,我甚至还没有写过


有谁能告诉我如何使用
libssh2
仅提示ssh服务器实际接受的密钥的密码短语吗?

在RTFM和进行一些测试后,我发现
libssh2\u userauth\u publickey\u fromfile
将返回不同的错误代码,这取决于服务器是否接受密钥,或者密码短语不正确

因此,这是一个非常低效的解决方案(因为它调用
libssh2\u userauth\u publickey\u fromfile
,因此协议的所有密钥交换部分至少调用了两次)

int-nattests=3;//用户尝试输入密码短语的次数
//尝试使用空密码短语进行身份验证
int err=libssh2\u userauth\u publickey\u fromfile(session,user,pub,priv,“”);
如果(错误==0)
{
fprintf(stderr,“您不应该使用带有空密码短语的密钥!\n”);
}
else if(err==LIBSSH2\u错误\u公钥\u未验证)
{
//如果我们到了这里,就意味着公钥最初被接受了
//但是私钥有一个非空的密码短语
charp[BUFSIZ];
for(int i=0;i
为完整起见,
get_passphrase
函数使用解决方案提示用户输入密码短语

int nAttempts = 3; // number of attempts the user gets at entering the passphrase

// Try authenticating with an empty passphrase
int err = libssh2_userauth_publickey_fromfile(session, user, pub, priv,"");
if (err == 0)
{
    fprintf(stderr, "You shouldn't use keys with an empty passphrase!\n");
}
else if (err == LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED)
{
    // if we get here it means the public key was initially accepted
    // but the private key has a non-empty passphrase
    char p[BUFSIZ];

    for (int i = 0; i < nAttempts; ++i)
    {
         get_passphrase(p); // assume this gets the passphrase
         err = libssh2_userauth_publickey_fromfile(session, user, pub, priv,p);
         if (err != LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED) break;
    }
}

if (err != 0)
{
    fprintf(stderr, "Authentication using key %s failed!\n", priv);
}