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

IntelliJ:将私钥设置为环境变量不起作用(Spring boot项目)

何烨华
2023-03-14

我有一个spring boot项目,如果我使用私钥(多行文本),它工作得非常好(这意味着密钥没有问题),但当我试图在intellij中将其设置为环境变量时,它会显示出来

原因:房地产的Spring。云配置。服务器吉特。privateKey“”不是有效的私钥

我完全知道这是因为新的线路字符。因此,我尝试用以下内容替换新行\n(作为文本)

-----BEGIN RSA PRIVATE KEY-----\nline1\nline2.....\nlinen\n-----END RSA PRIVATE KEY-----

但它也不起作用。

属性文件中的工作版本为:

privateKey: |
            -----BEGIN RSA PRIVATE KEY-----
           secret data....
            -----END RSA PRIVATE KEY-----

共有3个答案

柳浩大
2023-03-14

无论使用何种IDE,这都是一个问题。当您将privateKey设置为环境变量(这通常是在生产环境中执行的操作)时,密钥验证将失败,并出现错误。。不是有效的私钥

我是用下面的方式解决这个问题的。

  1. 只需在环境变量中传入键的主要内容。例如,如果私钥是:
-----BEGIN RSA PRIVATE KEY-----
{keyContent}
-----END RSA PRIVATE KEY-----

并且环境变量为githubKeygithubKey的值为keyContent。2.在您的代码中添加环境后处理器实现,以将githubKey中的内容转换为正确格式化的私钥,并将此格式化值存储在一个新的属性formattedGithubKey中。

@Component
public class GithubKeyProcessor implements EnvironmentPostProcessor {

    private static final String START_PK = "-----BEGIN RSA PRIVATE KEY-----";
    private static final String END_PK = "-----END RSA PRIVATE KEY-----";
    private static final String LINE_BREAK = "\n";

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment,
                                       SpringApplication application) {

        String githubKey = environment.getProperty("githubKey");

        Map<String, Object> formattedGithubKeyProperties = new HashMap<>();
        formattedGithubKeyProperties.put("formattedGithubKey", formatKey(githubKey));
        environment.getPropertySources()
                .addLast(new MapPropertySource("formattedGithubKeyProperties", formattedGithubKeyProperties));

        System.out.println("Done transforming githubKey to the correct format");
    }

    private String formatKey(String theSshKey) {
        if (theSshKey.indexOf(LINE_BREAK) < 0) {
            String tmpKey = theSshKey.replace(START_PK, "").replace(END_PK, "").trim();
            return START_PK + LINE_BREAK + tmpKey.replaceAll(" ", LINE_BREAK) + LINE_BREAK + END_PK;
        } else {
            return theSshKey;
        }
    }
}

请注意,此环境处理器必须在src/main/resources/META-INF/spring中注册。工厂文件,其内容如下所示:

org.springframework.boot.env.EnvironmentPostProcessor={package}.GithubKeyProcessor
spring:
  cloud:
    config:
      server:
        git:
          private-key: ${formattedGithubKey}

这应该能奏效。

余信然
2023-03-14

有一个棘手的方法来解决它。

  1. 关闭IDE(Goland、IntelliJ等)
  2. \n替换为

它变成了这样:

"-----BEGIN RSA PRIVATE KEY-----&#10;Proc-Type: 4,ENCRYPTED&#10;...."

施振海
2023-03-14

IntelliJ环境变量不能支持新行,请参见https://unix.stackexchange.com/q/369972.

如果您决定使用环境变量,那么我认为您最好的选择是使用环境变量指向私钥。

另一个选项是解析环境变量,用实际新行替换出现的\n。这有点混乱,因为您正在有条件地解析或不解析私钥。

 类似资料:
  • 我正在尝试为java设置一个PATH环境变量。当我按照下面的方式设置变量值时,在cmd中输入“java”时,它可以很好地工作 但是对于下面的错误,“java”不被识别为内部或外部命令, 我用的是windows 8。你知道为什么上面的变量不起作用吗?

  • 目标: 使用 Android Studio 附带的(图形)AVD 管理器管理 Android 虚拟设备 (avd),但使用不同的存储文件夹。 默认文件夹:// 想要的文件夹:/ 根据文档,这应该是有效的: (加载在.bashrc中) 这确实适用于命令行: 运行< code > emulator-avd Pixel _ 2 _ API _ 28 也很好。 然而,AVD管理器没有显示任何设备,当我使用

  • 我有sbt多项目,并尝试在子项目的中设置如下: 测试将中止,并显示以下消息: 在测试文件中,我试图得到如下值: Intellj提供如下设置环境变量: 如何设置一个环境变量在为也? 更新 根如下所示: 我还是有例外。

  • 我试图在spring boot应用程序中添加一个环境变量。属性文件。我知道如何在非spring启动项目中正常添加它,但我找不到用于添加环境变量的字段,这就是我所看到的。 这是我的application.properties文件,这可能会有帮助。

  • 问题内容: 我想通过运行程序时设置环境变量。这可能吗? 我试图这样设置: 但是结果消息说FOO不存在。 问题答案: 您必须传递一个包含键 env 的选项对象,该键 env 的值本身就是键值对的对象。

  • ENV 设置环境变量 格式有两种: ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>... 这个指令很简单,就是设置环境变量而已,无论是后面的其它指令,如 RUN,还是运行时的应用,都可以直接使用这里定义的环境变量。 ENV VERSION=1.0 DEBUG=on \ NAME="Happy Feet" 这个例子中演示了如何换行,以