如何从 Azure Key Vault 获取证书以在 docker 镜像中使用

时间:2021-05-11 06:56:33

标签: docker ssl azure-devops azure-keyvault azure-devops-pipelines

我在构建 docker 镜像时使用 ssl 证书与 Kubernetes 中的其他不同服务进行通信。现在我的 repo 中有 ssl 证书,并将作为工件的一部分发布。我们计划将证书移动到密钥保管库并在执行我们的管道时获取它。我不确定在构建 docker 映像时如何获取它。我已经尝试了默认的 Azure Key Vault 任务,我能够获得证书,但它不是文件(.crt 或 pfx)。

下面是我在 Docker Image 中的最后一步

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
COPY $(ps-test-cert)  /usr/local/share/ca-certificates/ps-test-cert 
RUN chmod 644 /usr/local/share/ca-certificates/ps-test-cert
RUN update-ca-certificates
ENTRYPOINT ["dotnet", "Logging.API.dll"]

并且密钥保管库中的证书名称是 ps-test-cert

这是我的密钥保管库任务

    - task: AzureKeyVault@1
      inputs:
        azureSubscription: 'ARMDeployment-Service-Conn'
        KeyVaultName: 'OneK-KeyVault'
        SecretsFilter: 'ps-test-cert'
        RunAsPreJob: false

我是否必须获得证书并作为工件发布?因为我在构建时需要这个,不知道应该如何导入证书以便我可以使用。

更新

我可以通过以下命令使用 azure cli 获取证书。但我不确定如何在 docker 文件中使用它。当我发布时,我可以看到证书在已发布的项目中。

> az keyvault certificate download --vault-name one-KeyVault -n
> ps-test-cert -f cert.pem openssl x509 -outform der -in cert.pem -out
> ps-test-cert.crt

在发布任务中,我可以这样使用。

- task: PublishPipelineArtifact@1
  displayName: 'Publish Pipeline Artifact'
  inputs:
    targetPath: 'ps-test-cert.crt'
    artifact: test

如何在 docker 文件中使用它?

2 个答案:

答案 0 :(得分:0)

<块引用>

如何从 Azure Key Vault 获取证书以在 docker 镜像中使用

根据Azure Key Vault任务:

<块引用>

使用此任务下载机密信息,例如身份验证密钥、存储 帐户密钥、数据加密密钥、.PFX 文件和密码 Azure Key Vault 实例。

如果从保管库获取的值是证书(例如, PFX 文件),任务变量将包含 PFX 中的内容 字符串格式

因此,此任务不会直接下载证书文件。然后我们不能在 dockerfile 中使用它的语法为 COPY $(ps-test-cert) /usr/local/share/ca-certificates/ps-test-cert

作为解决方法,您可以使用 powershell 脚本下载并导入文件:

- task: AzurePowerShell@5
  displayName: 'import certificates'
  inputs:
    azureSubscription: ToMicrosoft365Customers
    ScriptPath: '$(System.DefaultWorkingDirectory)/_Microsoft365/import-certificatesFromKeyvault.ps1'
    ScriptArguments: '-vaultname $(vaultname) -tempStoreLocation "D:\a\_temp\"'
    errorActionPreference: continue
    azurePowerShellVersion: LatestVersion
    pwsh: true

您可以查看此文档 Using KeyVault certificates in Azure DevOps 以获取 powershell 脚本和更多详细信息。

答案 1 :(得分:0)

好的,这是我解决当前情况的方法。正如问题中更新的那样,我能够从密钥保管库读取证书。下一部分是访问 docker 文件中的证书,因为 docker 不知道位置(因为它不是上下文的一部分),它无法读取证书。所以,我所做的是在设置 docker 上下文时使用复制任务将证书添加到源目录中。然后 docker 能够看到证书和访问权限(因为它现在在 docker 上下文中)。

下面是复制任务,如果有帮助的话。

- task: CopyFiles@2
          displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
          inputs:
            Contents: |
              **\ps-test-cert.crt
            TargetFolder: '$(Build.SourcesDirectory)/Source/Logging.API/'

在 docker 文件中,我只需要使用名称,因为它在上下文中可用。

COPY ps-test-cert.crt  /usr/local/share/ca-certificates/ps-test-cert.crt
RUN chmod 644 /usr/local/share/ca-certificates/ps-test-cert.crt
RUN update-ca-certificates