Spring Cloud Config Server使用SSH密钥进行Git并在Docker中运行

Wpi*_*ott 8 git ssh-keys docker spring-cloud-config spring-boot-configuration

在最终总结之前,我发现了许多问题和教程.想要记录它,以便其他人可以节省许多小时的挫折.

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

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

我似乎无法弄清楚我应该把SSH信息放在哪里.所有教程似乎都适用于https.

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

我一直收到私钥无效的错误.

  1. 如何让Docker容器信任主机密钥,而不是那个讨厌的"你相信这个人"的提示.

似乎有几种方法可以完成这项工作,但只有一种方法可以帮助我.

Wpi*_*ott 18

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

spring:
  cloud:
    config:
      server:
        git:
          uri:  ${GIT_URL}
          ignore-local-ssh-settings: true
          private-key: ${SSH_KEY}
Run Code Online (Sandbox Code Playgroud)

第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-----
Run Code Online (Sandbox Code Playgroud)

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

$ pem=$( cat path_to_key )
$ docker run -e "SSH_KEY=$pem" configserver
Run Code Online (Sandbox Code Playgroud)

此时你应该得到应用程序的处理.现在您只需要通过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
Run Code Online (Sandbox Code Playgroud)

  • 注意:创建SSH密钥时,如果使用Mac OS Mojave或更高版本,它将创建错误的格式,Spring Boot不喜欢这种格式。有关详细信息和解决方案,请参见此问题。https://serverfault.com/questions/939909/ssh-keygen-does-not-create-rsa-private-key (2认同)
  • 非常感谢 @Wpigott 指出 MacOS 的解决方案。拯救了我的一天。我什至写了一篇关于此的文章([Spring Cloud Config Server 在 MacOS Mojave 上的 SSH 密钥无效](https://skryvets.com/blog/2019/05/27/solved-issue-spring-cloud-config-server-私人 ssh 密钥/)) (2认同)

Mar*_*rco 5

我想对此进行进一步的修改,希望可以消除在YAML文件(或环境变量)中使用SSH密钥的麻烦,这通常是一个坏主意。

这围绕SSH Config文件进行,因此,如果该应用程序无权访问它,或者无法对其进行修改,则将无法正常工作(但我无法想到这种情况适用的任何实际情况,包括Cloud部署:AWS Cloudformation模板或Kubernetes ConfigMaps将提供有用的解决方法。

该问题(大部分情况下)围绕(无法解释的)局限性,即不能在Spring Config应用程序属性中指定私钥文件。

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

Host git-config
    HostName github.myserver.example.com
    User someone
    IdentityFile /path/to/private_key
Run Code Online (Sandbox Code Playgroud)

(我需要连接到私有GitHub Enterprise服务器,并且与SSH密钥关联的用户与运行该应用程序服务器的用户不同:这很好用;如果不是这种情况,则只需github.com对进行使用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
Run Code Online (Sandbox Code Playgroud)

这确实有点麻烦,但相对容易实现自动化。一个更好的选择是让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
Run Code Online (Sandbox Code Playgroud)

我想这是“增强请求”部分的内容...