2015-11-19 10 views
9

के साथ कस्टम एसएसएच कुंजी स्थान का उपयोग कैसे करें मैं Spring Cloud Config सर्वर सेट अप करने का प्रयास कर रहा हूं जो एसएसएच निजी कुंजी के लिए कस्टम स्थान का उपयोग करता है। कारण मुझे कुंजी के लिए एक कस्टम स्थान निर्दिष्ट करने की आवश्यकता है क्योंकि एप्लिकेशन चलाने वाले उपयोगकर्ता की कोई होम निर्देशिका नहीं है .. इसलिए मेरे कुंजी के लिए डिफ़ॉल्ट ~/.ssh निर्देशिका का उपयोग करने का कोई तरीका नहीं है। मुझे पता है कि केवल पढ़ने के लिए खाता बनाने का विकल्प है और कॉन्फ़िगरेशन में उपयोगकर्ता/पासवर्ड प्रदान करता है लेकिन एसएसएच रास्ता अधिक साफ हो जाता है।
क्या कोई तरीका है जिससे मैं इसे स्थापित कर सकता हूं?स्प्रिंग क्लाउड कॉन्फ़िगर

उत्तर

8

बहुत अधिक कोड पढ़ने के बाद ... मुझे आपके द्वारा इच्छित एसएसएच कुंजी सेट करने की अनुमति देने के लिए अपेक्षाकृत सरल काम मिल गया।

पहले:

/** 
* @file FixedSshSessionFactory.java 
* 
* @date Aug 23, 2016 2:16:11 PM 
* @author jzampieron 
*/ 

import org.eclipse.jgit.transport.JschConfigSessionFactory; 
import org.eclipse.jgit.transport.OpenSshConfig.Host; 
import org.eclipse.jgit.util.FS; 

import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.JSchException; 
import com.jcraft.jsch.Session; 

/** 
* Short Desc Here. 
* 
* @author jzampieron 
* 
*/ 
public class FixedSshSessionFactory extends JschConfigSessionFactory 
{ 

    protected String[] identityKeyPaths; 

    /** 
    * @param string 
    */ 
    public FixedSshSessionFactory(String... identityKeyPaths) 
    { 
     this.identityKeyPaths = identityKeyPaths; 
    } 

    /* (non-Javadoc) 
    * @see org.eclipse.jgit.transport.JschConfigSessionFactory#configure(org.eclipse.jgit.transport.OpenSshConfig.Host, com.jcraft.jsch.Session) 
    */ 
    @Override 
    protected void configure(Host hc, Session session) 
    { 
     // nothing special needed here. 
    } 

    /* (non-Javadoc) 
    * @see org.eclipse.jgit.transport.JschConfigSessionFactory#getJSch(org.eclipse.jgit.transport.OpenSshConfig.Host, org.eclipse.jgit.util.FS) 
    */ 
    @Override 
    protected JSch getJSch(Host hc, FS fs) throws JSchException 
    { 
     JSch jsch = super.getJSch(hc, fs); 
     // Clean out anything 'default' - any encrypted keys 
     // that are loaded by default before this will break. 
     jsch.removeAllIdentity(); 
     for(final String identKeyPath : identityKeyPaths) 
     { 
     jsch.addIdentity(identKeyPath); 
     } 
     return jsch; 
    } 


} 

फिर jgit से पंजीकृत:

... 
import org.eclipse.jgit.transport.SshSessionFactory; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.cloud.config.server.EnableConfigServer; 

@SpringBootApplication 
@EnableConfigServer 
public class ConfigserverApplication 
{ 

    public static void main(String[] args) { 
     URL res = ConfigserverApplication.class.getClassLoader().getResource("keys/id_rsa"); 
     String path = res.getPath(); 
     SshSessionFactory.setInstance(new FixedSshSessionFactory(path)); 

     SpringApplication.run(ConfigserverApplication.class, args); 
    } 

} 

इस उदाहरण मैं src/मुख्य/संसाधन/कुंजी में कुंजी भंडारण कर रहा हूँ के लिए इस प्रकार एक कक्षा बनाएं फ़ोल्डर और मैं उन पर पहुंचने के लिए कक्षा लोडर का उपयोग कर रहा हूं।

