如何从 Azure 密钥保管库获取证书以用于 docker 图像
How to fetch Certificate from Azure Key vault to be used in docker image
我在构建 docker 映像时使用 ssl 证书与 Kubernetes 中的其他不同服务进行通信。现在我的 repo 中有 ssl 证书,并将作为工件的一部分发布。我们计划将证书移动到密钥库并在执行我们的管道时获取它。我不确定在构建 docker 图像时如何获取它。我已经尝试了默认的 azure key vault 任务,我能够获得证书,但它不是文件(.crt 或 pfx)。
下面是我在 Docker 图片
中的最后一步
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 file.When 中使用它 我发布 我可以看到证书在发布的项目中。
> 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 文件中使用它?
How to fetch Certificate from Azure Key vault to be used in docker image
根据Azure Key Vault任务:
Use this task to download secrets such as authentication keys, storage
account keys, data encryption keys, .PFX files, and passwords from an
Azure Key Vault instance.
If the value fetched from the vault is a certificate (for example, a
PFX file), the task variable will contain the contents of the PFX in
string format.
所以,这个任务不会直接下载证书文件。然后我们不能在 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 脚本和更多详细信息。
好的,这是我解决当前情况的方法。正如问题中更新的那样,我能够从密钥库中读取证书。下一部分是访问 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
我在构建 docker 映像时使用 ssl 证书与 Kubernetes 中的其他不同服务进行通信。现在我的 repo 中有 ssl 证书,并将作为工件的一部分发布。我们计划将证书移动到密钥库并在执行我们的管道时获取它。我不确定在构建 docker 图像时如何获取它。我已经尝试了默认的 azure key vault 任务,我能够获得证书,但它不是文件(.crt 或 pfx)。
下面是我在 Docker 图片
中的最后一步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 file.When 中使用它 我发布 我可以看到证书在发布的项目中。
> 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 文件中使用它?
How to fetch Certificate from Azure Key vault to be used in docker image
根据Azure Key Vault任务:
Use this task to download secrets such as authentication keys, storage account keys, data encryption keys, .PFX files, and passwords from an Azure Key Vault instance.
If the value fetched from the vault is a certificate (for example, a PFX file), the task variable will contain the contents of the PFX in string format.
所以,这个任务不会直接下载证书文件。然后我们不能在 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 脚本和更多详细信息。
好的,这是我解决当前情况的方法。正如问题中更新的那样,我能够从密钥库中读取证书。下一部分是访问 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