我正在尝试使用 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_bindings
和delete_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-keyvault-certificates (Migration guide)
- > azure-keyvault-keys (Migration guide)
- > azure-keyvault-secrets (Migration guide)
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_id
、secret
和 相对应的环境变量来提供用于
: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/