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

从应用程序读取SSH私钥。spring boot中的yaml文件?

通寂离
2023-03-14

我有一个camel应用程序,它使用SSH私钥连接到SFTP服务器。如果我从文件中读取id_rsa文件,我就能够连接到服务器。如本例所示,它正在从文件加载。

registry.put("privateKey", getBytesFromFile("./src/main/resources/id_rsa"));

private byte[] getBytesFromFile(String filename) throws IOException {
    InputStream input;
    input = new FileInputStream(new File(filename));
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    IOHelper.copyAndCloseInput(input, output);
    return output.toByteArray();
}

我想在运行时动态地提供私钥。这意味着在应用中。spring boot应用程序中的yaml,将由docker容器环境变量替换。

@Value("${sftp_private_key}")
private String privateKey;

registry.put("privateKey", privateKey.getBytes());

我得到了这个例外

org.apache.camel.component.file.GenericFileOperationFailedException: Cannot connect to sftp://<user>@<sftp_server>:22
    at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:146) ~[camel-ftp-2.19.1.jar:2.19.1]
    at org.apache.camel.component.file.remote.RemoteFileConsumer.connectIfNecessary(RemoteFileConsumer.java:203) [camel-ftp-2.19.1.jar:2.19.1]
    at org.apache.camel.component.file.remote.RemoteFileConsumer.recoverableConnectIfNecessary(RemoteFileConsumer.java:171) [camel-ftp-2.19.1.jar:2.19.1]
    at org.apache.camel.component.file.remote.RemoteFileConsumer.prePollCheck(RemoteFileConsumer.java:59) [camel-ftp-2.19.1.jar:2.19.1]
    at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:110) [camel-core-2.19.1.jar:2.19.1]
    at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174) [camel-core-2.19.1.jar:2.19.1]
    at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101) [camel-core-2.19.1.jar:2.19.1]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_121]
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_121]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_121]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_121]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_121]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_121]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_121]
Caused by: com.jcraft.jsch.JSchException: invalid privatekey: [B@5e200110
    at com.jcraft.jsch.KeyPair.load(KeyPair.java:757) ~[jsch-0.1.54.jar:na]
    at com.jcraft.jsch.IdentityFile.newInstance(IdentityFile.java:46) ~[jsch-0.1.54.jar:na]
    at com.jcraft.jsch.JSch.addIdentity(JSch.java:442) ~[jsch-0.1.54.jar:na]
    at org.apache.camel.component.file.remote.SftpOperations.createSession(SftpOperations.java:220) ~[camel-ftp-2.19.1.jar:2.19.1]
    at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:115) ~[camel-ftp-2.19.1.jar:2.19.1]
    ... 13 common frames omitted

经过一些调试,我明白这是\n字符的问题。如果我从文件中读取,则私钥包含\n个字符。但是如果我从. yaml文件读取,它没有\n字符。我将所有新行替换成\n个字符,并将其转换为单行。它仍然不起作用。

如何在应用程序中提供此值。yaml哪个等效于从该文件中读取?

共有2个答案

边霄
2023-03-14

也许这会有帮助:

下面是我代码的一部分,它从给定的路径读取PublicKey:

import com.google.common.io.BaseEncoding;
import java.io.DataInputStream;
import java.io.InputStream;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;

public class PublicKeyReader {

    public static PublicKey get(String filename)
            throws Exception {

        InputStream is = PublicKeyReader.class.getResourceAsStream("/keystore/" + filename);

        DataInputStream dis = new DataInputStream(is);

        byte[] keyBytes = new byte[is.available()];
        dis.readFully(keyBytes);
        dis.close();

        String base64 = new String(keyBytes);
        X509EncodedKeySpec spec
                = new X509EncodedKeySpec(BaseEncoding.base64().decode(base64));
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return kf.generatePublic(spec);
    }
}
翟丰茂
2023-03-14

如本文所述,它与|

示例application.yaml

sftp_private_key: |
                  ----BEGIN RSA PRIVATE KEY-----
                     Remaining part of key
                  -----END RSA PRIVATE KEY-----
 类似资料:
  • 在我的dropwizard rest应用程序中,我的指标配置是这样的,(hello-world.yml) 这是一个SLF4J记者,我把它放在了我的YAML配置文件中。当我想获取这个值并在我的应用程序文件中使用它时。我看到的唯一选择是将此作为< code >地图阅读 此问题与graphite服务器配置的Dropwizard Yaml相同。但是这个问题还是没有答案,所以我创造了一个新问题来试试运气。

  • 我正在尝试使用Java的runtime.getruntime().exec()使用ssh-keygen linux实用工具从私钥中提取公钥。 当我在终端上运行这个命令时,它完美无缺地工作,我能够从RSA私钥中提取公钥

  • 问题内容: 该BouncyCastle的加密API允许创建和使用的常规验证数字签名包对象,如,和它们的容器。 假设我使用OpenSSL创建一个.pem(或更简单的话是一个.der文件),其中包含要在应用程序中使用的椭圆曲线私钥。例如,它看起来像这样: 如何使用BouncyCastle API获取同时包含此私钥和相应公钥的? 请注意,我要使用BouncyCastle 1.50(在撰写本文时为最新)中

  • BouncyCastle加密API允许使用常规的<code>java创建和验证数字签名。安全性包对象,如,及其容器<code>java.security.KeyPair。 假设我使用OpenSSL创建了一个. pem(或者更简单的. der文件),其中包含了我希望在应用程序中使用的椭圆曲线私钥。例如,它看起来像这样: 我如何使用BouncyCastle APIs来获取包含此私钥和相应公钥的< co

  • 我有以下问题。我根据一个给定的概要文件在yaml文件中读取的值创建一个数据源。 我当前的问题是,当我用“dev”配置文件启动应用程序时,serviceId的值是'my-prod-service'。 我在这里做错了什么?

  • 问题内容: 我有一个私钥文件(PEM BASE64编码)。我想在其他地方使用它解密其他数据。使用Java,我尝试读取文件并解码其中的BASE64编码数据。这是我尝试的代码段。 import java.io.; import java.nio.ByteBuffer; import java.security. ; import java.security.spec.PKCS8EncodedKeySp