gpt4 book ai didi

python - 如何使用 Python 为 Azure 应用程序网关的监听器添加新证书

转载 作者:太空宇宙 更新时间:2023-11-03 14:25:12 25 4
gpt4 key购买 nike

大家。

我是 Internet 和 Azure 的初学者。我有一个关于使用 Python 向 Azure 应用程序网关的监听器添加证书的问题。我详细描述我的问题如下。

<强>1。背景

我使用的Azure环境是:

Resource group name: My_ResourceGroup
Subscription ID: sub_id
Tenant ID: tenant_id
Client: my_client
Service principal password: sp_password

<强>2。顶级域和子域

在资源组 My_ResourceGroup 中,有两个 Azure DNS 提供程序,分别具有区域 contoso.comchen.contoso.comcontoso.com 是顶级域,而 chen.contoso.com 是子域。

对于 chen.contoso.com,我创建了一个名为 www 和 IP 10.10.10.10 的 A 记录(请注意,此 IP 是仅用于测试)。我还为此域生成了一个证书(cert.pfx 文件)以便使用 HTTPS。

<强>3。将 cert.pfx 证书安装到监听器

我在资源组 My_ResourceGroup 中有一个现成的 Azure 应用程序网关 contoso-appgw。在这个网关中,有一个监听器 contoso-appgw-hl 并且在这个监听器中有一个证书 cert0.pfx

我想要做的是使用 Azure Python SDK 将 cert.pfx 证书附加(或安装)到监听器 contoso-appgw-hl 此操作后,监听器 contoso-appgw-hl 中应该有两个证书:cert0.pfx(旧的)和 cert.pfx (新的)。

<强>4。我的代码和引用资料

我的Python代码如下:

from azure.common.credentials import ServicePrincipalCredentials
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.network import NetworkManagementClient

# Replace this with your subscription id
subscription_id = 'sub_id'

# Tenant ID for your Azure subscription
TENANT_ID = 'tenant_id'

# Your service principal App ID
CLIENT = 'client'

# Your service principal password
KEY = 'sp_password'

credentials = ServicePrincipalCredentials(
client_id = CLIENT,
secret = KEY,
tenant = TENANT_ID
)

network_client = NetworkManagementClient(credentials, subscription_id)

network_client.application_gateways.create_or_update(
'My_ResourceGroup',
'contoso-appgw',
{
'location': 'East US 2',
'http_listeners': [
{
'name': 'contoso-appgw-hl',
'protocol': 'Https',

'ssl_certificate': {
'data': 'cert.pfx',
'name': 'chenkui',
'password': '123abc'
}
}
]
}
)

我根据以下资源编写了我的代码:

  1. 示例代码:azure application manage sample code
  2. Azure 文档:definition of create_or_update function

请注意,我的代码中的 cert.pfx 是 Base-64 格式的证书,因为根据文档,需要 Base-64 格式的证书。

<强>5。错误信息

上面的代码失败了。上面代码的Azure Portal --> contoso-appgw --> Activity log中显示的错误信息是:

Operation name:
Create or Update Application Gateway

Error code:
InvalidRequestFormat

Message:
Cannot parse the request.

即使我使用 Azure 门户(即不使用 Python 代码,而是在浏览器中使用 GUI 门户),添加证书也失败了。 Azure Portal --> contoso-appgw --> Activity log 中显示的错误消息是:

Operation name:
Create or Update Application Gateway

Error code:
ApplicationGatewaySslCertificateDataMustBeSpecified

Message:
Data must be specified for Certificate /subscriptions/c72b5b1b-771e-4b65-ba34-a7db981c9dcf/resourceGroups/My_ResourceGroup/providers/Microsoft.Network/applicationGateways/contoso-appgw/sslCertificates/chenkui.

6.我的问题

我的问题如下:

  1. 这些错误消息的含义是什么?
  2. 为什么会出现这些错误?
  3. 我的代码有什么问题,如何解决?

非常感谢!

最佳答案

我找到了一种更新现有应用程序网关的方法。使用 create_or_update 函数更新现有的 Azure 资源时,您必须先获取它。否则,create_or_update 将创建新资源而不是更新现有资源。

以下链接就是一个很好的例子。它创建和更新 Azure VM。 Create and manage Windows VMs in Azure using Python

因为在Azure中创建和管理资源有统一的方法,所以我们可以应用上面链接给出的思路来管理应用网关。代码如下。

import base64

from azure.common.credentials import ServicePrincipalCredentials
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.network import NetworkManagementClient
from azure.mgmt.network.v2019_06_01.models import ApplicationGateway, ApplicationGatewaySslCertificate


def test_appgw():
# create credentials
credentials = ServicePrincipalCredentials(
client_id = CLIENT,
secret = KEY,
tenant = TENANT_ID
)

# create network client
network_client = NetworkManagementClient(credentials, subscription_id)

# get an existing application gateway
app_gw = network_client.application_gateways.get(RESOURCE_GROUP_NAME, APPLICATION_GATEWAY_NAME)

# read the pfx certificate and convert it to base-64 string
with open('certificate.pfx', 'rb') as binary_cert:
base64_cert = base64.b64encode(binary_cert.read())
cert_data = base64_cert.decode('utf-8')

# create an SSL certificate
ssl_cert = ApplicationGatewaySslCertificate(
name=ANY_NAME_IS_OK,
data=cert_data,
password=THE_PASSWARD_USED_TO_CREATE_CERTIFICATE
)

# app_gw.ssl_certificates is a Python list, so we append the new certificate in it
app_gw.ssl_certificates.append(ssl_cert)

# update the application gateway
network_client.application_gateways.create_or_update(
RESOURCE_GROUP_NAME,
APPLICATION_GATEWAY_NAME,
app_gw
)

if __name__ == "__main__":
test_appgw()

注意:

  1. 使用get函数获取已有的应用网关;
  2. ApplicationGatewaySslCertificate 类的第一个参数name 是一个字符串。您可以使用任何您喜欢的名称;
  3. 第二个参数data是一个字符串。它不是证书名称,而是 pfx 证书内容的 Base-64 字符串;
  4. 第三个参数password是一个字符串。它应该是您用来创建 pfx 证书的密码。

希望对你有帮助。

关于python - 如何使用 Python 为 Azure 应用程序网关的监听器添加新证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57843942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com