C# で Azure 仮想ネットワークゲートウェイのポイント対サイトで使うルート証明書を追加する

Microsoft Azure 仮想ネットワークゲートウェイのポイント対サイトで使うルート証明書を、 C# で Azure SDK を使って登録してみた。

www.nuget.org

公開証明書データを渡すときに使う BinaryData が曲者だった。 公開証明書データの文字列中の改行文字を削除し、 さらにダブルクォートで囲んでやる必要があった。それを怠ると API を呼び出すために JSONシリアライズしようとして失敗。 例外発生。 なんやねんそれ。

using Azure;
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Network;
using Azure.ResourceManager.Network.Models;
using Azure.ResourceManager.Resources;

const string ClientId = "クライアント ID";
const string ClientSecret = "クライアントシークレット";
const string TenantId = "テナント ID";
const string SubscriptionId = "サブスクリプション ID";
const string ResourceGroupName = "リソースグループ名";
const string VirtualNetworkGatewayName = "VPN ゲートウェイ名";

var credential = new ClientSecretCredential(
    tenantId: TenantId,
    clientId: ClientId,
    clientSecret: ClientSecret);
var client = new ArmClient(credential);

ResourceGroupResource resourceGroup = await client.GetSubscriptionResource(
    SubscriptionResource.CreateResourceIdentifier(SubscriptionId))
    .GetResourceGroupAsync(ResourceGroupName);

VirtualNetworkGatewayResource gateway = await resourceGroup.GetVirtualNetworkGatewayAsync(VirtualNetworkGatewayName);
foreach (var prefix in gateway.Data.VpnClientConfiguration.VpnClientAddressPrefixes)
{
    Console.WriteLine(prefix);
}

// VPN クライアントのアドレスプールを変更する。
gateway.Data.VpnClientConfiguration.VpnClientAddressPrefixes.Clear();
gateway.Data.VpnClientConfiguration.VpnClientAddressPrefixes.Add("192.168.10.0/24");

if (!gateway.Data.VpnClientConfiguration.VpnAuthenticationTypes.Contains(VpnAuthenticationType.Certificate))
{
    gateway.Data.VpnClientConfiguration.VpnAuthenticationTypes.Add(VpnAuthenticationType.Certificate);
}

// 証明書を登録・更新するときは、ダブルクォートで囲んで、
// 改行文字は消す必要がある。
// でないと、CreateOrUpdateAsync で JSON をパースできずに例外発生。
var testRootCert = @"""aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa""";
gateway.Data.VpnClientConfiguration.VpnClientRootCertificates.Clear();
gateway.Data.VpnClientConfiguration.VpnClientRootCertificates.Add(
    new VpnClientRootCertificate(
        BinaryData.FromString(testRootCert.Replace("\r", "").Replace("\n", "")))
    {
        Name = "TestRootCert",
    });


var gatewayCollection = resourceGroup.GetVirtualNetworkGateways();
var updateOperation = await gatewayCollection.CreateOrUpdateAsync(
    waitUntil: WaitUntil.Completed,
    virtualNetworkGatewayName: VirtualNetworkGatewayName,
    data: gateway.Data);
VirtualNetworkGatewayResource updatedGateway = await updateOperation.WaitForCompletionAsync();
foreach (var prefix in updatedGateway.Data.VpnClientConfiguration.VpnClientAddressPrefixes)
{
    Console.WriteLine(prefix);
}