Отключить проверку SSL для команды клонирования JGit

Я пытаюсь клонировать репозиторий 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 и создать и init a SSLContext который использует этот манекен TrustManager. И после того, как клон сделал все это.

однако это будет означать, что любое другое SSL-соединение, инициированное в то же время, подвергнет их незащищенным соединениям.

на уже клонированном РЕПО вы можете установить http.sslVerify для false и JGit работает отлично.

есть ли более чистый способ, которым я мог бы сказать JGit установить этот http.sslVerify в false для действия клонирования, как я могу сделать для уже клонированного РЕПО.

2 ответов


С версией 4.9 JGit будет обрабатывать проверку SSL более изящно. Если SSL рукопожатие было неудачным, JGit спросит CredentialsProvider следует ли пропустить проверку SSL или нет.

в этом процессе CredentialsProvider дано InformationalMessage описание проблемы текстуально и до трех YesNoType CredentialItems, чтобы решить, следует ли пропустить проверку SSL для этой операции, для текущего репозитория, и/или всегда.

кажется, что изменение было сделано с интерактивный пользовательский интерфейс в виду, и может быть трудно ответить на эти "запросы учетных данных" программно.

на сообщение об этом изменении описывает поведение более подробно.

для более ранних версий JGit, или если CredentialsProvider модель не соответствует вашим потребностям, есть два описанных ниже.


чтобы обойти это ограничение, вы можете выполните определенные шаги клонирования вручную как предложил в комментариях ниже:

  • init репозиторий с помощью InitCommand
  • установите ssl verify в false
    StoredConfig config = git.getRepository().getConfig();
    config.setBoolean( "http", null, "sslVerify", false );
    config.save();
  • fetch (см. FetchCommand)
  • проверка (см. CheckoutCommand)

другой способ обойти эту проблему-это предоставить HttpConnectionFactory возвращает HttpConnections с фиктивным именем хоста и верификаторами сертификатов. Для пример:

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 и является абстракцией JGit для HTTP-соединений. В то время как пример использует реализацию по умолчанию (поддерживаемую кодом http JDK), вы можете использовать свою собственную реализацию или ту, которая предоставляется org.eclipse.jgit.transport.http.apache пакет, использующий http-компоненты Apache.

используемая в настоящее время фабрика соединений может быть изменена с помощью HttpTransport::setConnectionFactory():

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

к сожалению, фабрика соединений является одноэлементной, так что этот трюк требует дополнительной работы (например, локальная переменная потока для управления, если sslVerify включен или выключен), когда команды JGit выполняются одновременно.


другой обходной путь-создать в доме текущего пользователя перед вызовом Git.cloneRepository():

File file = new File(System.getProperty("user.home")+"/.gitconfig");
if(!file.exists()) {
    PrintWriter writer = new PrintWriter(file);
    writer.println("[http]");
    writer.println("sslverify = false");
    writer.close();
}

Это заставит JGit пропустить проверку сертификата SSL.