关闭 JGit 克隆命令的 SSL 验证

2024-01-10

我正在尝试通过以下方式克隆 Git 存储库CloneCommand。 有了这段代码

`Git.cloneRepository().setDirectory(new File(path)).setURI(url).call();`

远程存储库位于使用自签名证书的 GitBlit 实例上。 由于这些自签名证书,当执行克隆的获取部分时,我收到以下异常:

Caused by: java.security.cert.CertificateException: No name matching <hostName> found
    at sun.security.util.HostnameChecker.matchDNS(HostnameChecker.java:221)
    at sun.security.util.HostnameChecker.match(HostnameChecker.java:95)

虽然我可以创建一个新的TrustManager, 注册一个虚拟对象HostnameVerifier并创建并初始化一个SSLContext使用这个虚拟的TrustManager。 克隆完成后恢复所有这些。

然而,这意味着在同一时间启动的任何其他 SSL 连接都会将它们暴露给不安全的连接。

在已经克隆的存储库上,您可以将 http.sslVerify 设置为 false,并且 JGit 工作得很好。

有没有一种更清晰的方法可以告诉 JGit 将这个 http.sslVerify 设置为 false 进行克隆操作,就像我可以对已经克隆的存储库所做的那样。


在 4.9 版本中,JGit 将更加优雅地处理 SSL 验证。如果 SSL 握手不成功,JGit 会询问CredentialsProvider是否应跳过 SSL 验证。

在此过程中,CredentialsProvider被赋予InformationalMessage用文字描述问题,最多三个YesNoType CredentialItem决定是否跳过此操作、当前存储库的 SSL 验证和/或始终跳过。

似乎这一更改是考虑到交互式用户界面而做出的,并且可能很难以编程方式回答这些“凭据请求”。这提交此更改的消息 https://github.com/eclipse/jgit/commit/d946f95c9c06f27de8aac6ecc3f5d49eabe6e030更详细地描述行为。

如果您确定 SSL 验证是唯一的InformationalMessage将被发送,您可以应用中使用的技术这次测试 https://github.com/eclipse/jgit/commit/d946f95c9c06f27de8aac6ecc3f5d49eabe6e030#diff-766ab2d3dbe64615288f45e71568fc60b369410bd23e86f4b35893dd459637e8R111伴随着变化,并对所有此类问题盲目回答“是”。

对于早期版本的 JGit,或者如果CredentialsProvider模型不适合您的需求,有下面描述的两种解决方法。


要解决此限制,您可以手动执行特定的克隆步骤正如下面评论中所建议的:

  • 使用 InitCommand 初始化存储库
  • 将 ssl 验证设置为 false
    StoredConfig config = git.getRepository().getConfig();
    config.setBoolean( "http", null, "sslVerify", false );
    config.save();
  • 获取(请参阅 FetchCommand)
  • 结帐(请参阅结帐命令)

解决该问题的另一种方法是提供一个HttpConnectionFactory返回HttpConnection具有虚拟主机名和证书验证程序。例如:

class InsecureHttpConnectionFactory implements HttpConnectionFactory {

  @Override
  public HttpConnection create( URL url ) throws IOException {
    return create( url, null );
  }

  @Override
  public HttpConnection create( URL url, Proxy proxy ) throws IOException {
    HttpConnection connection = new JDKHttpConnectionFactory().create( url, proxy );
    HttpSupport.disableSslVerify( connection );
    return connection;
  }
}

HttpConnection在包装中org.eclipse.jgit.transport.http是 HTTP 连接的 JGit 抽象。虽然该示例使用默认实现(由 JDK http 代码支持),但您可以自由使用自己的实现或由org.eclipse.jgit.transport.http.apache使用 Apache http 组件的包。

当前使用的连接工厂可以更改为HttpTransport::setConnectionFactory():

HttpConnectionFactory preservedConnectionFactory = HttpTransport.getConnectionFactory();
HttpTransport.setConnectionFactory( new InsecureHttpConnectionFactory() );
// clone repository
HttpTransport.setConnectionFactory( preservedConnectionFactory );