हटाए गए सभी महत्वपूर्ण हैं बी/सी जेएसएच मेरे द्वारा निर्दिष्ट एक से पहले मेरी डिफ़ॉल्ट एसएसएच कुंजी लोड कर रहा था और फिर स्प्रिंग क्लाउड बी/सी को एन्क्रिप्टेड क्रैश कर रहा था।

इससे मुझे बिटबकेट के साथ सफलतापूर्वक प्रमाणित करने की अनुमति मिली।

+0

धन्यवाद। मुझे आशा है कि एसबी भविष्य में एक विन्यास जोड़ देगा। – mvlupan

0

मुझे एक ही समस्या है क्योंकि मेरी डिफ़ॉल्ट एसएसएच कुंजी पासवर्ड से एन्क्रिप्ट की गई है और इसलिए "केवल काम नहीं" है, जो समझ में आता है क्योंकि यह एक कम-कम सेटअप है।

मैं स्प्रिंग क्लाउड कॉन्फ़िगर, org.eclipse.jgit में स्रोत डाइविंग चला गया और अंत में com.jcraft.jsch में समाप्त हुआ। संक्षिप्त जवाब यह है कि न तो जेजीआईटी और न ही स्प्रिंग क्लाउड ऐसा करने का एक स्पष्ट तरीका सामने आया।

जेएसएच स्पष्ट रूप से जेएसएच() उदाहरण के भीतर इस सुविधा का समर्थन करता है, लेकिन आप इसे स्प्रिंग क्लाउड स्तर से नहीं प्राप्त कर सकते हैं। कम से कम नहीं कि मुझे एक घंटे या उससे अधिक समय में मिल सकता है।

2

FixedSshSessionFactory @ जेफरी ज़ैम्पियरन का समाधान अच्छा है। हालांकि यह वसा जार के रूप में वसंत बूट ऐप को पैकेजिंग करने पर काम नहीं करेगा।

पोलिश यह वसा जार के साथ काम करने के लिए एक सा,

/** 
* @file FixedSshSessionFactory.java 
* @date Aug 23, 2016 2:16:11 PM 
* @author jzampieron 
*/ 

import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.JSchException; 
import com.jcraft.jsch.Session; 
import lombok.extern.slf4j.Slf4j; 
import org.eclipse.jgit.transport.JschConfigSessionFactory; 
import org.eclipse.jgit.transport.OpenSshConfig.Host; 
import org.eclipse.jgit.util.FS; 
import org.springframework.util.StreamUtils; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 

/** 
* Short Desc Here. 
* 
* @author jzampieron 
*/ 
@Slf4j 
public class FixedSshSessionFactory extends JschConfigSessionFactory { 

    protected URL[] identityKeyURLs; 

    /** 
    * @param url 
    */ 
    public FixedSshSessionFactory(URL... identityKeyURLs) { 
     this.identityKeyURLs = identityKeyURLs; 
    } 

    /* (non-Javadoc) 
    * @see org.eclipse.jgit.transport.JschConfigSessionFactory#configure(org.eclipse.jgit.transport.OpenSshConfig.Host, com.jcraft.jsch.Session) 
    */ 
    @Override 
    protected void configure(Host hc, Session session) { 
     // nothing special needed here. 
    } 

    /* (non-Javadoc) 
    * @see org.eclipse.jgit.transport.JschConfigSessionFactory#getJSch(org.eclipse.jgit.transport.OpenSshConfig.Host, org.eclipse.jgit.util.FS) 
    */ 
    @Override 
    protected JSch getJSch(Host hc, FS fs) throws JSchException { 
     JSch jsch = super.getJSch(hc, fs); 
     // Clean out anything 'default' - any encrypted keys 
     // that are loaded by default before this will break. 
     jsch.removeAllIdentity(); 
     int count = 0; 
     for (final URL identityKey : identityKeyURLs) { 
      try (InputStream stream = identityKey.openStream()) { 
       jsch.addIdentity("key" + ++count, StreamUtils.copyToByteArray(stream), null, null); 
      } catch (IOException e) { 
       logger.error("Failed to load identity " + identityKey.getPath()); 
      } 
     } 
     return jsch; 
    } 


} 
+1

यदि जार में पैक किया गया तो यह क्यों काम नहीं करेगा? –

संबंधित मुद्दे