このドキュメントでは、NHN Cloud CDNコンソールでCDNサービスを構成し、利用する方法を説明します。
Contents Delivery > CDNのCDNサービスタブで作成ボタンをクリックすると、CDNサービスの作成ダイアログボックスが表示されます。 CDNサービスドメインは[サービスID].toastcdn.net形式で自動生成されます。所有しているドメインをサービスドメインとして利用する場合は、ドメインエイリアス(domain alias)機能を利用できます。 作成をリクエストしてからサービスのデプロイが完了するまで、最大2時間かかります。デプロイが完了した後にサービスを利用できます。
[参考] CDN初回作成時のダウンロード最適化にかかる期間 CDNの初回作成後、最大3日間はダウンロード速度が多少遅くなる場合があります。
基本情報を設定します。

CDNサービスの説明を追加します。
TOAST CDNは、既定で[サービスID].toastcdn.net形式のサービスドメインアドレスを提供しています。
既定のサービスドメインアドレスではなく、所有するドメインでCDNサービスを利用するには、ドメインエイリアスで設定します。
所有するドメインでHTTPSプロトコルサービスを利用するには、まず証明書管理タブで証明書を発行してからドメインエイリアスを設定する必要があります。
ドメインエイリアスを設定した後は、ドメインのDNSサービスプロバイダーでCNAMEレコードを次のように登録する必要があります。DNSの設定については、DNSサービスプロバイダーにお問い合わせください。
- レコードタイプ: CNAME
- レコード名: [ドメインエイリアスに登録したドメイン]
- レコード値(Rdata): [サービスID].toastcdn.net
- TTL: 任意の値
CDNサービスの作成と変更操作(変更、一時停止/再開、削除)には数時間かかります。
操作が完了した後、設定したコールバックURLで変更状態とCDN設定情報を受信するには、コールバックを設定してください。コールバックで配信される情報については、APIガイドをご参照ください。
- HTTP MethodとコールバックURLを入力します。
- Query ParameterでCDNサービスの変更操作結果を受信するには、コールバックURLに次のパス(path)変数を含めて入力してください。
例: http://callback.url?appKey={appKey}&status={status}&isSuccessful={isSuccessful})
| パス(path)変数 | 説明 | 値の例 |
|---|---|---|
| {appKey} | CDNサービスのアプリキー | コンソールで発行したアプリキー |
| {domain} | CDNサービス名 | [サービスID].toastcdn.net |
| {status} | 現在のCDNサービス状態 | OPEN, SUSPEND, CLOSE, ERROR |
| {isSuccessful} | サービス変更操作の成否(API v1.0はサポートしていません) | "true" または "false" |
CDNサービスで配布するオリジナルファイルを提供するサーバーを設定します。

