当前位置: 首页 > 知识库问答 >
问题:

如何在SpringCloud配置中使用自定义ssh密钥位置

屠坚壁
2023-03-14

我正在尝试设置一个SpringCloudConfig服务器,该服务器使用ssh私钥的自定义位置。我需要为密钥指定自定义位置的原因是,运行应用程序的用户没有主目录。。所以我没有办法使用默认的~/。ssh我的密钥的目录。我知道可以选择创建一个只读帐户,并在配置中提供用户/密码,但ssh方式更干净
有什么方法可以设置这个吗?

共有3个答案

濮赤岩
2023-03-14

我有一个类似的问题,因为我的默认SSH密钥是用密码加密的,因此不能“正常工作”,这是有道理的,因为这是一个无头的设置。

我进入了SpringCloud配置,org。日食jgit并最终进入com。jcraft。jsch。简单的回答是,JGit和SpringCloud都没有明确的方法来实现这一点。

JSch显然在JSch()实例中支持此功能,但您无法从Spring云级别获得它。至少我在一个小时左右的时间里找不到。

邹英光
2023-03-14

@Jeffrey Zampieron的FixedsShsSessionFactory解决方案很好。但是,如果将spring boot应用程序打包为一个胖罐子,它将无法工作。

使用肥罐子时,请稍微打磨一下,

/**
 * @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;
    }


}
公羊雅达
2023-03-14

在阅读了更多的代码之后。。。我找到了一个相对简单的解决方法,允许您设置所需的SSH密钥。

首先:创建一个类如下:

/**
 * @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/main/resources/keys文件夹中,并使用类装入器获取它们。

RemoveAllities很重要b/c JSch在我指定的ssh密钥之前加载了我的默认ssh密钥,然后Spring Cloud将b/c的加密密钥崩溃。

这使我能够成功地与bit桶进行身份验证。

 类似资料:
  • 我下载并安装git从:https://git-scm.com/downloads.我现在可以在Windows命令提示符上使用git。 我下载了puttygen并用它生成了一对RSA密钥,存储在 我将公钥添加到我公司的git网站。 现在,我如何告诉git使用我刚刚创建的rsa密钥?

  • 我想用AES加密实现一个自定义密钥,我找到了下面的实现和细节。 但我有以下几点疑虑: 如果我要使用典型的示例代码,例如: null https://www.securecoding.cert.org/confluence/display/java/msc61-j.+do+not+use+insecure+or+weak+cryptographic+算法 如何在Java中生成SALT值?

  • 但是,我的程序稍后尝试将一个新的JPanel添加到类的扩展JPanel中,方法是: 这个新的JPanel以正确的BorderLayout格式显示内容,但是JPanel本身将保持在扩展JPanel的顶部中心,我知道这是因为默认布局设置为FlowLayout,但是将其设置为BorderLayout只会导致面板占用整个屏幕。将布局设置为null将完全破坏框架,除了框架的最小化和关闭按钮之外,什么也没有出

  • 我似乎无法为JPanel设置按钮的自定义位置。它总是在左上角添加按钮,然后继续向右。我还有一个背景图像,这让事情变得更加困难。框架如下所示:imageshack.com/a/img838/3240/ez6l.png我的代码是: 我想将按钮“MusicButton”添加到右下角/中间/或左侧。如果您可以在JPanel中定制JButton,请分享。谢谢

  • 我想在spring security(3.1.0)中使用稍微定制的rememberme功能。 我这样声明rememberme标签: 由于我有自己的rememberme服务,我需要将其注入到RememberMeAuthenticationFilter中,我这样定义它: 下面是完整的spring-security.xml:

  • 我有一个自定义密钥库,用于为我的APK签名。现在我想使用相同的密钥库进行调试。当我转到Eclipse->Windows->Preferences->Android->Build and set我的自定义密钥存储时,我会得到“Keystore was tampered with,or password was incre正确”?