不幸的是,连接工厂是一个单例,因此当并发执行 JGit 命令时,这个技巧需要额外的工作(例如,一个线程局部变量来控制 sslVerify 是打开还是关闭)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关闭 JGit 克隆命令的 SSL 验证 的相关文章

  • 如何在 JGit 中“git log --follow ”? (检索完整历史记录,包括重命名)

    我必须如何扩展以下 logCommand 才能获得 follow的选项git log命令工作 Git git new Git myRepository Iterable
  • JGit 克隆存储库

    我正在尝试使用 JGit 克隆 Git 存储库 但遇到 UnsupportedCredentialItem 问题 My code FileRepositoryBuilder builder new FileRepositoryBuilder
  • 从远程 git 存储库获取单个文件

    有没有一种方法可以在 Java 中以编程方式从远程 git 存储库下载单个文件 我更喜欢使用尽可能少的带宽的解决方案 最好只下载单个文件 我不需要浏览存储库 我已经有了文件的路径 我更喜欢不依赖于其他应用程序的解决方案 例如 在计算机上安装
  • 使用 JGit 与上次提交进行文件比较

    我正在尝试使用 JGit 来获取文件从上次提交到最近未提交更改的差异 我怎样才能用 JGit 做到这一点 使用命令行的输出是git diff HEAD 经过多次讨论 link1 link2 我附带了一段代码 能够找到未提交的文件 但我无法得
  • 如何在 jGit 中使用过滤器?

    我该如何使用RevFilter在 jGit 中吗 我找到了有关完成特定任务的问题的答案 获取两个日期之间所做的提交 答案是使用特定的子类RevFilter 但是 我不知道如何使用RevFilters 特别是 我想知道我需要做什么才能得到我链
  • 如何在 JGit 中编写 git log --stat 命令

    我有以下 git 命令 git log stat 1000 all gt gitstat log 在 JGit 中可以实现这一点吗 如果是 在 JGit 中编写此代码的等效方法是什么 为了访问存储库的历史记录 JGit 提供了RevWalk
  • Spring Cloud配置服务器git连接问题

    连接到存储配置的存储库时 我在 Spring 云配置服务器 Springboot 日志中看到问题 我不确定是否由于凭据或其他原因而无法克隆 不允许 git upload pack 任何对此的指示都会很棒 2021 10 06 22 52 5
  • 使用 JGit 获取所有分支

    如何使用 JGit 获取存储库中的所有分支 让我们来看一个示例存储库 https github com test kitchen test kitchen 正如我们所看到的 它有 5 个分支 Here https github com ce
  • eclipse:“重新索引存储库工作区”或“计算存储库工作区的 Git 状态”

    我正在使用 eclipse Juno 昨天我注意到我的计算机变得非常热 我检查了CPU使用率 发现它是100 Eclipse 是罪魁祸首 忙着 重新索引存储库工作区 半小时后还没完成 我的机器快要融化了 我搜索并发现了这些类似的问题 重新索
  • 如何使用 JGit 获取冲突行

    我正在开发使用 JGit 的应用程序 拉取后 我有冲突的文件 我可以从 List
  • 如何使用 jgit 进行相当于“git 远程更新”的操作?

    我正在管理使用 mirror 克隆的 git 存储库 并且我需要做一个git remote update使用 JGit 我是否使用 FetchCommand 还是有其他命令 等效的 FetchCommand 是什么git remote up
  • 使用 JGit 提交之间更改的文件列表

    我想在两次提交之间更改 添加 修改或删除 文件的路径 从命令行 我只需写 git diff name only abc123 def456 使用 JGit 执行此操作的等效方法是什么 您可以使用DiffFormatter得到一个列表Diff
  • 使用 JGit 确定前后提交的数量

    在 GitHub 项目中 当我们转到任何分支页面时 我们可以看到描述分支的提前 延迟提交编号的图表 掌握 我们如何使用 JGit 确定数字前面的数字 I used BranchTrackingStatus为此类 但我得到BranchTrac
  • 如何使用 JGit 找到分支的第一次提交?

    我想使用 Eclipse 的 JGit 库找到特定分支的第一个提交 例如 如果我有 master a c d e feature b f g h another j k l findBranchRoot is the magic metho
  • jgit 如何获取两个日期之间发生的所有提交

    或者只是两个日期之间发生的所有提交 在 SVN 中 你可以做类似的事情svn diff r date date 去做吧 你可以举这个例子JGit测试类RevWalkFilterTest java https github com eclip
  • 在jgit中配置known_hosts

    使用 jgit 和 gitolite 进行源代码控制 我有一个应用程序 可以根据命令生成某些代码 并且我们希望将其提交给源代码控制 目标是快速拉动 提交新代码 然后推送它 我有以下方法 private void commitToGitRep
  • Ref 对象的 getPeeledObjectId() 和 getObjectId() 有什么区别?

    我正在使用 jgit api 来实现项目的构建 部署功能 在本地机器中 我通过以下命令通过命令提示符提交了整个源代码 java项目 git add git commit a m Initial Source 这里我得到的提交 ID 为cb9
  • Java (JGIT) Files.delete() 删除文件失败,但 file.delete() 成功

    我正在使用 jgit 版本4 8 0 201706111038 r 并添加一个关闭钩子以在终止后删除临时目录 但是 关闭挂钩无法从内部删除某些文件 git子目录 尽管按照 jgit 的要求关闭了 Git 对象 但有趣的是 只有当我使用 Pa
  • 使用 JGit TreeWalk 列出文件和文件夹

    我想使用 JGit 显示头部修订的所有文件和文件夹的列表 我可以使用 TreeWalk 列出所有文件 但这不会列出文件夹 这是我到目前为止所拥有的 public class MainClass public static void main
  • 无法使用 File delete() 方法删除 git repo 中的 .pack 文件

    对于我正在编写的这个方法 我使用 jgit 库克隆一个 git 存储库 然后对这些文件执行一些操作 最后我想删除该存储库 我遇到的问题是 当我在 pack 文件 位于 git objects pack 中 上调用 delete 方法时 它无

随机推荐