PUBLICであるコンテナのみをオリジンサーバーとして使用できます。コンテナがオリジンサーバーとして使用可能な場合、オリジンサーバーとオリジンパスにコンテナ情報が自動的に入力されます。オリジンサーバーは、CDNサービスで配布するオリジナルファイルを提供するサーバーです。オリジンサーバーはIPv4または全体ドメインアドレス(FQDN, fully qualified domain name)形式で入力できます。IPアドレスは変更される可能性が高いため、ドメインで設定することを推奨します。 稼働中のオリジンサーバーがない場合は、オリジンタイプのInstanceを選択してNHN Cloud Instanceサービスのインスタンスを使用するか、Object Storageを選択してNHN Cloud Object Storageサービスのコンテナを利用できます。 CDNサービスドメインでセキュア通信(HTTPS)をサポートするには、オリジンサーバーがHTTPS応答をサポートしている必要があります。 これは、オリジンサーバーにNHN Cloud CDNが信頼する証明書がインストールされている必要があるという意味です。 信頼する証明書については、次の表をご参照ください。 もし、オリジンサーバーがHTTPS応答をサポートできない場合は、オリジンリクエストのHTTPプロトコルダウングレード設定を利用してください。 ただし、オリジンリクエストのHTTPプロトコルダウングレードには制約事項があるため、オリジンサーバーがHTTPSプロトコルをサポートすることをおすすめします。
[表 1] 信頼する証明書一覧
| Common name | Expire Date | SHA-1 Fingerprint |
|---|---|---|
| SecureTrust CA | 1.Jan.30 | 8782c6c304353bcfd29692d2593e7d44d934ff11 |
| Entrust.net Certification Authority (2048) | 24.Jul.29 | 503006091d97d4f5ae39f7cbe7927d7d652d3431 |
| DigiCert Global Root CA | 10.Nov.31 | a8985d3a65e5e5c4b2d7d66d40c6dd2fb19c5436 |
| 30.Sep.23 | 36b12b49f9819ed74c9ebc380fc6568f5dacb2f7 | |
| QuoVadis Root CA 2 G3 | 13.Jan.42 | 093c61f38b8bdc7d55df7538020500e125f5c836 |
| thawte Primary Root CA | 17.Jul.36 | 91c6d6ee3e8ac86384e548c299295c756c817b81 |
| Go Daddy Root Certificate Authority - G2 | 1.Jan.38 | 47beabc922eae80e78783462a79f45c254fde68b |
| GeoTrust Primary Certification Authority | 17.Jul.36 | 323c118e1bf7b8b65254e2e2100dd6029037f096 |
| VeriSign Class 3 Public Primary Certification Authority - G4 | 19.Jan.38 | 22d5d8df8f0231d18df79db7cf8a2d64c93f6c3a |
| Entrust Root Certification Authority | 28.Nov.26 | b31eb1b740e36c8402dadc37d44df5d4674952f9 |
| 29.May.29 | 5f3b8cf2f810b37d78b4ceec1919c37334b9c774 | |
| AffirmTrust Commercial | 31.Dec.30 | f9b5b632455f9cbeec575f80dce96e2cc7b278b7 |
| Amazon Root CA 4 | 26.May.40 | f6108407d6f8bb67980cc2e244c2ebae1cef63be |
| Certum CA | 11.Jun.27 | 6252dc40f71143a22fde9ef7348e064251b18118 |
| DST Root CA X3 | 30.Sep.21 | dac9024f54d8f6df94935fb1732638ca6ad77c13 |
| TC TrustCenter Class 2 CA II | 1.Jan.26 | ae5083ed7cf45cbc8f61c621fe685d794221156e |
| SwissSign Gold CA - G2 | 25.Oct.36 | d8c5388ab7301b1b6ed47ae645253a6f9f1a2761 |
| USERTrust ECC Certification Authority | 19.Jan.38 | d1cbca5db2d52a7f693b674de5f05a1d0c957df0 |
| QuoVadis Root CA 2 | 25.Nov.31 | ca3afbcf1240364b44b216208880483919937cf7 |
| COMODO ECC Certification Authority | 19.Jan.38 | 9f744e9f2b4dbaec0f312c50b6563b8e2d93c311 |
| USERTrust RSA Certification Authority | 19.Jan.38 | 2b8f1b57330dbba2d07a6c51f70ee90ddab9ad8e |
| ISRG Root X1 | 4.Jun.35 | cabd2a79a1076a31f21d253635cb039d4329a5e8 |
| DigiCert High Assurance EV Root CA | 10.Nov.31 | 5fb7ee0633e259dbad0c4c9ae6d38f1a61c7dc25 |
| VeriSign Class 3 Public Primary Certification Authority - G5 | 17.Jul.36 | 4eb6d578499b1ccf5f581ead56be3d9b6744a5e5 |
| GlobalSign | 15.Dec.21 | 75e0abb6138512271c04f85fddde38e4b7242efe |
| QuoVadis Root CA 3 | 25.Nov.31 | 1f4914f7d874951dddae02c0befd3a2d82755185 |
| GlobalSign | 18.Mar.29 | d69b561148f01c77c54578c10926df5b856976ad |
| Starfield Services Root Certificate Authority - G2 | 1.Jan.38 | 925a8f8d2c6d04e0665f596aff22d863e8256f3f |
| Baltimore CyberTrust Root | 13.May.25 | d4de20d05e66fc53fe1a50882c78db2852cae474 |
| AAA Certificate Services | 1.Jan.29 | d1eb23a46d17d68fd92564c2f1f1601764d8e349 |
| Amazon Root CA 3 | 26.May.40 | 0d44dd8c3c8c1a1a58756481e90f2e2affb3d26e |
| VeriSign Class 3 Public Primary Certification Authority - G3 | 17.Jul.36 | 132d0d45534b6997cdb2d5c339e25576609b5cc6 |
| GlobalSign Root CA | 28.Jan.28 | b1bc968bd4f49d622aa89a81f2150152a41d829c |
| Actalis Authentication Root CA | 22.Sep.30 | f373b387065a28848af2f34ace192bddc78e9cac |
| AffirmTrust Networking | 31.Dec.30 | 293621028b20ed02f566c532d1d6ed909f45002f |
| AffirmTrust Premium | 31.Dec.40 | d8a6332ce0036fb185f6634f7d6a066526322827 |
| QuoVadis Root Certification Authority | 18.Mar.21 | de3f40bd5093d39b6c60f6dabc076201008976c9 |
| 6.Jun.37 | feb8c432dcf9769aceae3dd8908ffd288665647d | |
| GeoTrust Primary Certification Authority - G3 | 2.Dec.37 | 039eedb80be7a03c6953893b20d2d9323a4c2afd |
| thawte Primary Root CA - G2 | 19.Jan.38 | aadbbc22238fc401a127bb38ddf41ddb089ef012 |
| VeriSign Universal Root Certification Authority | 2.Dec.37 | 3679ca35668772304d30a5fb873b0fa77bb70d54 |
| Cybertrust Global Root | 15.Dec.21 | 5f43e5b1bff8788cac1cc7ca4a9ac6222bcc34c6 |
| Global Chambersign Root | 1.Oct.37 | 339b6b1450249b557a01877284d9e02fc3d2d8e9 |
| SwissSign Silver CA - G2 | 25.Oct.36 | 9baae59f56ee21cb435abe2593dfa7f040d11dcb |
| Amazon Root CA 1 | 17.Jan.38 | 8da7f965ec5efc37910f1c6e59fdc1cc6a6ede16 |
| Entrust Root Certification Authority - G2 | 8.Dec.30 | 8cf427fd790c3ad166068de81e57efbb932272d4 |
| Amazon Root CA 2 | 26.May.40 | 5a8cef45d7a69859767a8c8b4496b578cf474b1a |
| DigiCert Assured ID Root CA | 10.Nov.31 | 0563b8630d62d75abbc8ab1e4bdfb5a899b24d43 |
| 30.Jun.34 | 2796bae63f1801e277261ba0d77770028f20eee4 | |
| COMODO Certification Authority | 1.Jan.30 | 6631bf9ef74f9eb6c9d5a60cba6abed1f7bdef7b |
| AddTrust External CA Root | 30.May.20 | 02faf3e291435468607857694df5e45b68851868 |
| COMODO RSA Certification Authority | 19.Jan.38 | afe5d244a8d1194230ff479fe2f897bbcd7a8cb4 |
| thawte Primary Root CA - G3 | 2.Dec.37 | f18b538d1be903b6a6f056435b171589caf36bf2 |
| DigiCert Global Root G3 | 15.Jan.38 | 7e04de896a3e666d00e687d33ffad93be83d349e |
| GeoTrust Global CA | 21.May.22 | de28f4a4ffe5b92fa3c503d1a349a7f9962a8212 |
| DigiCert Global Root G2 | 15.Jan.38 | df3c24f9bfd666761b268073fe06d1cc8d4f82a4 |
オリジンサーバーはWebプロトコルをサポートするサービスとして稼働させる必要があります。稼働中のHTTP/HTTPSプロトコルのサービスポート番号を設定できます。
オリジンサーバーのポートはHTTPまたはHTTPSポートのいずれかを必ず入力する必要があり、設定していないポートは既定のポートであるHTTP:80、HTTPS:443として設定されます。
オリジンサーバーのポートは、制限されたポートのみ設定できます。設定可能なポート番号については、次の表をご参照ください。
[表 2] 使用可能なオリジンサーバーのポート番号
| ポート番号 |
|---|
| 72, 488, 1080, 1443, 7070 |
| 8000-9001 |
| 11080-11110 |
| 80-89 |
| 591, 1088, 2080, 7612 |
| 12900-12949 |
| 443, 777, 1111, 7001, 7777 |
| 9901-9908 |
| 45002 |
オリジナルファイルのパスのうち、下位パスを設定します。コンテンツをリクエストする際、オリジンパスを省略してリクエストできます。
[例] オリジンパスを /files/images に設定した場合
- オリジナルファイルのURL: http://your.origin.com/files/images/logo.png
- CDNサービスのURL: http://[サービスID].toastcdn.net/logo.png
- CDNサービスのURLからオリジンパス(/files/images)を省略してリクエストできます。
CDNエッジ(edge)サーバーは、オリジンサーバーにオリジナルファイルをリクエストする際、クライアントのオリジンへのリクエスト(request)のサービスプロトコル(HTTP/HTTPS)でリクエストします。 つまり、クライアントがHTTPSでリクエストし、オリジンサーバーがHTTPS応答をサポートしていない場合、CDNエッジサーバーからオリジンサーバーへリクエストする際にHTTPSプロトコルでリクエストするため、オリジナルファイルに対する応答を受信できません。 オリジンサーバーでHTTPプロトコルのみを稼働させている場合は、オリジンサーバーHTTPプロトコルダウングレード設定を使用し、CDNエッジサーバーからオリジンサーバーへリクエストする際にHTTPSプロトコルをHTTPプロトコルにダウングレードしてリクエストできます。 つまり、クライアントからCDNエッジサーバー間はセキュア通信(HTTPS)で通信し、CDNエッジサーバーからオリジンサーバー間は非セキュア通信(HTTP)で通信することになります。 オリジンリクエストのHTTPプロトコルをダウングレードする際には、次のような制約事項があります。
[注意] オリジンリクエストのHTTPプロトコルダウングレードに関する制約事項 - 全体サイトアドレスはプロトコルのダウングレードができません。例えば、オリジンサーバーの全体サイトアドレスである www.nhn.com はダウングレードできません。 -
GET、HEAD及びOPTIONSメソッド以外のメソッドはサポートされていません。 - CDNサーバーからオリジンサーバーへダウングレードをリクエストする際、次のヘッダは除外される場合があります。 >Origin,Referer,Cookie,Cookie2,sec-\*,proxy-\*
CDNサーバーがオリジンサーバーにオリジナルファイルをリクエストする際に渡すHostヘッダ値を設定します。
オリジンサーバーがName-based virtual hostとして稼働している場合、リクエストホストヘッダの設定が必要になる場合があります。オリジンサーバーの運用形態に応じて、適切な設定値を選択してください。
- オリジンホスト名: オリジンサーバーのホスト名をHostヘッダとして設定します。
- リクエストホストヘッダ: クライアントリクエストのHostヘッダとして設定します。
[注意] セキュア通信(HTTPS)使用時のHostヘッダとオリジンサーバー証明書の有効性検証 クライアントがセキュア通信(HTTPS)でコンテンツをリクエストすると、CDNサーバーはオリジンサーバー証明書の有効性を確認します。 オリジンサーバーには、
Hostリクエストヘッダと一致するCN(Common Name)またはSAN(Subject Alternate Name)の証明書がインストールされている必要があります。Hostリクエストヘッダと一致する証明書がオリジンサーバーにインストールされていない場合、セキュア通信エラーが発生します。HostリクエストヘッダはForward Host Headerの設定に応じてリクエストホストヘッダまたはオリジンホスト名として設定されるため、ご注意ください。
CDNサービスのルートパスに対するアクセス制御を設定できます。

