Microsoft Azure 仮想ネットワークゲートウェイのポイント対サイトで使うルート証明書を、 C# で Azure SDK を使って登録してみた。
公開証明書データを渡すときに使う 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); }