はじめに
サーバ証明書の有効期間は年々短くなっており、CA/Browser Forum で最終的に 47日 まで短縮するロードマップが採択されています。更新頻度が上がると、手動での証明書更新では作業負荷が増え、更新漏れや作業ミスのリスクも大きくなります。
本記事で使用した A10 Networks の A10 Thunder(ACOS 6.0.8) では、内蔵の ACMEクライアント機能 により、外部の ACMEクライアント(certbot など)を用いずに証明書の取得・自動更新ができることを確認しました。
この記事では、検証用 ACMEサーバ Pebble を使い、証明書の取得から SSL オフロードの VIP への適用までの手順と確認方法をまとめます。
本記事は個人で実施した検証結果をまとめたものです。所属組織の公式見解ではありません。
この記事で分かること
- 証明書の有効期間短縮の動向と、ACME による自動化が必要な理由
- ACME(HTTP-01 チャレンジ)の仕組み
- A10 Thunder(ACOS 6.0.8)での ACME 設定(CLI)
- 取得した証明書の確認方法
この記事で扱わないこと
- Thunderの冗長構成(複数台構成)での ACME 運用(後日、別記事で掲載予定です)
- DNS-01 チャレンジ
- 証明書更新に失敗した際の通知機能
- Pebbleの設定
検証環境
| 項目 | 内容 |
|---|---|
| ADC | A10 Thunder TH1060 |
| OS | ACOS 6.0.8 |
| ACMEサーバ | Pebble(Let's Encrypt が開発・公開している検証用 ACMEサーバのソフトウェア。検証環境内に構築して使用) |
| ACMEサーバのサーバ証明書 | ACOS に組み込まれた信頼CAリストで検証できる CA から発行された証明書に差し替えて使用(理由は後述) |
| ACMEディレクトリ URL |
https://acme-test-2026.acme.local:14060/dir(記事用の表記。実際の検証環境とは異なる) |
| VIP | 172.16.26.100 |
| 証明書に含める FQDN | www1.test.ex / www2.test.ex / www3.test.ex(いずれも 172.16.26.100 に名前解決) |
| 構成 | Thunder 1台(単体構成) |
記事中の FQDN・IP アドレス・メールアドレスは記事用に置き換えたもので、実際に検証で使用したものとは異なります。
証明書の有効期間短縮の動向
CA/Browser Forumが定める公開TLS証明書の最長有効期間と、Let's Encryptが独自に予定している有効期間の短縮を、時系列で示します。
| 時期 | 主体 | 内容 |
|---|---|---|
| 2020/9/1 | Apple | Apple製品では、2020年9月1日以降に発行された公開TLSサーバ証明書について、398日を超える有効期間を受け入れない制限が適用 |
| 2025/4/11 | CA/B Forum | 最長有効期間を 200日 → 100日 → 47日 に段階的に短縮するロードマップを採択 |
| 2026/3/15 | CA/B Forum | 最長 200日 |
| 2027/2/10 | Let's Encrypt | 最長 64日(予定) |
| 2027/3/15 | CA/B Forum | 最長 100日 |
| 2028/2/16 | Let's Encrypt | 最長 45日(予定) |
| 2029/3/15 | CA/B Forum | 最長 47日 |
有効期間が47日になると、単純計算でも年間8回程度の証明書発行・更新サイクルが発生します。台数が多い環境では、手動運用の負荷や更新漏れのリスクがさらに高まります。
ACME とは
ACME(Automatic Certificate Management Environment)は、証明書の申請・ドメイン所有権の確認・発行・更新を自動化するプロトコルで、RFC 8555 として標準化されています。ACMEクライアントと ACMEサーバ間の通信には HTTPS が使われます。
ACME(HTTP-01)の仕組み
役割
| 主な役割 | |
|---|---|
| ACMEクライアント(Thunder) | アカウント登録(初回)、証明書の申請・更新、チャレンジへの応答、証明書の取得と設定 |
| ACMEサーバ/CA(本検証ではPebble) | アカウント登録(初回)、チャレンジによるドメイン所有権の検証、サーバ証明書の発行、および証明書チェーンの提供 |
発行の流れ
- ACMEクライアントが、証明書の対象とする FQDN を指定して ACMEサーバに発行を申請する。
- ACMEサーバが FQDN ごとに token を発行して通知する。
- ACMEクライアントが token とアカウント鍵から keyAuthorization を算出し、次の URL で応答できるようにしたうえで、ACMEサーバに検証の準備ができたことを通知する。
http://<FQDN>/.well-known/acme-challenge/<token> - ACMEサーバが FQDN を名前解決して上記 URL(TCP/80)にアクセスし、正しい keyAuthorization が返るか照合する。これにより ACMEサーバは、「申請者(ACMEクライアント)がその FQDN の HTTP 応答を制御できる」ことを確認する。
- すべての FQDN の検証に成功したら、ACMEクライアントが CSR(対象 FQDN を SAN に記載)を送信する。ACMEサーバ(CA)はサーバ証明書を発行し、サーバ証明書と必要な中間CA証明書で構成される証明書チェーンをACMEクライアントに提供する。
- ACMEクライアントが証明書を取得して設定する。
- HTTP-01 では ワイルドカード証明書は取得できません
- A10 Thunder がサポートするのは HTTP-01 のみ で、DNS-01 には対応していません(ACOS 6.0.8 時点)
A10 Thunder での設定
前提条件
- Thunder から ACMEサーバへ HTTPS で接続できること
- ACMEサーバ自身のサーバ証明書を、Thunder が信頼できること(下記参照)
- 証明書に含めるすべての FQDN を、ACMEサーバが名前解決できること。本検証構成では、すべての FQDN が Thunder の VIP(172.16.26.100)に名前解決されるよう DNS に登録済みです。
- ACMEサーバから Thunder の VIP の TCP/80 へ到達できること
ACMEサーバのサーバ証明書を Thunder が信頼する必要があります。
Thunder は ACME v2(acme-client agent-v2)で ACMEサーバに HTTPS 接続する際、ACMEサーバのサーバ証明書を検証します。
Thunder が ACME 接続時に参照する信頼CA のリストは ACOS に組み込まれており、管理者が信頼CA を追加することはできません(国内の一次代理店に問い合わせて得た回答に基づきます。ACOS 6.0.8 時点)。そのため、プライベートCA が発行したサーバ証明書を使う ACMEサーバは、Thunder から信頼されません。
この制約は、Pebble のように検証環境内や社内に構築した ACMEサーバを使う場合に特に注意が必要です。Pebble に付属しているサーバ証明書は Pebble 独自の検証用CA から発行されたものであるため、そのままでは Thunder から信頼されません。
本検証では、Pebble のサーバ証明書を ACOS が信頼する CA から発行された証明書に差し替えました。Pebble のサーバ証明書の取得方法は本記事では扱いません。
1. HTTP-01 応答用の VIP(port 80)
slb server dummy-acme 127.0.0.1
health-check-disable
port 80 tcp
health-check-disable
!
slb service-group dummy-acme-sg tcp
member dummy-acme 80
!
slb virtual-server vs 172.16.26.100
port 80 http
service-group dummy-acme-sg
reply-acme-challenge
ポイント
-
reply-acme-challengeを設定すると、Thunder が HTTP-01 チャレンジに応答します。 -
port 80 http(ポート番号 80、タイプ http)は固定です。 - HTTP-01 に応答するには、port 80 のステータスが Up である必要があります。port 80 にサービスグループが適用されていないと Down となり、HTTP-01 に応答できません。業務で port 80 を使用せず、適用するサービスグループがない場合は、上記のようにダミーのサービスグループを適用します。
- 証明書に含める FQDN ごとに名前解決先のIPアドレスが異なる場合は、それぞれのIPアドレスに対応する virtual-server に同様の設定が必要です。
- ダミーのサービスグループを適用する代わりに、次の aFleX を port 80 に適用する方法もあります(サービスグループは適用しません)。この aFleX は、チャレンジ用 URL 以外へのリクエストを破棄します。
aFleX の例
when HTTP_REQUEST {
if { [string tolower [HTTP::uri]] starts_with "/.well-known/acme-challenge/" } {
return
} else {
drop
}
}
2. ACMEクライアント設定
Thunder の ACMEクライアントの設定例を示します。この例では cert-type ecdsa を指定し、ECDSA証明書を取得します。
pki acme-cert acme-www.test.ex-ecdsa
url https://acme-test-2026.acme.local:14060/dir
domain www1.test.ex
san-domain www2.test.ex/www3.test.ex
renew-every week 4
cert-type ecdsa
account-email admin@test.ex
acme-client agent-v2
enroll
最後の enroll は設定項目ではなく、証明書の取得を開始するコマンドです。pki acme-cert の設定モードで実行します。
RSA証明書も取得する場合は、別のpki acme-cert設定を作成し、cert-type rsaを指定します。証明書名はECDSA用とは異なる名前にしてください。
| 設定 | 説明 |
|---|---|
pki acme-cert <名前> |
証明書名。サーバ証明書と中間CA証明書を連結したチェーンは <名前>_full_chain になる。 |
url |
ACMEディレクトリURL。利用する ACMEサービスの URL を指定。 |
domain(必須) / san-domain
|
証明書に含める FQDN。本検証で取得した証明書の Subject には CN が含まれておらず、FQDNはすべてSANに設定されていることを確認した。 |
renew-every / renew-before
|
証明書の更新タイミングを指定 |
cert-type |
rsa / ecdsa
|
account-email(必須) |
ACME アカウントのメールアドレス |
acme-client agent-v2 |
ACME v2 を使用(デフォルトは v1) |
enroll |
証明書の取得を開始するコマンド。初回の取得時に実行する。以降の更新は自動で行われる。設定ではないため show running-config には表示されない。 |
renew-every week 4 は例です。証明書の有効期間に対して余裕をもって更新されるよう設定してください。
後述の動作確認では、自動更新を待たずに確認するため、初回取得後に手動でenrollを再度実行し、証明書を再取得しています。
自動更新については、別途、検証可能な短い更新間隔を設定した場合に、設定した間隔で証明書が更新されることを確認しています。また、renew-everyおよびrenew-beforeを設定しない場合も、証明書の有効期限が切れる前に更新されることを確認しています。これらの検証条件・結果および具体的な更新タイミングは、本記事では扱いません。
Let's Encrypt などの ACMEサービスは、本番環境とは別に、動作確認用のステージング環境を提供している場合があります。Thunder では、staging-url と run-with-staging-server を設定すると、ステージング環境を利用できます。ステージング環境で発行される証明書は、OS やブラウザから通常は信頼されない場合があります。動作確認の際は注意してください。
3. 取得した証明書の確認
TH1060-1#show pki cert
Name Type Expiration Status
------------------------------------------------------------------------------------------
acme-www.test.ex-ecdsa_full_chain certificate Aug 12 06:55:29 2026 GMT [Unexpired, Unbound]
acme-www.test.ex-ecdsa certificate/key Aug 12 06:55:29 2026 GMT [Unexpired, Unbound]
-
acme-www.test.ex-ecdsa・・・ サーバ証明書と秘密鍵のペア -
acme-www.test.ex-ecdsa_full_chain・・・ サーバ証明書+中間CA証明書 - 初回取得直後はどの設定にも関連付けられていないため、ステータスは
Unboundです。
本記事に掲載している show コマンドの出力は、検証を実施した時点のものです。記事の公開日より前の有効期限が表示されていますが、検証時点では有効期限内の証明書です(ステータスも Unexpired です)。 また、本検証では、ACMEサーバ(Pebble)が発行する証明書の有効期間を検証用に短くしています。実際の有効期間は、利用する ACMEサーバ(CA)によって異なります。
4. client-ssl テンプレートと VIP(port 443)
slb server sv113 172.16.126.113
port 80 tcp
slb server sv114 172.16.126.114
port 80 tcp
!
slb service-group sg-tcp80 tcp
member sv113 80
member sv114 80
!
slb template client-ssl www.test.ex
certificate acme-www.test.ex-ecdsa_full_chain key acme-www.test.ex-ecdsa
!
slb virtual-server vs 172.16.26.100
port 80 http
service-group dummy-acme-sg
reply-acme-challenge
port 443 https
service-group sg-tcp80
template client-ssl www.test.ex
client-sslテンプレートに指定する証明書と秘密鍵は、事前にACMEで取得しておく必要があります。
動作確認
| コマンド | 内容 |
|---|---|
show pki cert |
保有する証明書・秘密鍵の一覧 |
show pki cert sort-by name |
証明書名順で表示 |
show pki cert sort-by expiration |
有効期限順で表示 |
show pki acme-cert status |
取得・更新の状態 |
show pki acme-cert log <証明書名> from-start |
取得ログ(先頭から表示) |
show pki cert
本検証では、4週間後の自動更新を待たずに動作を確認するため、手動でenrollを実行して証明書を再取得しました。その後の出力は次のとおりです。
TH1060-1#show pki cert sort-by expiration
Name Type Expiration Status
------------------------------------------------------------------------------------------
acme-www.test.ex-ecdsa_full_chain certificate Aug 14 03:01:50 2026 GMT [Unexpired, Bound]
acme-www.test.ex-ecdsa certificate/key Aug 14 03:01:50 2026 GMT [Unexpired, Bound]
前掲の取得直後の出力(Aug 12)と比べて有効期限が変わっており、新しい証明書が再取得されたことを確認できます。
ステータスがBoundとなっており、client-sslテンプレートに適用されていることを確認できます。
show pki acme-cert status
TH1060-1#show pki acme-cert status
Certificate name: acme-www.test.ex-ecdsa status: SUCCESS
Last enrollment/renewal: SUCCESS
Rotated files: 4
show pki acme-cert log <証明書名> from-start
初回取得や手動での再取得など、証明書の取得・更新に関するログが出力されます。期待どおりに証明書を取得できない場合の切り分けに役立ちます(ログの掲載はここでは控えます)。
ご利用にあたって
本記事の設定(aFleX を含む)は、上記の検証環境・ACOSバージョンで動作を確認したものです。ACOS のバージョン、ACMEサーバ(CA)、ネットワーク構成などによって動作が異なる可能性があります。Thunder で ACME を利用する際は、ご自身の環境で事前に動作を検証してください。
まとめ
- 証明書の有効期間短縮により、更新の自動化が重要になります。
- A10 Thunder(ACOS 6.0.8)は、内蔵の ACMEクライアントで証明書を取得・自動更新できます。
- 対応するチャレンジは HTTP-01 のみのため、ワイルドカード証明書は取得できません。
- ACME接続では、Thunder が ACMEサーバのサーバ証明書を信頼する必要があります。
今後の執筆予定
- 冗長構成での ACME
参考
- RFC 8555 - Automatic Certificate Management Environment (ACME)
- CA/Browser Forum Baseline Requirements
- Let's Encrypt:Decreasing Certificate Lifetimes to 45 Days
- Let's Encrypt:Certificate Lifetime Rationale and Plans
- Pebble(GitHub)
- Apple:信頼済み証明書に関する今後の制限について
BIPROGYグループの技術への取り組み
We Are Hiring!