ルートパスへのリクエストをリダイレクトするパスを入力します。Redirectパスは'/'で始まる必要があり、CDNサービスの下位に存在するパスである必要があります。
CDNで既定で許可するメソッドはGET、HEAD、OPTIONSであり、これ以外のメソッドをリクエストすると拒否されます。
該当メソッド以外のメソッドを許可するには、任意のメソッドを選択して設定します。

許可設定したメソッドのリクエストはキャッシュされず、オリジンサーバーに転送されます。
CDNキャッシュの動作設定と有効期限を設定できます。

CDNサーバーがオリジナルファイルをキャッシュする際に使用するキャッシュ設定を選択できます。
- オリジン設定の使用: オリジンサーバーの応答で提供されたキャッシュ制御ヘッダ(Cache-Control、Expires)を優先的に適用します。もしオリジンサーバーの応答にキャッシュ制御ヘッダ(Cache-Control、Expires)が有効でないか存在しない場合、キャッシュ有効期限(秒)で指定した期間キャッシュされます。オリジン設定の使用オプションが既定値です。
- ユーザー設定の使用: キャッシュ有効期限(秒)で指定した期間キャッシュされます。
- Bypass Cache: 該当設定以前に作成されたキャッシュは維持したまま、それ以降のコンテンツリクエストをキャッシュしません。
- No Store: 既存のキャッシュをすべて削除し、CDNキャッシュ機能を無効にします。
キャッシュ有効期限を指定するには、ユーザー設定の使用ボタンをクリックし、キャッシュ有効期限(秒)でキャッシュ有効期限を変更します。
URLベースで生成されるキャッシュキーにリクエストのクエリ文字列を含めるかどうかを設定できます。 - すべて含める: リクエストに含まれるすべてのクエリ文字列をキャッシュキーに含めます。キャッシュキーにリクエストのクエリ文字列が含まれるため、同じコンテンツリクエストに対してクエリ文字列が変更されるたびに新しいキャッシュキーが生成されます。リクエストのクエリ文字列を変更して新しくコンテンツをキャッシュする場合に選択します。すべて含めるオプションが既定値です。 - すべて除外: リクエストに含まれるクエリ文字列をすべて除外し、URLのみを使用してキャッシュキーを生成します。リクエストのクエリ文字列が継続的に変更される場合、該当オプションを設定することでキャッシュが動作します。
[参考] キャッシュ有効期限の既定値と有効範囲 キャッシュ有効期限の既定値は0です。既定値を0に設定すると、キャッシュ有効期限は604,800(単位/秒)=1週間になります。 キャッシュ有効期限は、既定値の0から2,147,483,647(単位/秒)まで入力できます。
100MB以上の大容量ファイルをサービスする際、パフォーマンスと安定性を高めるための設定です。設定しない場合、CDNで許可されるファイルの最大容量は1.8GB未満であり、1.8GB以上の大容量ファイルをサービスするには、本設定を必ず使用する必要があります。
[参考] NHN Cloud Object Storageサービスで作成したコンテナをオリジンサーバーとして使用する場合 Large File Optimization機能が正常に動作するには、オリジンサーバーから渡される
ETagレスポンスヘッダが二重引用符で囲まれた形式である必要があります。 NHN Cloud Object StorageコンテナでのETagレスポンスヘッダ形式の設定に関する詳細は、Object StorageサービスのAPIガイド内のコンテナ設定の変更 > RFCに準拠したETag形式の使用設定をご参照ください。
リファラーリクエストヘッダでコンテンツのアクセス管理を設定します。

