【问题标题】:Spring Cloud Config Server using SSH key for Git and running in DockerSpring Cloud Config Server 使用 Git 的 SSH 密钥并在 Docker 中运行
【发布时间】:2018-04-11 23:57:00
【问题描述】:

我发现了很多问题和教程,然后才最终将它们放在一起。想要记录下来,这样其他人就可以省去很多小时的挫败感。

我正在尝试在 BitBucket 上获取一个私有 git 存储库,以使用部署密钥与 Spring Boot Config Server 一起使用,并让它在 Docker 中运行。我遇到了很多问题。

  1. 如何使用 application.yml 文件进行实际配置。

我似乎不知道应该把 SSH 信息放在哪里。所有教程似乎都是针对 https 的。

  1. 如何为配置提供私钥。对于 Dev 来说,YML 中的内联语法很痛苦。对于生产,您必须通过环境变量来提供它,这是另一种语法苦差事。

我不断收到私钥无效的错误消息。

  1. 如何让 Docker 容器信任主机密钥,而不出现讨厌的“你信任这个人”提示。

似乎有几种方法可以使这项工作发挥作用,但只有一种对我有用。

【问题讨论】:

    标签: git docker ssh-keys spring-cloud-config spring-boot-configuration


    【解决方案1】:

    第一部分是配置。您想忽略标准私钥并使用作为环境变量提供的私钥。 (SSH_KEY)。此外,git repo 是一个 EV (GIT_URL),但您可以根据需要进行硬编码。

    spring:
      cloud:
        config:
          server:
            git:
              uri:  ${GIT_URL}
              ignore-local-ssh-settings: true
              private-key: ${SSH_KEY}
    

    第 2 部分很棘手。对于 Dev,您需要内联密钥,因此您需要使用管道为 YAML 中的块添加前缀。 (请注意,此密钥已被丢弃,因为我刚刚生成它并现在已将其丢弃)

    private-key: |
                        -----BEGIN RSA PRIVATE KEY-----
                        MIIEpAIBAAKCAQEAszmCR06LVHk/kNYV6LoYgEfHlK4rp75sCsRJ7rdAbWNED+yB
                        bneOm5gue0LGIhT7iTP9D7aN6bKVHv1SBconCA7Pa2NMA9epcMT5ecJc8ndpZOFn
                        iqM77jmMMPvj8EIC06w5oK5zoYwpGotYQFHllf8M+20HtW2fZdPYAYwLcVdmc5tI
                        vLoS+10qw5D3X9zrwk2Cbt37Iqnz1cHOQq+g7sxgVgt18aIKKeg0JslaGqSlWMoT
                        ICUMHj89E4BMHj8ND8otSXHL+VhN+ghd7w1MpckxLWBsNs1+G1FuiJEVAtRq/j+8
                        SOilxgifvI1LqpZ5kO01XFlmkcuN4NMT03qpcwIDAQABAoIBAB5oQGk2sz7mv1kk
                        aV0tzaBeDUd1cWSpUw1UljKRFrY4ZEDLYH5MfH57iE9TWehIZRC3KFU1JMikitZS
                        JktjK9IbKSfQFgKE4XOHh8gXqMteZRw/feCwpydYzic1ZUvK903QZ4qSbn3XGNYv
                        FA79lhUny50Qt4EZkzSkh35js0FMSR9VmyXENxN6IgXUZyoaNAATr44Vkd488BY2
                        7PvdOniemo8/8p4Ij0Aq9Q7rOtm77ZXjyFRX5mDTi2ndSllMEhVcWXHSii+ukbvF
                        117Ns+8M7VWroNfRzI+Ilm/Xz/ePOLlNoYcY0h5+QM9vMPTX9Cpl5WofgOMK1sKd
                        mSdI4ukCgYEA12kcu0aDyIrEPHcyaT9izSFply0Uon2QKS9EQn6cr83vaEGViamh
                        f5q1coYouGnsLfbgKolEMKsYtbmJvInPFDCdc2x0Fmc207Wp1OECsN+HwElEXkrs
                        uPDpGQgs5odjN5Grue9837920oG3UBBdVDAKly2dTOcvoWW+88seFSUCgYEA1P7f
                        p78HDMQ8zTy5+3Rd4+lmJjPsY618XxSQ80j8Elrhi/DyTMA0XGc5c3cKRPmSj+JD
                        GN34WQbw7JO2mKM7YJs+tkSBeTKce8F3cZQy1jy3LNHCtfXylOxmxOFKynV5h2b/
                        jno+pGdmAPK5yvnGASd2eujtzt+AL07XiD2LnLcCgYEAsFRz131WfP/SuShdlLf1
                        WbODKuQVIxojuwLdHo1kF6k805v0G/dGoxzycOgPRz41vj57q3Yn4qr8FC3n6PTq
                        FT3idUyPDpO41r67Ye469KxWBHo1Q/aTJqTWOs5tatvixOcyqoa3MrUZQCI8+4YZ
                        z8Nvt+b3/66zV6vhDtHzMx0CgYAvWW2M0+mUS/ecRHivzqGkrdkYewh87C8uz9qd
                        SsdGqU9kla63oy7Ar+3Unkz5ImYTeGAkIgw4dlOOtBOugPMNOdXKHRaPQ9IHrO2J
                        oUFf4OVzoDnhy4ge1SLPd6nxsgXPNPVwzfopABdr9Ima9sWusgAjuK5NA+ByI9vE
                        HLJxpwKBgQCTM938cdx457ag1hS6EaEKyqljS1/B8ozptB4cy3h0hzw0crNmW84/
                        1Lt9MJmeR4FrWitQkkVLZL3SrYzrP2i+uDd4wVVD5epvnGP/Bk6g05/eB9LgDRx/
                        EeBgS282jUBkXZ6WpzqHCcku3Avs3ajzsC1WaEYx0tCiBxSkiJlaLQ==
                        -----END RSA PRIVATE KEY-----
    

    在生产方面,您需要在命令提示符处使用 bash 变量来存储您的密钥,然后再将其传递给运行容器的 Docker 命令。示例:

    $ pem=$( cat path_to_key )
    $ docker run -e "SSH_KEY=$pem" configserver
    

    此时您应该处理好应用程序。现在您所需要的只是解决 ssh 主机不受信任的问题。为此,请在 Dockerfile 中添加这些行。将“bitbucket.org”替换为您想要的任何主机。这些命令创建 ssh config 目录,修复权限,然后创建并填充 knownhosts 文件。

    RUN mkdir -p /root/.ssh
    RUN chmod 700 /root/.ssh
    RUN ssh-keyscan bitbucket.org > /root/.ssh/known_hosts
    

    【讨论】:

    • 如何像上面那样将单行私钥格式化为多行?
    • @MehrajMalik 我不是加密专家,但我怀疑您可能没有 PEM 格式的密钥。做一些谷歌搜索如何使用 openssl 将您的密钥从它的任何格式转换为 PEM
    • 你会认为 Spring 的人可以在文档中提供这个,现在......非常感谢!
    • 注意:创建 SSH 密钥时,如果使用 Mac OS Mojave 或更高版本,会创建错误的格式,这是 Spring Boot 不喜欢的。有关详细信息和解决方案,请参阅此问题。 serverfault.com/questions/939909/…
    • 非常感谢@Wpigott 为 MacOS 提供解决方案。拯救了我的一天。我什至写了一篇关于这个的文章(Spring Cloud Config Server invalid SSH key on a MacOS Mojave
    【解决方案2】:

    我想对此进行进一步的改进,希望可以消除在 YAML 文件(或 env 变量)中弄乱 SSH 密钥的需要,这通常是一个坏主意。

    这围绕着 SSH 配置文件,所以如果应用程序无权访问它,或者无法修改它,这将不起作用(但我想不出任何适用的实际情况,包括云部署:AWS Cloudformation 模板或 Kubernetes ConfigMaps 都可以提供有用的解决方法)。

    问题(大部分)围绕着(相当莫名其妙的)无法在 Spring Config 应用程序属性中指定私钥文件的限制。

    在您的~/.ssh/config 文件中,您可以添加以下内容:

    Host git-config
        HostName github.myserver.example.com
        User someone
        IdentityFile /path/to/private_key
    

    (我需要连接到私有 GitHub Enterprise 服务器,并且与 SSH 密钥关联的用户与正在运行的应用程序服务器不同:这工作得很好;如果不是这种情况,只需使用 @987654324 @ 代表HostName,省略User)

    然后,而不是使用实际的 GitHub URI,例如:

    git@github.myserver.example.com:my-team/config-properties-demo.git

    您将git-config 替换为主机:

    spring:
      cloud:
        config:
          server:
            git:
              uri: git@git-config:my-team/config-properties-demo.git
              strictHostKeyChecking: false
    

    确实有点麻烦,但是自动化比较容易。 一个更可取的选项是 Spring Config 添加另一个指向私钥材料的选项:

    spring:
      cloud:
        config:
          server:
            git:
              uri: git@github.myserver.example.com:my-team/config-properties-demo.git
              user: someone
              private_key_file: /path/to/private_key
              strictHostKeyChecking: false
    

    我猜这是“增强请求”部分的一个......

    【讨论】:

    • 实际上private_key_file 选项不被spring config stackoverflow.com/questions/55990768/… 使用,而你必须在.ssh/config 中添加单独的部分
    • private_key_file 在 spring 配置中不存在
    • 这正是我的观点,我完全不清楚为什么会这样;正如我所指出的,“Spring Config 添加另一个选项是一个更可取的选择” - 唉,这似乎不在雷达上。
    【解决方案3】:

    请原谅 necro,但当配置服务器部署到具有临时文件系统的环境时,这是搜索如何使用 Git repos 进行 SSH 身份验证时在 Google(来自 SO)上排名第一的结果 - 我相信我已经找到了一种方法来做到这一点。以下是我目前正在为我的客户实现这一目标所做的工作的要点。

    https://gist.github.com/hanserya/43b00162741fa3022481301db60e8acd

    它绝对是一只丑小鸭,但功能强大,应该为任何需要它的人提供坚实的基础。通过此实现,您将能够将卷安装到运行配置服务器的容器中。然后,只需将环境配置为使用 spring.cloud.config.server.git.sshLocation 配置密钥通过最适合您的任何媒介(环境变量、bootstrap.yml 等...)使用卷作为 SSH 目录

    编码愉快!

    【讨论】:

      猜你喜欢
      • 2015-11-28
      • 2016-02-21
      • 2017-04-06
      • 1970-01-01
      • 2019-07-01
      • 2021-05-25
      • 2023-01-27
      • 2022-01-14
      • 2017-02-19
      相关资源
      最近更新 更多