Libgit2:SSH:无法交换加密密钥
Libgit2 : SSH : Unable to exchange encryption keys
背景
我正在编写一个基于 Linux 的应用程序 (gtkmm),它使用托管在 github 上的单个私有存储库。该应用程序正在使用 Libgit2
和 SSH Authentication
。
SSH 密钥是在外部创建的,在通过终端测试时工作正常。
我目前有两个很可能相关的问题。
问题 1:无法交换加密密钥。
尝试克隆私有存储库时出现此问题;并且是从 Libgit2 打印的错误。
我尝试使用 git_cred_ssh_key_new
和 git_cred_ssh_key_from_agent
但没有成功。
问题 2:从未调用凭据回调。
我已确保已为克隆选项、获取选项和远程回调设置了此(Credential
回调); git_clone()
正在使用。
里面有一个永远不会打印的 cout;与 GUI 相关的文本也是未设置的;所以我确定这永远不会被调用。
int repoManager_gitCredentialCallback(git_cred **out, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload){
cout << "Credentials Called" << endl;
string temp_publicKey = Global::programHomeDir + "/id_rsa.pub";
string temp_privateKey = Global::programHomeDir + "/id_rsa";
return git_cred_ssh_key_new( out, username_from_url, temp_publicKey.c_str(), temp_privateKey.c_str(), "" );
} // END - gitCredentialCallback
在克隆函数中:
// 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
(评论人数不足,所以希望这有帮助)
此错误通常意味着在设置 SSH 通道时存在协议级问题,这就是您无法发送凭据的原因(认为密码协商失败)。
了解 libssh2 使用的加密后端(我怀疑它是 OpenSSL)以及它的版本和后端版本会很有帮助。
请注意,libssh2 最近才获得对现在事实上的安全方法的支持(因此它在终端中工作的原因:您的客户端具有与服务器相同的受支持密码)。
背景
我正在编写一个基于 Linux 的应用程序 (gtkmm),它使用托管在 github 上的单个私有存储库。该应用程序正在使用 Libgit2
和 SSH Authentication
。
SSH 密钥是在外部创建的,在通过终端测试时工作正常。
我目前有两个很可能相关的问题。
问题 1:无法交换加密密钥。
尝试克隆私有存储库时出现此问题;并且是从 Libgit2 打印的错误。
我尝试使用 git_cred_ssh_key_new
和 git_cred_ssh_key_from_agent
但没有成功。
问题 2:从未调用凭据回调。
我已确保已为克隆选项、获取选项和远程回调设置了此(Credential
回调); git_clone()
正在使用。
里面有一个永远不会打印的 cout;与 GUI 相关的文本也是未设置的;所以我确定这永远不会被调用。
int repoManager_gitCredentialCallback(git_cred **out, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload){
cout << "Credentials Called" << endl;
string temp_publicKey = Global::programHomeDir + "/id_rsa.pub";
string temp_privateKey = Global::programHomeDir + "/id_rsa";
return git_cred_ssh_key_new( out, username_from_url, temp_publicKey.c_str(), temp_privateKey.c_str(), "" );
} // END - gitCredentialCallback
在克隆函数中:
// 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
(评论人数不足,所以希望这有帮助)
此错误通常意味着在设置 SSH 通道时存在协议级问题,这就是您无法发送凭据的原因(认为密码协商失败)。
了解 libssh2 使用的加密后端(我怀疑它是 OpenSSL)以及它的版本和后端版本会很有帮助。 请注意,libssh2 最近才获得对现在事实上的安全方法的支持(因此它在终端中工作的原因:您的客户端具有与服务器相同的受支持密码)。