リファラーリクエストヘッダには、現在リクエストされているページのリンク元Webページアドレスが含まれます。リファラーリクエストヘッダにより、どの経路からリクエストが流入したかを把握できます。リファラーヘッダのアクセス管理では、特定のリファラーリクエストヘッダのみがユーザーコンテンツにアクセスできるよう設定できます。 正規表現の形式で入力でき、複数入力する場合は改行して入力します。
リファラー(referer)リクエストヘッダがない場合のコンテンツアクセス許可の有無を選択します。 - 許可: リファラーリクエストヘッダがない場合はコンテンツへのアクセスを許可し、リファラーのアクセス制御は動作しません。 - 拒否: リファラーリクエストヘッダがない場合はコンテンツへのアクセスを拒否し、登録されたリファラーに対してのみアクセスを許可します。
[例] - タイプ: ホワイトリスト(whitelist) - 正規表現:
^https://[a-zA-Z0-9._-]*\.nhn\.com/.*> 任意のnhn.comサブドメインの下位パスからリソースをリクエストした場合にのみ、コンテンツへのアクセスを許可します。[参考] 正規表現のエスケープ文字 - 一部の文字は、正規表現において特殊文字として使用されます。 - ドット(
.)を例に挙げると、正規表現においてドット(.)はすべての文字と一致することを示す特殊文字です。 - 特殊文字としての意味ではなく、一般文字そのままとして解釈する必要がある場合は、エスケープ文字のバックスラッシュ(\)を特殊文字の前に追加します(例:\.)。 - 正規表現の特殊文字には、^ . [ ] $ ( ) | * + ? { } \などがあります。 - 複数のリファラーを制御する場合は、次の行に続けて入力します。 - APIを使用して複数のリファラーを設定する場合は、\nトークンで区切って入力します。
Auth Token認証のアクセス管理は、コンテンツのリクエストに認証トークンを追加し、CDNエッジサーバーで検証されたトークンのみコンテンツへのアクセスを許可するセキュリティ機能です。
一回限りでコンテンツへのアクセスを許可したり、制限されたユーザーのみがコンテンツにアクセスできるように制御できます。
トークンがない、または無効なトークンでコンテンツをリクエストした場合、403 Forbidden応答が送信され、コンテンツにアクセスできません。
Auth Token認証アクセスをCDNサービスに適用するには、次のステップに従って作業を行う必要があります。
[注意]
Auth Token認証のアクセス管理は、NHN Cloud CDNを利用してサービス中のアプリケーションでも以下の実装が必要です。 - コンテンツへのアクセスに必要なトークンを作成する必要があります。 - クライアント(最終コンテンツの消費者)が、作成されたトークンを含めてコンテンツをリクエストできるようにする必要があります。 > この作業を行わずにAuth Token認証のアクセス管理を設定した場合、トークンの検証失敗によってコンテンツのリクエストが失敗する可能性があるため、ご注意ください。
CDNコンソールで以下の内容を参考にして、Auth Token認証のアクセス管理を設定します。

