Utilisation de clés avec JGit pour accéder à un référentiel Git en toute sécurité
Je suis en utilisant JGit pour accéder à une distance repo Git, et j'ai besoin d'utiliser SSH. JGit utilise JSch de fournir un accès sécurisé. Cependant, je ne suis pas sûr de la façon de définir le fichier de clé et le sait fichier hosts pour JGit. Ce que j'ai essayé est comme suit.
Créé une configuration personnalisée de la SshSessionFactoryà l'aide de sous-classement par JSchConfigSessionFactory:
public class CustomJschConfigSessionFactory extends JschConfigSessionFactory {
@Override
protected void configure(OpenSshConfig.Host host, Session session) {
session.setConfig("StrictHostKeyChecking", "yes");
}
}
Dans la classe qui ai-je accès à distance repo Git, n'suivantes:
CustomJschConfigSessionFactory jschConfigSessionFactory = new CustomJschConfigSessionFactory();
JSch jsch = new JSch();
try {
jsch.addIdentity(".ssh/id_rsa");
jsch.setKnownHosts(".ssh/known_hosts");
} catch (JSchException e) {
e.printStackTrace();
}
SshSessionFactory.setInstance(jschConfigSessionFactory);
Je ne peux pas comprendre comment l'associer JSch objet avec JGit de sorte qu'il peut se connecter avec succès le dépôt distant. Quand j'essaie de le cloner avec JGit, j'obtiens l'exception suivante:
org.eclipse.jgit.api.errors.TransportException: [email protected]:abc.org/test_repo.git: reject HostKey: git.test.com
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:137)
at org.eclipse.jgit.api.CloneCommand.fetch(CloneCommand.java:178)
at org.eclipse.jgit.api.CloneCommand.call(CloneCommand.java:125)
at GitTest.cloneRepo(GitTest.java:109)
at GitTest.main(GitTest.java:223)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: org.eclipse.jgit.errors.TransportException: [email protected]:abc.org/test_repo.git: reject HostKey: git.test.com
at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:142)
at org.eclipse.jgit.transport.SshTransport.getSession(SshTransport.java:121)
at org.eclipse.jgit.transport.TransportGitSsh$SshFetchConnection.<init>(TransportGitSsh.java:248)
at org.eclipse.jgit.transport.TransportGitSsh.openFetch(TransportGitSsh.java:147)
at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:136)
at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:122)
at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1104)
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:128)
... 9 more
Caused by: com.jcraft.jsch.JSchException: reject HostKey: git.test.com
at com.jcraft.jsch.Session.checkHost(Session.java:748)
at com.jcraft.jsch.Session.connect(Session.java:321)
at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:116)
... 16 more
J'ai ajouté le git.test.com l'entrée de mon /etc/hosts
fichier. J'ai utilisé le même code pour accéder à un repo git avec une url http, donc le code, il fonctionne très bien. Il est la clé de la manipulation de la partie qui est en défaut. Aucune idée sur comment gérer cela?
source d'informationauteur Izza
Vous devez vous connecter pour publier un commentaire.
Vous devez remplacer la
getJSch
méthode dans votre usine personnalisée classe:Appel
jsch.removeAllIdentity
est important; il ne semble pas fonctionner sans elle.Une mise en garde: j'ai écrit ce qui précède à la Scala, et il traduit à Java, il pourrait ne pas être tout à fait juste. L'original de la Scala est comme suit:
Jsch sesems de pas comme un fichier known_hosts dans le haché format-- il doit être conforme au format produit par:
ssh-keyscan -t rsa hostname >> ~/.ssh/known_hosts
par exemple
pas:
Réussi à trouver le problème. La clé publique du serveur de côté avait un autre nom autre que l'habituel id_rsa.pub, tandis que la clé privée de mon côté était id_rsa. JSch attend par défaut de la clé publique d'avoir le même nom que la clé privée en plus de la .pub suffixe. À l'aide d'une paire de clés avec un nom commun (ex.: privé = key_1 et public = key_1.pub) résout le problème.