2016-12-28 56 views
4

有一些麻烦,使用与SshUserKeyCredentials验证libgit2sharp-SSH SshUserKeyCredentials认证:麻烦与libgit2sharp-SSH

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

我发现SshUserKeyCredentials对象通过源代码浏览,所以我的第一个问题是,如果有可能使用这个对象来从gitlab部署基于结算的签出?

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

我结束了错误:

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

如果这种方式是不应该的工作是有使用部署键以编程方式管理从C#环境的git的另一种方式?

回答

1

我能够通过反复试验和冲刷网络来弄清以下几点。

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

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

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

  4. 公钥必须是单行,从type开始,接着是base64 key,最后没有注释(这是PuttyGen上的公钥文本框中显示的格式,除非要删除注释) ,例如

    ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAoblahblahblahblahblah

我添加的用户名git因为这是到位桶需要。不知道你需要那个,但它不能是null,做string.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