tokenで固定された値であり、コンソール設定で変更できません。コンテンツへのアクセス時にトークンを認証するファイルの対象を設定します。
トークン認証対象のファイルである場合にのみトークンを検証し、認証対象のファイルでない場合はトークンの検証を行わないため、トークンなしでコンテンツにアクセスできます。
指定されたリクエストURLパスまたはファイル拡張子のみトークンの検証を行うには、リクエストURLパスと拡張子を入力してください。入力しない場合、すべてのファイルに対してトークンを検証します。
- 認証対象の設定: 設定されたリクエストURLパスとファイル拡張子のファイルのみトークンを検証します。
- 認証例外対象の設定: 設定されたリクエストURLパスとファイル拡張子を除外したファイルのトークンを検証します。
- リクエストURLパス: コンテンツのURLがリクエストURLパスと一致する場合、トークンの認証対象または例外対象として設定します。
- リクエストURLパスは'/'で始まる必要があり、ワイルドカード文字(複数文字列: *、単一文字: ?)を使用できます(例: /nhn/*)。
- リクエストURLパスにはクエリ文字列を含めません。
- リクエストURLパスはASCII(アスキー)コード文字のみ入力可能です。
- 複数を入力するには、次の行に入力してください。複数を入力した場合、1つでも一致すればトークンのアクセス制御が動作します。
- ファイル拡張子とともに入力した場合には、ファイル拡張子の条件が一致してもトークンのアクセス制御が動作します。
- ファイル拡張子: コンテンツのURLがファイル拡張子と一致する場合、トークンの認証対象または例外対象として設定します。
- '.'を含まないファイル拡張子を入力します(例: pdf, png)。
- 複数を入力するには、次の行に入力してください。複数を入力した場合、1つでも一致すればトークンのアクセス制御が動作します。
- リクエストパスURLとともに入力した場合には、リクエストパスURLの条件が一致してもトークンのアクセス制御が動作します。
[注意] リクエストURLパスとファイル拡張子 リクエストURLパスとファイル拡張子の両方を設定した場合、2つの条件のうち1つでも一致すればトークンのアクセス制御が動作します。 [例] リクエストURLパス
/nhn/\*、ファイル拡張子pngが設定された場合: /nhn配下のすべてのファイル、またはファイル拡張子がpngであるコンテンツに対してトークンを検証します。
最終コンテンツユーザーがコンテンツにアクセスするには、トークンとともにコンテンツをリクエストする必要があります。したがって、トークンを生成して最終コンテンツユーザーに発行する必要があります。 トークンの生成は、NHN Cloud CDNを利用してサービス中のアプリケーションで実装される必要があります。 トークンの生成方法は、次のサンプルコードを参考にしてトークンを生成します。
import org.apache.commons.lang3.StringUtils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Calendar;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class NhnCloudAuthTokenAccessControlExample {
// NHN Cloudコンソールで確認した認証トークンの暗号化キー
private static final String AUTH_TOKEN_ENCRYPT_KEY = "{NHN Cloud CDNサービスのトークン暗号化キー}";
// トークン有効時間(seconds)
private static final Long TOKEN_DURATION_SECONDS = 3600L;
public static void main(String[] args) throws AuthTokenException {
String path = "/nhn/%EC%9D%B8%EC%A6%9D/%E1%84%91%E1%85%A1%E1%84%8B%E1%85%B5%E1%86%AF.png";
String singleWildcardPath = "/nhn/%EC%9D%B8%EC%A6%9D/*";
String[] multipleWildcardPath = {"/nhn/%EC%9D%B8%EC%A6%9D*", "/nhn/auth/*"};
System.out.println(" ----------------- ");
System.out.println(" 基本トークン発行 ");
System.out.println(" ----------------- ");
AuthToken authToken = new AuthToken(AUTH_TOKEN_ENCRYPT_KEY, TOKEN_DURATION_SECONDS);
System.out.println("単一URLトークン: token=" + authToken.generateURLToken(path));
System.out.println("ワイルドカードトークン: token=" + authToken.generateWildcardPathToken(singleWildcardPath));
System.out.println("マルチワイルドカードトークン: token=" + authToken.generateWildcardPathToken(multipleWildcardPath));
System.out.println(" ----------------- ");
System.out.println(" セッション識別子を含めたトークン発行 ");
System.out.println(" ----------------- ");
AuthToken authTokenWithSession = new AuthToken(AUTH_TOKEN_ENCRYPT_KEY, TOKEN_DURATION_SECONDS, "example-sessionId");
System.out.println("単一URLトークン: token=" + authTokenWithSession.generateURLToken(path));
System.out.println("ワイルドカードトークン: token=" + authTokenWithSession.generateWildcardPathToken(singleWildcardPath));
System.out.println("複数ワイルドカードトークン: token=" + authTokenWithSession.generateWildcardPathToken(multipleWildcardPath));
}
public static class AuthToken {
/** トークン暗号化アルゴリズム(SHA256固定) **/
private static final String HMAC_SHA_256 = "HmacSHA256";
/** トークン暗号化キー (NHN Cloud CDNコンソール > Auth Token認証アクセス管理 > 暗号化キー) **/
private String key;
/** セッション識別子 */
private String sessionId;
/** トークンの有効時間(単位: 秒) */
private Long durationSeconds;
/** トークン生成前のurl encode適用有無 */
private Boolean escapeEarly;
/** トークンBodyフィールドの区切り文字 */
private final String fieldDelimiter = "~";
/** wildcardPath区切り文字 */
private final String aclDelimiter = "!";
public AuthToken(String key, Long durationSeconds) {
this.key = key;
this.sessionId = null;
this.durationSeconds = durationSeconds;
this.escapeEarly = true;
}
public AuthToken(String key, Long durationSeconds, String sessionId) {
this.key = key;
this.sessionId = sessionId;
this.durationSeconds = durationSeconds;
this.escapeEarly = true;
}
/**
* 単一URLに対するトークンを生成します。
* @param path : contents url (example: /auth/contents/example.png)
* @return created token
* @throws AuthTokenException
*/
public String generateURLToken(String path) throws AuthTokenException {
return generateToken(createExpireTime(), this.sessionId, path, null);
}
/**
* ワイルドカードパスに対するトークンを生成します。
* @param wildcardPath : "/auth/contents/*"
* @return 生成されたトークン値
* @throws AuthTokenException
*/
public String generateWildcardPathToken(String wildcardPath) throws AuthTokenException {
return generateWildcardPathToken(new String[] {wildcardPath});
}
/**
* 複数のワイルドカードパスに対するトークンを生成します。
* @param wildcardPaths (example: ["/auth/contents/*", "/auth/*/images/*"])
* @return 生成されたトークン値
* @throws AuthTokenException
*/
public String generateWildcardPathToken(String... wildcardPaths) throws AuthTokenException {
return generateToken(createExpireTime(), this.sessionId, null, wildcardPaths);
}
private String createExpireTime() {
Long nowSeconds = Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTimeInMillis() / 1000L;
Long exp = nowSeconds + this.durationSeconds;
return exp.toString();
}
private String generateToken(String exp, String sessionId, String path, String[] wildcardPaths) throws AuthTokenException {
try {
StringBuilder token = new StringBuilder();
token.append("exp=")
.append(exp)
.append(this.fieldDelimiter);
if (wildcardPaths != null && wildcardPaths.length > 0) {
token.append("acl=")
.append(escapeEarly(StringUtils.join(wildcardPaths, this.aclDelimiter)))
.append(this.fieldDelimiter);
}
if (sessionId != null && sessionId.length() > 0) {
token.append("id=")
.append(escapeEarly(sessionId))
.append(this.fieldDelimiter);
}
StringBuilder hashSource = new StringBuilder(token);
if (path != null && path.length() > 0) {
hashSource.append("url=")
.append(escapeEarly(path))
.append(this.fieldDelimiter);
}
// remove last fieldDelimiter char
hashSource.deleteCharAt(hashSource.length() - 1);
Mac hmac = Mac.getInstance(HMAC_SHA_256);
byte[] keyBytes = DatatypeConverter.parseHexBinary(this.key);
SecretKeySpec secretKey = new SecretKeySpec(keyBytes, HMAC_SHA_256);
hmac.init(secretKey);
byte[] hmacBytes = hmac.doFinal(hashSource.toString().getBytes());
return token.toString() + "hmac=" + String.format("%0" + (2 * hmac.getMacLength()) + "x", new BigInteger(1, hmacBytes));
} catch (NoSuchAlgorithmException e) {
throw new AuthTokenException(e.getMessage());
} catch (InvalidKeyException e) {
throw new AuthTokenException(e.getMessage());
}
}
private String escapeEarly(final String text) throws AuthTokenException {
if (this.escapeEarly == true) {
try {
StringBuilder newText = new StringBuilder(URLEncoder.encode(text, "UTF-8"));
Pattern pattern = Pattern.compile("%..");
Matcher matcher = pattern.matcher(newText);
String tmpText;
while (matcher.find()) {
tmpText = newText.substring(matcher.start(), matcher.end()).toLowerCase();
newText.replace(matcher.start(), matcher.end(), tmpText);
}
return newText.toString();
} catch (UnsupportedEncodingException e) {
return text;
} catch (Exception e) {
throw new AuthTokenException(e.getMessage());
}
} else {
return text;
}
}
}
public static class AuthTokenException extends Exception {
private static final long serialVersionUID = 1L;
public AuthTokenException(String msg) {
super(msg);
}
}
}
key: NHN Cloud CDNコンソールに表示されたAuth Token認証アクセス管理 > トークン暗号化キーを入力します。sessionId: 単一アクセスリクエストに対する固有識別子を含めてトークンを生成するには、sessionIdを入力します。durationSeconds: 生成されたトークンが有効な時間(秒)。有効時間が過ぎたトークンはトークン認証に失敗します。public String generateURLToken(String path)/nhn/認証/ファイル.png => /nhn/%EC%9D%B8%EC%A6%9D/%E1%84%91%E1%85%A1%E1%84%8B%E1%85%B5%E1%86%AF.png)。!、~の文字は予約された文字として使用されるため、パスまたはセッションIDに含めないようにします。public String generateWildcardPathToken(String wildcardPath), public String generateWildcardPathToken(String... wildcardPaths)/nhn/認証/ファイル.png => /nhn/%EC%9D%B8%EC%A6%9D/%E1%84%91%E1%85%A1%E1%84%8B%E1%85%B5%E1%86%AF.png)。!、~の文字は予約された文字として使用されるため、パスまたはセッションIDに含めないようにします。exp={expirationTime}~acl={path!path!path}~id={sessionId}~hmac={HMAC}形式で生成されます。exp=1600331503~acl=%2fnhn%2f*.png~id=session-id1~hmac=2509123dcabe2fc199e3ac44793e4e135a09590ff4ebf6a902ea26469ead7f91クライアント(最終コンテンツユーザー)がコンテンツリクエスト時、コンソールで設定したトークンの位置に、生成されたトークン値を含めてリクエストするようにします。
curl --cookie "token={生成されたトークン値}" \
-X GET http://xxx.toastcdn.net/auth/contents/example.pngcurl -H "token: {生成されたトークン値}" \
-X GET http://xxx.toastcdn.net/auth/contents/example.pngcurl -d "token={生成されたトークン値}" \
-X GET http://xxx.toastcdn.net/auth/contents/example.pngCDNからユーザーに応答する際に渡されるヘッダを追加/変更/削除する機能です。
ヘッダは重複しないヘッダ名で最大10個まで設定できます。

