Meraki Access Manager OpenSSLでCRLを発行して証明書を失効させ、EAP-TLS認証でFailさせる方法

EAP-TLSを使って802.1x認証を行う場合、利用するクライアント証明書が有効なものかどうかを判断する必要があります。

PCの紛失等が発生した場合にはIT管理者はそのPCで使われているクライアント証明書を失効させ、RADIUSサーバ(今回のケースではAccess Manager)にて認証に失敗させることが必要になります。

Access ManagerではAPIによるCRLのアップロードのみをサポート

2026年2月現在、Access ManagerにおけるCRLのサポートはAPIによりCRLをアップロードする方法しかありません。

証明書内のCRLが記載されたURLやOCSPはサポートされていません。

これは、個人的な解釈としては、Access ManagerはMeraki Cloudに存在しますが、CA局は必ずしもInternet上には存在しないからだと思います。

PrivateでCAを構築した場合にはAccess Managerは直接CA局にアクセス出来ませんので、APIにてマニュアルでアップロードするしかないのでしょう。

OpenSSLでクライアント証明書を失効させる方法

OpenSSLの設定ファイルの場所を確認します。

openssl version -d

私の環境では"/usr/lib/ssl"に設定ファイルがあることが確認できました。

次にクライアント証明書"CandMTest.crt"を失効させます。
CA証明書と鍵ファイルが合わせて必要です。

openssl ca -config /usr/lib/ssl/openssl.cnf \
    -keyfile ./rootCA.key \
    -cert ./rootCA.crt \
    -revoke ./CandMTest.crt

エラーとなった場合には、データベースファイル(index.txt)が存在しないことが多いのでデータベースファイルを作成します。
"demoCA"というのは、設定ファイル内の記載されているディレクトリ構造となりますので、適宜変更します。

mkdir -p demoCA
touch demoCA/index.txt
echo 1000 > demoCA/crlnumber

次にCRLの発行を行います。
rootCA.crlというファイルが生成されます。

openssl ca -config /usr/lib/ssl/openssl.cnf \
    -keyfile ./rootCA.key \
    -cert ./rootCA.crt \
    -gencrl -out ./rootCA.crl

CRLファイルの中身を確認してみます。

openssl crl -in ./rootCA.crl -text -noout

CRLファイルをコピーして保存しておきます。

APIを使ってCRLをアップロードする

CRLをアップロードするためのAPIは、

/organizations/{organizationId}/nac/certificates/{certificateId}

を利用します。nizationId}/nac/certificates/{certificateId}

developer.cisco.com

このAPIを使うためにはOrganizationIDCertificateIDが必要になります。
OrganizationIDはMeraki Dashboardの下部に表示されているので、それを利用しても良いですし、

/organizations

を使ってAPIで取得してもOKです。

developer.cisco.com

次にCertificationIDの取得を行います。

 /organizations/{organizationId}/nac/certificates

を使います。

developer.cisco.com

今回は手を抜いてPostmanを使ってCertificateIDを確認します。

このCertificateIDをコピーしておきます。

次にこれまで保存しておいた、OrganizationID、CertificateID、CRLファイルを使ってCRLをアップロードします。

PythonスクリプトはGeminiに作成してもらいました。

import requests
import json

# 設定項目
API_KEY = 'xxx'
ORG_ID = 'xxxxx'
CA_ID = 'xxxxxx'

# APIエンドポイント
url = f"https://api.meraki.com/api/v1/organizations/{ORG_ID}/nac/certificates/authorities/crls"

# 送信データ(Payload)
payload = {
    "caId": CA_ID,
    "content": "-----BEGIN X509 CRL-----\n"
    "..........\n" # CRLを貼り付け
    "-----END X509 CRL-----",
    "isDelta": False  # デルタCRLの場合はTrue
}

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json"
}

# リクエスト実行
response = requests.post(url, headers=headers, data=json.dumps(payload))

# 結果の確認
if response.status_code == 201:
    print("成功しました。")
    print(response.json())
else:
    print(f"エラーが発生しました: {response.status_code}")
    print(response.text)

このPythonスクリプトを実行し、エラーとならなければアップロード完了です。

Access Managerで確認する

失効させた証明書を使って、クライアントにEAP-TLS認証を行わせます。

Access Managerのログにて証明書が失効していることを理由に認証失敗となっていることが確認できました。

まとめ

Access ManagerにおいてCRLの管理はAPIの使用が必ず必要になります。

将来的にはURLを参照したCRLの確認やOCSPのサポートも期待されますが、今日現在では仕方ありません。

ですけど、生成AI等により簡単にPythonスクリプトの作成が可能になっていますし、少し頑張ればWorkflowsを使うことでCloudだけで実行可能な環境を作ることもできると思いますので、大きな問題にはならないと思います。

気になるところと言えば、Meraki Dashboard上からはどのようなCRLが有効になっているのかを確認する方法は無いようですので、これもAPIを使って確認する必要があるようです。