我正在尝试使用Azure Python来驱动一些服务器配置管理,但我很难确定如何使用API来上传和配置SSL证书。
我可以成功地查询我的Azure帐户来发现WebSiteManagementClient
中可用的Azure,并且可以使用DnsManagementClient
询问和操作DNS配置。
我还可以使用Azure网站上的说明手动向Azure应用程序服务添加SSL证书。
但是,我根本不清楚我应该使用哪些API端点来安装自定义SSL证书。
如果我有一个名为WebSiteManagementClient
的client
,那么我可以看到:
client.certificates.get_certificate()
允许我按名称获取特定的证书--但是client.certificates
似乎没有一个API来列出所有可用的证书。client.certificates.create_or_update_certificate()
允许我以幂等的方式创建/更新证书--但它需要一个CertificateEnvelope
参数,而且我看不出应该在哪里创建该对象。get_site_host_name_bindings
和delete_site_host_name_binding
的调用,但没有明显的API来创建绑定;对configure_...
和create_or_update_...
有数十次调用,但API端点的命名和API文档在任何方面都无法说明应该使用哪些调用。谁能给我指明正确的方向?我需要进行哪些Python调用才能上传从第三方获得的证书,并在特定域下的AppService上安装该证书?
附录
以下是一些基于@peter-pan的建议的示例代码:
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'
凭据的值适用于其他操作,包括在密钥存储中获取和创建密钥。如果我将凭据修改为已知的坏值,则会得到:
KeyVaultErrorException: Operation returned an invalid status code 'Unauthorized'
发布于 2020-12-31 12:15:56
如果您遵循从密钥库导入证书的App服务演练,它会告诉您,您的应用程序需要读取权限才能从保险库访问证书。但是,要像您正在做的那样,首先将证书导入到密钥库,还需要授予服务主体证书导入权限。尝试在没有导入权限的情况下导入证书将产生“禁止的”错误,就像您正在看到的错误一样。
还有一些新的包可以在Python中使用Key Vault来代替azure-keyvault
。
azure-身份是与这些包一起使用的用于身份验证的包。
下面是一个使用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")
通过设置与ServicePrincipalCredentials
、secret
和tenant
对应的环境变量,可以提供与secret
相同的凭据。
export AZURE_CLIENT_ID="<client>"
export AZURE_CLIENT_SECRET="<secret>"
export AZURE_TENANT_ID="<tenant>"
(我使用Python编写Azure SDK )
发布于 2017-03-14 00:36:05
根据您的描述,根据我的理解,我认为您想上传一个证书并在Azure应用程序服务上使用它。
根据我在Azure的经验,似乎没有任何Python可以直接将证书上传到Azure experience。但是,通过将证书导入Azure密钥库并从Azure App使用它,可以找到解决办法。有关更多细节,请参见下面的docuemtn列表。
Import Certificate
REST的Key Valut
。相关的Azure是来自这里的方法这里,您可以参考key Vault的参考文献来了解如何使用它。Create Or Update
REST用于部署,相关的Python是create_or_update
,其用法请参考这里。希望能帮上忙。
正如Azure对KeyVault Access Policy
的引用所述,如下所示。
访问策略 有些操作要求您的凭据具有正确的访问策略。 如果您有“未经授权”的错误,请使用Azure Portal、Azure CLI或Key Vault Management SDK本身向此凭据添加正确的访问策略。
下面是通过Azure CLI设置证书操作访问策略的步骤。
azure ad sp show --search <your-application-display-name>
,然后复制Service Principal Names
(spn)类似于xxxx-xxxx-xxxxx-xxxx-xxxx
。azure keyvault set-policy brucechen --spn <your-applicaiton-spn> --perms-to-certificates <perms-to-certificates, such as [\"all\"]>
。<perms-to-certificates>
的解释如下所示。表示证书操作的字符串的JSON编码数组;每个字符串可以是[所有的、获取、列表、删除、创建、导入、更新、管理本体、地理组织、异构组织、排序器、删除者]之一。
https://stackoverflow.com/questions/42689852
复制相似问题