Access-Control-Allow-Origin、Cache-Control、Content-Typeなどのヘッダ名を一覧から選択するか、「直接入力」を選択してユーザーが定義したカスタムヘッダ名を設定できます。[参考] CORS(Cross-Origin Resource Sharing)の設定 以下のようにHTTPレスポンスヘッダを設定してCORSを許可できます。 - Action: Modify - ヘッダ名:
Access-Control-Allow-Origin- ヘッダ値:*(ワイルドカード)または許可するオリジンURI
サービスドメイン名を除くCDNサービスの設定を変更できます。

次のようにCDNサービス修正ページに移動します。

説明とコールバック設定を除く他の設定を変更するには、全体のCDNサーバーに反映する必要があるため、時間がかかる場合があります。修正作業は数十分以内に完了しますが、ドメインエイリアスの設定が変更された場合は数時間かかることがあります。
[参考] CDNサービス修正中のデプロイ状態とサービス状態 サービスの修正作業が進行中の場合、既存のCDNサービス設定で運用されます。 もし修正作業に失敗すると既存の設定情報にロールバックされ、CDNサービス一覧のデプロイ状態が赤い円で表示されます。設定情報にエラーがあるか、または内部的にエラーが発生した際に修正作業に失敗します。
CDNサービスを一時的に停止したり、再開したりできます。


[参考] 一時停止と再開の動作遅延 CDNサービスの一時停止と再開は、CDNサービスドメインのDNSレコードを変更して動作します。 したがって、キャッシュDNSサーバーでTTLの期間キャッシュされていたり、DNSの伝播状況によっては、一時停止/再開が完了しても即座に一時停止/再開が動作しない場合があります。
[注意] 発行された証明書が連携されたCDNサービスの一時停止 証明書が連携されたCDNサービスを一時停止する場合、更新ができません。 証明書管理 > 証明書一覧の証明書の更新開始日より前にCDNサービスを再開してください。 証明書の更新開始日から5日間は証明書の更新期間であるため、該当期間に一時停止すると期限切れになる可能性があるためご注意ください。
CDNサービスを削除します。削除作業は復元できないためご注意ください。

[参考] CDNサービスの削除にかかる時間 CDNサービスの削除作業は数時間(最大2~3時間)かかる場合があります。
[注意] 発行された証明書が連携されたCDNサービスの削除 証明書が連携されたCDNサービスを削除すると、証明書を更新できません。 証明書管理の証明書一覧から、証明書の更新開始日より前にサービス中の他のCDNサービスへ連携してください。 証明書の更新開始日から5日間は証明書の更新期間であるため、該当期間に削除すると期限切れになる可能性があるためご注意ください。
CDNキャッシュサーバーは、キャッシュ設定に従って指定された有効期限の間、オリジンサーバーのファイルをキャッシュします。ファイルをキャッシュすると、オリジナルファイルが変更されてもキャッシュの有効期限が切れるまでは変更前のオリジナルファイルを維持します。 変更されたオリジナルファイルでコンテンツを即時にアップデートするには、パージをリクエストする必要があります。 パージを実行すると、リクエストしたコンテンツの古いキャッシュデータを削除し、オリジンサーバーから新しいオリジナルファイルを再度キャッシュします。
パージタブを選択し、パージボタンをクリックします。

パージタイプを選択します。
パージには使用量制限があるため、以下の表を参考にして使用量を超過しないようご注意ください。
| 分類 | [サービスID].toastcdn.net |
|---|---|
| 制限単位 | プロジェクト別(Appkey) |
| 特定のファイル | 1秒あたりのリクエスト可能回数: 1回、リクエストごとのURL数の制限: 200 URL |
| すべてのファイルタイプ | 5分あたりのリクエスト可能回数: 1回 |
[注意] [サービスID].toastcdn.netサービスの作成後にパージ失敗エラーが発生する場合 CDNサービスを作成してから約1時間以内は、パージリクエストが失敗する場合があります。それ以降も継続して失敗する場合は、NHN Cloudカスタマーサポートにお問い合わせください。
ネットワーク転送量、HTTPステータスコード別の統計、およびダウンロード数が最も多いコンテンツのランキング統計を確認できます。 7日以内の統計データは正確ではないため、参考用としてのみご利用ください。正確な統計データは7日以降にご確認ください。

