繁体   English   中英

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

[英]How to add new certificate for a listener of an Azure Application gateway with Python

大家。

我是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.com contoso.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 My_ResourceGroup 在此网关中,有一个侦听器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应用程序管理示例代码
  2. Azure文档: create_or_update函数的定义

请注意,我的代码中的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. 我的代码有什么问题以及如何解决?

非常感谢你!

如果要将隐式侦听器从http转换为https,则可以使用以下powershell脚本:

$appgw= Get-AzApplicationGateway -Name "AppGWname" -ResourceGroupName "RG Name"

#$listener= Get-AzApplicationGatewayHttpListener -Name listener1 -ApplicationGateway $appgw

$FEC= Get-AzApplicationGatewayFrontendIPConfig -Name "FrontendIP" -ApplicationGateway $appgw


Add-AzApplicationGatewayFrontendPort -ApplicationGateway $appgw -Name "Name of the Port" -Port 443 

$port = Get-AzApplicationGatewayFrontendPort -ApplicationGateway $appgw -Name "Name of Port"

$passwd = ConvertTo-SecureString  "Passoword" -AsPlainText -Force 


Add-AzApplicationGatewaySSLCertificate -Name "Name of the cert" -CertificateFile "Full path of the cert with.pfx" -Password $passwd -ApplicationGateway $appgw

$cert =Get-AzApplicationGatewaySSLCertificate -Name "Name of cert" -ApplicationGateway $appgw

Set-AzApplicationGatewayHttpListener -ApplicationGateway $appgw -Name "Name of the listener" -FrontendIPConfiguration $FEC -FrontendPort $port -Protocol Https -SslCertificate $cert

Set-AzApplicationGateway -ApplicationGateway $appgw

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

以下链接是一个很好的例子。 它创建和更新Azure VM。 使用Python在Azure中创建和管理Windows VM

因为在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证书所使用的密码。

希望这对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM