CDNで独自証明書の利用 (BYOC)

[更新:2026年03月17日]

BYOC(Bring Your Own Certificate)とは、WebサービスやCDNなどに使用するSSL/TLS証明書を利用者自身が持ち込み、クラウドに登録して利用する方式です。独自ドメインの証明書を自社管理のまま使えるため、ブランド保護・通信の安全性確保・証明書運用の柔軟性が向上します。

この利用例では、グローバルCDN基盤で独自証明書を利用し、安全な鍵保管基盤と連携して配信経路を強固に保護します。証明書管理を自社で統制でき、セキュリティ強化やブランド信頼性向上、更新運用の効率化、可用性の高いコンテンツ配信を実現します。

security_byoc

各機能のサービス対応

機能

対応サービス

コードリポジトリ

Azure Front Door

シークレット管理

Azure Key Vault

構築手順

ドメインと証明書の準備

本ユースケースでは、カスタムドメインおよびSSL証明書を使用します。あらかじめ準備を行ったうえで、設定作業を進めてください。

Azure Front Door のサービスプリンシパルの登録

Azure Front Door で独自の証明書を使用する場合、Microsoft Entra に Azure Front Door のサービスプリンシパルを登録する必要があります。環境ごとに初回のみ、グローバル管理者権限のユーザーで以下のコマンドを実行します。

az login --tenant (テナントID)
az ad sp create --id 205478c0-bd83-4e1b-a9d6-db63a3e1e1c8

作業の後、Azure ポータルで Microsoft Entra を開き、「テナントの検索」欄に 205478c0-bd83-4e1b-a9d6-db63a3e1e1c8 を入力し、サービスプリンシパルが登録されていることを確認します。

EntraAzureFrontDoorApp

Add-on でのリソース作成

続いて、Add-onでのリソースを作成します。

CDN 機能

  • Add-on の「CDN 機能」API を利用して Azure Front Door を作成します。

    TOKEN='<your-api-token>'
    
    #POST
    curl -v \
      --location 'https://secure.sakura.ad.jp/cloud-test/zone/is1y/api/addon/1.0/analytics/cdn' \
      --header 'Content-Type: application/json' \
      --header 'Accept: application/json' \
      --header "Authorization: Basic $TOKEN" \
      --data '{
        "location": "japaneast",
        "profile": {
          "level": 1
        },
        "endpoint": {
          "route":{
            "patterns": ["/*"],
            "originGroup": {
              "origin": {
                "hostName": "example.com",
                "hostHeader": "example.com"
              }
            }
          }
        }
      }'
    

Azure ポータル上での設定

Azureポータル側で設定を実施します。

