C++ Libgit2:SSH:无法交换加密密钥 背景

C++ Libgit2:SSH:无法交换加密密钥 背景,c++,credentials,libgit2,C++,Credentials,Libgit2,我正在编写一个基于Linux的应用程序(gtkmm),它使用一个托管在github上的私有存储库。应用程序正在使用Libgit2和SSH身份验证。 SSH密钥是在外部创建的,通过终端测试时可以正常工作 我目前有两个问题很可能相互关联 问题1:无法交换加密密钥。 尝试克隆专用存储库时发生此问题;并且是从Libgit2打印的错误。 我尝试使用来自代理的git\u cred\u ssh\u key\u new和git\u cred\u ssh\u key\u,但没有成功 问题2:从未调用凭据回调。 我

我正在编写一个基于Linux的应用程序(gtkmm),它使用一个托管在github上的私有存储库。应用程序正在使用
Libgit2
SSH身份验证
。 SSH密钥是在外部创建的,通过终端测试时可以正常工作

我目前有两个问题很可能相互关联

问题1:无法交换加密密钥。 尝试克隆专用存储库时发生此问题;并且是从Libgit2打印的错误。 我尝试使用来自代理的
git\u cred\u ssh\u key\u new
git\u cred\u ssh\u key\u,但没有成功

问题2:从未调用凭据回调。 我已确保已为克隆选项、获取选项和远程回调设置了此(
凭证
回调);并且正被
git\u clone()
使用。 这里面有一张从未印过的纸;as是与GUI相关的文本,也未设置;所以我决定这是永远不会被调用的

int repoManager\u gitCredentialCallback(git\u cred**out,const char*url,const char*username\u from\u url,未签名的int-allowed\u类型,void*payload){
cout(没有足够的评论代表,所以希望这是有帮助的)

此错误通常意味着在设置SSH通道时存在协议级问题,这就是您无法发送凭据的原因(想想密码协商失败)

了解libssh2使用的加密后端(我怀疑它是OpenSSL)以及它的版本和后端版本会很有帮助。
请注意,libssh2最近才获得了对某些事实上安全的方法的支持(因此它在终端中工作的原因是:您的客户端与服务器有一个共同的受支持密码).

您是否检查了远程创建回调是否正常工作?嘿!我不太确定您的意思?远程已经在git上创建了?除非您指的是
远程回调
;在闲聊之后,我成功地被调用了一次,然后出现了故障。@asandroq:对不起,我知道哪里出了问题!措辞和文档对新手不友好:P我没有设置“git\u remote\u create”在回调内部。但是,解决了这个问题后,我最初发布的问题仍然存在。加密密钥不会被交换,凭据回调也不会被调用。但是,你真的需要远程创建回调吗?不需要!只需事先确保远程不为null/空就足够了。嘿!谢谢提醒。这确实是一个很好的操作enSSL;在让libgit2使用SSH支持进行编译的过程中大放异彩。Synaptic说已经安装了libssh-4和libssh2。openssl版本是:1.0.2g-1ubuntu4.12我暂时搁置了让SSH工作;因为https和明文可以工作。您好!自从我提出这个问题以来,我的机器上有一些与SSH相关的库的更新问题,今天出于好奇,我又回到了我为SSH创建的git测试。它现在可以工作了!假设是因为更新了库。我已将您的答案标记为正确,因为它暗示了要解决的问题(如果您正在阅读问题并寻找答案,请更新您的库!)。谢谢!
// SET GIT OPTIONS:
git_clone_options repoManager_cloneOptions = GIT_CLONE_OPTIONS_INIT;
git_fetch_options repoManager_fetchOptions = GIT_FETCH_OPTIONS_INIT;
//  git_remote_callbacks repoManager_remoteCallbacks = GIT_REMOTE_CALLBACKS_INIT;
    
repoManager_cloneOptions.fetch_opts.callbacks.credentials = repoManager_gitCredentialCallback;
repoManager_cloneOptions.fetch_opts.callbacks.transfer_progress = repoManager_fetchProgress;
repoManager_cloneOptions.fetch_opts.callbacks.payload = this;
repoManager_cloneOptions.remote_cb = repoManager_gitRemoteCallback;

//  repoManager_remoteCallbacks.credentials = repoManager_gitCredentialCallback;
//  repoManager_cloneOptions.fetch_opts = repoManager_fetchOptions;

repoManager_fetchOptions.callbacks.transfer_progress = repoManager_fetchProgress;
repoManager_fetchOptions.callbacks.credentials = repoManager_gitCredentialCallback;
repoManager_fetchOptions.callbacks.payload = this;
repoManager_fetchOptions.download_tags = GIT_REMOTE_DOWNLOAD_TAGS_ALL;


if(git_clone(&repoManager_repo, repoManager_RepoURL, Global::launcherRepositoryDir.c_str(), &repoManager_cloneOptions) < 0){
    RepoManager_thread_taskFailed("Failed to Clone the repository.", "FAIL: Clone failed.");
    return;
} // END - Git Clone