使用libgit2sharp-SSH中的SshUserKeyCredentials进行身份验证时遇到问题

时间:2016-12-28 12:56:37

标签: c# libgit2sharp libssh2 libgit2sharp-ssh

使用libgit2sharp-SSH对SshUserKeyCredentials进行身份验证时遇到一些问题:

var co = new CloneOptions();
co.CredentialsProvider = (_url, _user, _cred) => new SshUserKeyCredentials { PrivateKey="C:\\path\\to\\private_key" };
Repository.Clone("git@... .repository.git", path, co);

我发现SshUserKeyCredentials对象浏览源代码,所以我的第一个问题是,是否可以使用此对象从gitlab部署基于密钥的签出?

该对象似乎需要PrivateKey,Username,PublicKey和Passphrase的任意组合。我目前正在使用PrivateKey。

我最终得到的错误:

{"Failed to start SSH session: Unable to exchange encryption keys"}

如果这种方式不起作用,是否有另一种方法可以使用部署密钥以编程方式管理来自C#环境的git?

1 个答案:

答案 0 :(得分:1)

我能够通过反复试验和搜索网络来弄清楚以下内容。

  1. 任何字段都不能有null;使用string.Empty

  2. 公共 私钥必须以正确的格式提供

  3. 私钥必须采用PEM格式(使用PuttyGen转换菜单=>导出OpenSSH或使用openssl rsa -in id_rsa -out id_rsa.pem)。

  4. 公钥必须是单行,以type开头,后跟base64键,最后没有注释(这是PuttyGen上公钥文本框中显示的格式,除非您必须删除注释),例如

    ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAoblahblahblahblahblah

  5. 我添加了用户名git,因为这就是Bitbucket所需要的。不确定是否需要,但不能nullstring.Empty

    示例:

    CredentialsHandler handler = (_url, _user, _cred) => new SshUserKeyCredentials
                        {
                            PrivateKey = @"C:\Users\blah\.ssh\keys\bitbucket.pem",
                            Username = "git",
                            Passphrase = string.Empty,
                            PublicKey = @"C:\Users\blah\.ssh\keys\bitbucket.pub"
                        }
    

    另见: PHP ssh2_auth_pubkey_file(): Authentication failed using public key: Invalid key data, not base64 encoded