我在构建 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 文件中使用它?
答案 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