CDNのリソースグループへのアクセス

  • Add-onの「CDN 機能」API を利用して Azure Front Doorの情報を取得します。

    TOKEN='<your-api-token>'
    
    #GET
    curl -v \
      --location 'https://secure.sakura.ad.jp/cloud-test/zone/is1y/api/addon/1.0/analytics/cdn/rg-am5pel6bbs3sc' \
      --header 'Accept: application/json' \
      --header "Authorization: Basic $TOKEN"
    
  • レスポンスボディの url をブラウザで開き、ガバメントクラウド利用者のアカウントで Azureポータルにログインします。

    {
        "data": {
            "id": "/subscriptions/7cc33115-0b1e-4673-87b5-1bf05712c34b/resourcegroups/rg-am5pel6bbs3sc/providers/Microsoft.Cdn/profiles/afd-hc4bybcoeyjaw",
            "type": "Microsoft.Cdn/profiles",
            "name": "afd-hc4bybcoeyjaw",
            "location": "Global",
            "kind": "frontdoor",
            "tags": [],
            "sku": {
                "name": "Standard_AzureFrontDoor"
            },
            "properties": {
                "originResponseTimeoutSeconds": 30,
                "logScrubbing": null,
                "frontDoorId": "a21b38a4-8d2a-4245-a1e4-a1c0f85364bd",
                "extendedProperties": [],
                "resourceState": "Active",
                "provisioningState": "Succeeded"
            },
            "originGroups": [
                {
                    "id": "/subscriptions/7cc33115-0b1e-4673-87b5-1bf05712c34b/resourcegroups/rg-am5pel6bbs3sc/providers/Microsoft.Cdn/profiles/afd-hc4bybcoeyjaw/origingroups/origin-group-hc4bybcoeyjaw",
                    "type": "Microsoft.Cdn/profiles/origingroups",
                    "name": "origin-group-hc4bybcoeyjaw",
                    "properties": {
                        "loadBalancingSettings": {
                            "sampleSize": 4,
                            "successfulSamplesRequired": 3,
                            "additionalLatencyInMilliseconds": 50
                        },
                        "healthProbeSettings": null,
                        "trafficRestorationTimeToHealedOrNewEndpointsInMinutes": null,
                        "sessionAffinityState": "Disabled",
                        "provisioningState": "Succeeded",
                        "deploymentStatus": "NotStarted"
                    },
                    "origins": [
                        {
                            "id": "/subscriptions/7cc33115-0b1e-4673-87b5-1bf05712c34b/resourcegroups/rg-am5pel6bbs3sc/providers/Microsoft.Cdn/profiles/afd-hc4bybcoeyjaw/origingroups/origin-group-hc4bybcoeyjaw/origins/origin-hc4bybcoeyjaw",
                            "type": "Microsoft.Cdn/profiles/origingroups/origins",
                            "name": "origin-hc4bybcoeyjaw",
                            "properties": {
                                "originGroupName": "origin-group-hc4bybcoeyjaw",
                                "hostName": "example.com",
                                "httpPort": 80,
                                "httpsPort": 443,
                                "originHostHeader": "example.com",
                                "priority": 1,
                                "weight": 1000,
                                "enabledState": "Enabled",
                                "sharedPrivateLinkResource": null,
                                "enforceCertificateNameCheck": true,
                                "provisioningState": "Succeeded",
                                "deploymentStatus": "NotStarted"
                            }
                        }
                    ]
                }
            ],
            "endpoints": [
                {
                    "id": "/subscriptions/7cc33115-0b1e-4673-87b5-1bf05712c34b/resourcegroups/rg-am5pel6bbs3sc/providers/Microsoft.Cdn/profiles/afd-hc4bybcoeyjaw/afdendpoints/fde-hc4bybcoeyjaw",
                    "type": "Microsoft.Cdn/profiles/afdendpoints",
                    "name": "fde-hc4bybcoeyjaw",
                    "location": "Global",
                    "tags": [],
                    "properties": {
                        "hostName": "fde-hc4bybcoeyjaw-e7f2ahf5d9a3bxew.a03.azurefd.net",
                        "autoGeneratedDomainNameLabelScope": null,
                        "enabledState": "Enabled",
                        "provisioningState": "Succeeded",
                        "deploymentStatus": "NotStarted"
                    },
                    "routes": [
                        {
                            "id": "/subscriptions/7cc33115-0b1e-4673-87b5-1bf05712c34b/resourcegroups/rg-am5pel6bbs3sc/providers/Microsoft.Cdn/profiles/afd-hc4bybcoeyjaw/afdendpoints/fde-hc4bybcoeyjaw/routes/route-hc4bybcoeyjaw",
                            "type": "Microsoft.Cdn/profiles/afdendpoints/routes",
                            "name": "route-hc4bybcoeyjaw",
                            "properties": {
                                "cacheConfiguration": null,
                                "customDomains": [],
                                "originGroup": {
                                    "id": "/subscriptions/7cc33115-0b1e-4673-87b5-1bf05712c34b/resourceGroups/rg-am5pel6bbs3sc/providers/Microsoft.Cdn/profiles/afd-hc4bybcoeyjaw/originGroups/origin-group-hc4bybcoeyjaw"
                                },
                                "originPath": null,
                                "ruleSets": [],
                                "supportedProtocols": [
                                    "Http",
                                    "Https"
                                ],
                                "patternsToMatch": [
                                    "/*"
                                ],
                                "forwardingProtocol": "MatchRequest",
                                "linkToDefaultDomain": "Enabled",
                                "httpsRedirect": "Enabled",
                                "enabledState": "Enabled",
                                "provisioningState": "Creating",
                                "deploymentStatus": "NotStarted"
                            }
                        }
                    ]
                }
            ]
        },
        "url": "https://portal.azure.com/#@sacloud03.onmicrosoft.com/resource/subscriptions/7cc33115-0b1e-4673-87b5-1bf05712c34b/resourceGroups/rg-am5pel6bbs3sc"
    }
    
Front door resource group

CDN のマネージドID の構成

  • Azure ポータルでリソースグループ内の Azure Front Door のリソースを開き、メニューの「ID」を選択します。

FrontDoorManagedId1
  • 「システム割り当て」を「オン」にし、「保存」を選択します。

FrontDoorManagedId2

Azure Key Vault の作成と RBAC の付与

Azure Key Vault の作成

リソースグループに Azure Key Vault を作成します。

  • 「+作成」を選択し、Azure Key Vault の作成を開始します。

CreateKeyVault1 CreateKeyVault2
  • 以下のように情報を入力し、「確認および作成」を選択します。

    • サブスクリプション:「gov_cloud_user_dev_subscription」を選択

    • リソースグループ:データレイクが作成されたリソースグループを選択

    • Key Vault名:任意の名前を入力

    • 地域:「Japan East」を選択

    • 価格レベル:「標準」を選択

    • 消去保護:「消去保護を有効にする」を選択

