使用JGit克隆私有BitBucket仓库的认证问题及报错排查
先直接回答你的核心疑问:UsernamePasswordCredentialsProvider只适用于HTTPS协议的认证,SSH认证完全不需要它——这也是你当前代码出现Auth Fail的关键原因之一。下面我分两种主流认证方式详细拆解流程,重点解决你遇到的SSH认证问题。
一、HTTPS 认证(用UsernamePasswordCredentialsProvider的正确姿势)
如果你想用这个Provider,那得走HTTPS协议,而且现在BitBucket有个重要限制:
如果你开启了双因素认证(2FA),必须用App Password替代账号的原始登录密码;即使没开2FA,官方也推荐用App Password(更安全,权限可管控)。
具体步骤:
生成BitBucket App Password
登录BitBucket后,进入个人设置 → 找到「App passwords」→ 点击「Create app password」,给它分配至少Repository Read的权限,保存生成的密码(只显示一次,记得复制)。Java代码实现
import org.eclipse.jgit.api.CloneCommand; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; import java.io.File; public class BitBucketHttpsClone { public static void main(String[] args) throws Exception { CloneCommand cloneCommand = Git.cloneRepository() .setURI("https://bitbucket.org/your-username/your-repo-name.git") .setDirectory(new File("local-repo-directory")) .setCredentialsProvider(new UsernamePasswordCredentialsProvider( "your-bitbucket-username", // 你的BitBucket账号名,不是邮箱 "your-generated-app-password" // 刚才生成的App Password )); cloneCommand.call(); } }
二、SSH 认证(解决你当前的Auth Fail问题)
你的代码用了SSH协议但尝试密码登录,这是行不通的——BitBucket默认禁用了SSH密码登录(除非你特意在账号设置里开启,极度不推荐),官方要求用SSH密钥对认证。
解决步骤:
- 生成本地SSH密钥对
在终端执行命令(Windows用Git Bash或PowerShell):
ssh-keygen -t ed25519 -C "your-email@example.com"
一路回车即可(不需要设置passphrase,当然设置了更安全),生成的密钥默认在~/.ssh/id_ed25519(私钥)和~/.ssh/id_ed25519.pub(公钥)。
把公钥添加到BitBucket
登录BitBucket → 个人设置 → 「SSH keys」→ 点击「Add key」,复制id_ed25519.pub里的全部内容粘贴进去,保存即可。修改你的Java代码(密钥对版本)
不需要硬编码密码,直接加载本地私钥即可:
import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import org.eclipse.jgit.api.CloneCommand; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.transport.JschConfigSessionFactory; import org.eclipse.jgit.transport.SshTransport; import org.eclipse.jgit.transport.TransportConfigCallback; import org.eclipse.jgit.util.FS; import java.io.File; public class BitBucketSshClone { public static void main(String[] args) throws Exception { SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() { @Override protected void configure(com.jcraft.jsch.Host host, com.jcraft.jsch.Session session) { // 生产环境不建议关闭StrictHostKeyChecking,建议提前把bitbucket.org的主机密钥加到~/.ssh/known_hosts session.setConfig("StrictHostKeyChecking", "no"); } @Override protected JSch createDefaultJSch(FS fs) throws JSchException { JSch jsch = super.createDefaultJSch(fs); // 加载本地私钥,这里用默认路径,如果你改了密钥路径要对应修改 jsch.addIdentity(System.getProperty("user.home") + "/.ssh/id_ed25519"); // 如果你的密钥设置了passphrase,用这个重载方法: // jsch.addIdentity(System.getProperty("user.home") + "/.ssh/id_ed25519", "your-passphrase"); return jsch; } }; CloneCommand cloneCommand = Git.cloneRepository() .setURI("git@bitbucket.org:your-username/your-repo-name.git") .setDirectory(new File("local-repo-directory")) .setTransportConfigCallback(new TransportConfigCallback() { @Override public void configure(org.eclipse.jgit.transport.Transport transport) { SshTransport sshTransport = (SshTransport) transport; sshTransport.setSshSessionFactory(sshSessionFactory); } }); cloneCommand.call(); } }
为什么你的原代码会Auth Fail?
BitBucket的SSH服务器默认拒绝密码登录请求,哪怕你代码里设置了正确的密码,服务器端也会直接拒绝。只有在个人设置→Security里开启「SSH password authentication」(非常不推荐,风险高),密码登录才可能生效,但官方强烈建议用密钥对认证。
三、总结
- 用HTTPS:可以用
UsernamePasswordCredentialsProvider,但必须搭配App Password(2FA开启时强制要求) - 用SSH:不需要
UsernamePasswordCredentialsProvider,必须用SSH密钥对认证,密码登录基本不可行
内容的提问来源于stack exchange,提问作者alexanoid