[参考] 最大検索期間 直近90日間の統計データのみ照会可能です。
ドメインエイリアス(Domain Alias)は、NHN Cloud CDNで既定で提供される[サービスID].toastcdn.netドメインの代わりに、お客様が所有するドメインでCDNサービスを利用できる機能です。 ドメインエイリアスを使用するには、ドメインエイリアスタブでドメインを登録した後、所有権の検証を完了し、CDNサービスのドメインエイリアス項目に連携させる必要があります。所有するドメインでHTTPSプロトコルサービスを利用するには、証明書管理タブで証明書を発行してください。
[参考] ドメインエイリアスを利用したHTTPSサービスの設定フロー
所有するドメインでHTTPSプロトコルサービスを利用するには、以下の手順を順番に進める必要があります。
HTTPのみを使用する場合は、② 証明書発行のステップを省略できます。① ドメインの登録および所有権の検証(ドメインエイリアスタブ) ↓ ② 証明書の発行およびドメイン検証(証明書管理タブ、HTTPS利用時は必須) ↓ ③ CDNサービスにドメインエイリアスを連携(CDNサービスタブ) ↓ ④ CDNサービスドメインのDNS CNAMEレコード設定(DNSサービスプロバイダー)
ドメインエイリアスタブでドメインを登録できます。
[注意] ドメイン登録時の確認事項 - 全体ドメインアドレス(FQDN)形式のみ入力できます(例: cdn.example.com)。 - すでに登録されているドメインは重複して登録できません。
登録したドメインの所有権を確認するため、ドメイン検証を進める必要があります。
ドメインの検証方式には、DNS TXTレコードの追加、HTTPファイル認証、HTTPリダイレクト認証の3つの方式があり、いずれか1つの方式のみ進めれば問題ありません。
ドメインエイリアスタブで登録したドメインを選択すると、検証に必要な情報と検証方法を確認できます。
ドメインのDNS制御権限を確認し、ドメインを検証します。
TXT60。60に設定できない場合は、可能な限り小さく設定してください。レコード名の値を入力します。レコード値を入力します。ドメインが紐付けられたWebサーバーにHTTPページを追加し、ドメインを検証します。
HTTPページURLパスに、Webサーバーからアクセス可能なページを作成します。ページコンテンツ(トークン)の値を設定します。[注意] HTTPファイル認証方式は、HTTPの既定ポート(80)で運用中のWebサーバーでのみ使用できます。
ドメインが紐付けられたWebサーバーにリダイレクトを設定し、ドメインを検証します。
リダイレクト元URLに対して、リダイレクト先URLへHTTP 301または302リダイレクトを設定します。[注意] ドメイン検証に関する注意事項 1. ドメイン検証トークンは、登録日から14日間有効です。期間内に検証が完了しない場合、トークンは期限切れとなり、トークンの再発行後に再度検証する必要があります。 2. トークンが期限切れになった場合、コンソールでトークン再発行ボタンをクリックして新しい検証トークンを発行できます。トークンが再発行されると以前の検証情報は初期化されるため、新しいトークン情報で再度検証を進める必要があります。 3. ドメイン検証が完了すると、状態が検証完了に変更され、CDNサービスに連携できるようになります。
[表] ドメインエイリアスの検証状態
| 状態 | 説明 |
|---|---|
| 検証待機 | ドメインが登録され、検証を待機している状態 |
| 検証進行中 | ドメイン所有権の検証が進行中の状態 |
| 検証完了 | ドメイン所有権の検証が完了し、CDNサービスに連携可能な状態 |
| 検証トークン期限切れ | 検証トークンが期限切れになった状態(トークン再発行後に再検証が必要) |
ドメインの検証が完了すると、CDNサービスにドメインエイリアスを連携できます。
CNAME[ドメインエイリアスに登録したドメイン][サービスID].toastcdn.net[参考] ドメインエイリアス変更時の所要時間 ドメインエイリアスが変更された場合、サービスの修正作業に1時間以上かかることがあります。
[注意] ドメインエイリアス変更時の証明書に関する注意事項
ドメインエイリアスからCDN証明書のドメインを削除した場合、証明書が期限切れになる可能性があります。
証明書を継続して維持するには、ドメインエイリアスを再度追加して認証した後、CDNサービスに再びドメインエイリアスとして連携させてください。
登録したドメインエイリアスを削除できます。
[注意] ドメイン削除時の確認事項 CDNサービスに連携されたドメインは削除できません。ドメインを削除するには、まずCDNサービスからドメインエイリアスの連携を解除してから削除してください。
所有するドメインでコンテンツをセキュア通信(HTTPS)で送信するには、CDNサーバーに所有するドメインの証明書をデプロイする必要があります。証明書がない場合、クライアント(ブラウザ)とCDNエッジサーバー間でセキュア通信(HTTPS)を行うことができず、証明書エラーが発生します。 NHN Cloud CDNの証明書管理では、以下の機能を提供しています。
証明書管理タブで証明書を発行できます。

[注意] 証明書発行前の確認事項 1. ご自身で所有しているドメインに対してのみ証明書を発行できるため、あらかじめドメインを購入した上で作業を進めてください。 2. 外部の認証局(CA, certificate authority)で発行された証明書は利用できません。 3. 単一ドメインの証明書のみ発行可能です。ワイルドカード証明書やマルチドメイン証明書には対応していません。 4. 証明書の発行上限は、1プロジェクトあたり5個までとなります。上限の引き上げをご希望の場合は、NHN Cloudカスタマーサポートにお問い合わせください。 5. 新規証明書の発行リクエスト後、ステータスがドメイン検証待ちに変わるまで数十分(最大1〜2時間)かかる場合があります。ステータスが変更されると、NHN Cloudプロジェクトのメンバー宛てに通知メールが送信されます。システムエラー等でメールが届かない場合は、コンソール画面から状態をご確認ください。
新規証明書の発行リクエスト後、ステータスがドメイン検証状態に変わったら、以下の手順でドメイン検証を行ってください。 詳細なドメイン検証手順については、コンソール上で対象ドメインを選択して確認するか、プロジェクトメンバー宛てに送信されるガイドメールの内容をご参照ください。

