在 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 是打开还是关闭)。