CreateKeyVault3
  • 入力内容の確認画面に進んだら「作成」を選択してキーコンテナーを作成してください。Azure Key Vault が作成されるまで数分かかります。

CreateKeyVault1
自身にRBACを付与
  • 作成した Azure Key Vault のリソースに移動し、「アクセス制御(IAM)」を選択し、「+追加」から「ロールの割り当ての追加」を選択します。

AssignKeyVaultAdministrator1
  • 職務ロールから「キー コンテナー管理者」を選択し、次へ進みます。

AssignKeyVaultAdministrator2
  • アクセスの割り当て先に「ユーザー、グループ、またはサービスプリンシパル」を選択し、「メンバーの選択」からガバメントクラウド利用者グループを選択し、次へ進みます。

AssignKeyVaultAdministrator3
  • 内容を確認し、「レビューと割り当て」を選択します。

AssignKeyVaultAdministrator4
  • 「アクセス制御[IAM]」>「アクセスの確認」>「マイアクセスの表示」を開いて「現在のロール割り当て」に「キーコンテナー管理者」が割り当てられていることを確認する。

AssignKeyVaultAdministrator1
CDN のマネージド ID への RBAC
  • 「自身にRBACを付与」と同様に、CDNのマネージドIDに対して「キーコンテナーシークレットユーザー」のRBACを付与します。

AssignKeyContainerSecretUser1 AssignKeyContainerSecretUser2

証明書の登録

  • 証明書を登録するには、PFX形式かPEM形式に事前に変換する必要があります。本手順では以下のコマンドを実行してPFX形式に変換を行っています。

    openssl pkcs12 -export \
      -out yourcert.pfx \
      -inkey {秘密鍵} \
      -in {サーバー証明書} \
      -certfile {中間証明書}
    
  • 作成した Azure Key Vaultのリソースの「証明書」に移動し、「+生成/インポート」を選択します。

SetCertification1
  • 以下のように情報を入力し、「作成」を選択します。(下記以外は初期値でよい)

    • 証明書の作成方法:インポート

    • 証明書の名前:任意の名前を入力

    • 証明書のファイルのアップロード:PFX形式の証明書ファイルをアップロード

    • パスワード:証明書にパスワードが設定されている場合は入力

SetCertification2
  • 証明書が作成されたことを確認します。

SetCertification3

CDN の独自証明書の設定

Azure Front Door で Azure Key Vault を利用するには、キーコンテナーへのAzure Front Doorのアクセス権を付与する必要があります。

FrontDoorSpRbac
  • ロールは「キーコンテナー シークレットユーザー」を選択し、サービスプリンシパルは Microsoft.AzureFrontDoor-Cdn を選択し、ロールを割り当てます。

FrontDoorSpRbacOption1
  • 再度Azure Key Vault の「アクセス制御(IAM)」を開き、ロール割り当てを追加します。

FrontDoorSpRbac
  • ロールは「キーコンテナー証明書責任者」を選択し、サービスプリンシパルは Microsoft.AzureFrontDoor-Cdn を選択し、ロールを割り当てます。

FrontDoorSpRbacOption2
  • Azure Front Doorの「セキュリティ」>「シークレット」タブを選択し、「証明書の追加」を選択します。

CreateFrontDoorCertification
  • 追加するキーコンテナーと証明書を選択します。証明書はバージョンも指定し、追加を選択します。

FrontDoorCertificationVersion
  • 下記キャプチャのように証明書が追加されていることを確認します。

AddFrontDoorCertification
  • 作成した Azure Front Doorのリソースに移動し、「ドメイン」を選択し、「+追加」を選択します。

AzureFrontDoorSettings1
  • 以下のように情報を入力し、「追加」を選択します。

    • ドメインの種類:Azure 以外の検証済みドメイン

    • DNS の管理:その他すべての DNS サービス

    • カスタムドメイン: usecase-e2.sakura-cs.tokyo を入力

    • 証明書の種類:Bring Your Own Certificate (BYOC)

    • シークレット:Azure Key Vault から選択

AzureFrontDoorSettings2
  • ドメインをエンドポイントとルートに関連付けます。右側の3点リーダーをクリックし、「関連付け」を選択します。

EndPointSettings
  • エンドポイントを選択し、「関連付け」を選択します。続いて、選択したエンドポイントに関連付けられているルートも併せて選択します。

ChoiceEndPointResource

カスタムドメインを利用してページを閲覧

  • 下記キャプチャようにカスタムドメインにアクセスしてオリジンのページ表示を確認します。

PageResult