ドメイン検証とは、発行リクエストしたドメインの実際の所有者であることを証明するための手続きです。この検証を完了しない限り、証明書は発行されません。 所有権を証明するため、指定された方式を用いてドメインの制御権限があることを確認します。 検証方式には「DNS TXTレコードの追加」と「HTTPページの追加」の2種類があり、いずれか一方の方式で検証を完了させてください。

ドメインのDNS制御権限を利用して検証を行います。
ドメインのDNSサービスプロバイダーのDNS管理ページでTXTレコードを追加します。 DNSの設定方法はDNSサービスプロバイダーによって異なる場合があります。関連する設定については、該当サービスプロバイダーにお問い合わせください。
TXT60。60に設定できない場合は、可能な限り小さく設定してください。_acme-challenge.[対象ドメイン]. (コンソール画面、またはガイドメールに記載されているレコード名を入力します)nslookup コマンドを使用して、追加したTXTレコードが正しく引けるか(名前解決できるか)を確認します。DNSの伝播状況によっては、反映されるまでに時間がかかる場合があります。
nslookup -type=TXT _acme-challenge.[対象ドメイン].
以下の画面は、NHN Cloud DNS+サービスでの設定例です。具体的な設定手順は、ご利用のDNSサービスプロバイダーによって異なります。

ドメインが紐付けられているWebサーバーに指定のHTTPページを配置して検証を行います。
http://[対象ドメイン]/.well-known/acme-challenge/[指定された文字列] のパスにHTTPページを作成します。http://[発行リクエストした証明書のドメイン]/.well-known/acme-challenge/[任意の文字列] URLにアクセスし、ページコンテンツ(トークン)の値が画面に表示されるか確認します。[注意] ドメイン検証に関する注意事項 - ドメイン検証は、証明書の発行リクエスト日から5日以内に行う必要があります。期間内に行われない場合、証明書の発行は自動的にキャンセルされます。 - ドメイン検証作業の完了後、検証に成功すると通常数時間以内に証明書の発行およびデプロイ作業が開始されます。1日以上進まない場合は、検証用の設定(DNSレコードやHTTPページ)が正しいか再確認してください。設定に問題がないにもかかわらず進展しない場合は、NHN Cloudカスタマーサポートにお問い合わせください。 - 「HTTPページ追加方式」は、WebサーバーがHTTPの既定ポート(80番)で稼働している場合のみ利用可能です。80番ポートを使用できない環境の場合は、「DNS TXTレコード追加方式」をご利用ください。
ドメイン検証を通過すると、数時間以内に証明書の発行およびCDNサーバーへのデプロイ作業が開始されます。 コンソール上のステータスが証明書発行およびデプロイに変わり、NHN Cloudプロジェクトのメンバー宛てに通知メールが送信されます。 お客様側で対応が必要な作業はありません。デプロイの完了をお待ちください。
[参考] 証明書の発行およびデプロイにかかる時間 証明書の発行およびデプロイ処理が完了するまでに、最大で9時間以上かかる場合があります。
発行された証明書を利用するには、対象のCDNサービスに連携させる必要があります。 連携作業を行わない場合や、連携設定を解除してしまった場合、証明書の自動更新が行われず期限切れとなる恐れがあるためご注意ください。
CNAMEレコードの設定: 対象ドメインのDNS管理画面(ご利用のDNSプロバイダー)にて、以下のCNAMEレコードを追加します。
CNAME[証明書のドメイン]. (例: test.alias.com.)[連携先のCDNサービスドメイン] (例: xxxxxxxx.toastcdn.net)
以下の画面は、NHN Cloud DNS+サービスでの設定例です。具体的な設定手順は、ご利用のDNSサービスプロバイダーによって異なります。

ドメインエイリアスの設定: 証明書を適用するCDNサービスに、ドメインエイリアスを設定します。

[参考] CNAMEレコードの伝播時間 CNAMEレコードを設定した際、DNSの伝播(浸透)には時間がかかる場合があります。そのため、連携設定を正しく完了していても、しばらくの間は証明書のステータスが「CDNサービス連携待機」のままとなることがあります。 設定が正しいにもかかわらず、24時間以上「CDNサービス連携待機」からステータスが変わらない場合は、設定内容をご確認の上、NHN Cloudカスタマーサポートにお問い合わせください。
[注意] 証明書の期限切れに関する注意事項 NHN Cloud CDNで発行された証明書は、有効期限を迎える前に自動的に更新処理が行われます。 自動更新は、証明書一覧に表示されている「更新開始日」から5日以内に実行されます。 自動更新を正常に完了させるには、以下の条件をすべて満たしている必要があります。 条件を満たしていない場合、更新処理が失敗し、証明書が期限切れとなる恐れがありますのでご注意ください。
- 証明書のドメインから、連携先のCDNサービスドメイン(xxxxx.toastcdn.net)へCNAMEレコードで正しく委任されていること。
- 連携先のCDNサービス側で、ドメインエイリアスとして該当のドメインが設定されていること。
- 証明書が連携されているCDNサービスを「一時停止」にすると、自動更新は行われません。 > - 更新開始日を迎える前にサービスを「再開」するか、稼働中の別のCDNサービスへ証明書を付け替えてください。
- 証明書が連携されているCDNサービスを「削除」すると、自動更新は行われません。 > - サービスを削除する前に、稼働中の別のCDNサービスへ証明書を付け替えてください。
- 対象ドメインのネームサーバー(NS)やDNS設定が、正常な状態で維持されていること。 > - DNSエラー(無効なネームサーバー、CAAレコードの応答不可など)が発生していると、証明書の発行および更新に失敗します。エラーが放置されると、最終的に証明書が期限切れになる場合があります。
CDNサービスへの連携が完了すると、証明書のステータスが「正常」と表示されます。

[参考] クライアント側で証明書エラーが発生する場合の対処方法 NHN Cloud CDNで発行される証明書のルート証明書の1つ(IdenTrust DST Root CA X3)は、2021年9月30日に期限切れになり、一部の古い端末や旧型ブラウザで問題が発生する場合があります。 エンドユーザーの環境で
ERR_CERT_DATE_INVALID等のエラーが発生する場合は、OSのアップデートを実施するか、新しいルート証明書(ISRG Root X1)を手動でインストールするようご案内ください。 - ISRG Root X1 証明書のダウンロード: ダウンロードリンク - Windows OSでのルート証明書インストール手順(参考): リンク - Chromeブラウザでの対応手順(参考): リンク