python - 如何使用Python API为应用服务上传和配置SSL证书

标签 python azure ssl azure-keyvault

我正在尝试使用 Azure Python SDK插入一些服务器配置管理,但我很难弄清楚我应该如何使用 API 来上传和配置 SSL 证书。

我可以成功地查询我的 Azure 帐户以发现 WebSiteManagementClient 可用的应用程序服务,我可以使用 DnsManagementClient 查询和操作 DNS 配置.

我还可以使用 the instructions on the Azure website 手动将 SSL 证书添加到 Azure 应用服务.

但是,我完全不清楚应该使用哪些 API 端点来安装自定义 SSL 证书。

如果我有一个 WebSiteManagementClient名为 client ,然后我可以看到:

  • client.certificates.get_certificate()允许我按名称获得特定证书 - 但 client.certificates似乎没有用于列出所有可用证书的 API。
  • client.certificates.create_or_update_certificate()允许我大概幂等地创建/更新证书 - 但它需要 CertificateEnvelope参数,我看不到应该在哪里创建该对象。
  • 假设我手动上传证书,我无法确定我将使用哪个 API 端点在网站上安装该证书。有调用 get_site_host_name_bindingsdelete_site_host_name_binding ,但没有明显的 API 来创建绑定(bind);有几十个电话打给configure_...create_or_update_... ,但 API 端点的命名和 API 文档均未以任何方式说明应使用哪些调用。

谁能指出我正确的方向?我需要调用哪些 Python API 来上传从第三方获得的证书,并将该证书安装到特定域下的 AppService 上?

附录

这是一些示例代码,基于@peter-pan-msft 的建议:

creds = ServicePrincipalCredentials(
    client_id=UUID('<client>'),
    secret='<secret>',
    tenant=UUID('<tenant>'),
    resource='https://vault.azure.net'
)
kv = KeyVaultClient(
    credentials=creds
)
KEY_VAULT_URI = 'https://<vault>.vault.azure.net/'

with open('example.pfx', 'rb') as f:
    data = f.read()

# Try to get the certificates
for cert in kv.get_certificates(KEY_VAULT_URI):
    print(cert)

# or...
kv.import_certificate(KEY_VAULT_URI, 'cert name', data, 'password')

此代码引发:

KeyVaultErrorException: Operation returned an invalid status code 'Forbidden'

凭据的值适用于其他操作,包括在 keystore 中获取和创建 key 。如果我将凭据修改为已知的错误值,我会得到:

KeyVaultErrorException: Operation returned an invalid status code 'Unauthorized'

最佳答案

如果您关注App Service walkthrough for importing certificates from Key Vault ,它会告诉您您的应用需要读取权限才能访问保险库中的证书。但是,要在最初将证书导入到 Key Vault,您还需要授予服务主体证书导入权限。尝试在没有导入权限的情况下导入证书会产生“禁止”错误,就像您看到的那样。

还有用于在 Python 中使用 Key Vault 的新包取代了 azure-keyvault:

azure-identity是应该与这些一起用于身份验证的包。

下面是使用 azure-keyvault-certificates 导入证书的示例:

from azure.identity import DefaultAzureCredential
from azure.keyvault.certificates import CertificateClient

KEY_VAULT_URI = 'https://<vault>.vault.azure.net/'

credential = DefaultAzureCredential()
client = CertificateClient(KEY_VAULT_URI, credential)

with open('example.pfx', 'rb') as f:
    data = f.read()

client.import_certificate("cert-name", data.encode(), password="password")

您可以通过设置与 client_idsecret 相对应的环境变量来提供用于 ServicePrincipalCredentials 的相同凭据租户:

export AZURE_CLIENT_ID="<client>"
export AZURE_CLIENT_SECRET="<secret>"
export AZURE_TENANT_ID="<tenant>"

(我使用 Python 开发 Azure SDK)

关于python - 如何使用Python API为应用服务上传和配置SSL证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42689852/

相关文章:

python - 在 Python 中将 HTML 子标签更改为同级标签

azure - 注册-AzureRmAutomationDscNode 返回 BadRequest

azure - 单个存储帐户作为使用事件中心的应用服务的检查点存储

java.io.EOFException : SSL peer shut down incorrectly 异常

ssl - 如何在 Ubuntu 上运行的 CouchDB 上启用 SSL?

python - 在 Mac OS X 上使用 Python 生成一个新的非阻塞进程

python - Odoo - 指向同一模型的多个 Many2one 字段

python - 灰度图像至 3 个 channel

c# - 如何注入(inject) Application Insights 代码以监视所有方法中的计时

tomcat - 为什么重定向到 https 会被注销?