この記事はAIによって生成されたコンテンツを含みます。(スクショ、コマンド出力、ログ、トレースなどには含みません)
はじめに
TLS証明書は、WebサービスやAPI通信の安全性を担保するために不可欠ですが、管理が不十分だと以下のようなリスクが発生します。
-
証明書の有効期限切れによるサービス停止
-
古い暗号アルゴリズムの使用による脆弱性
-
用途不一致によるセキュリティー・リスク
こうしたリスクを低減するために注目されているのが、クリプト・インベントリー(Crypto Inventory)です。これは、組織内で利用されている暗号資材を棚卸しし、どこでどの証明書が使われているかを可視化する取り組みです。
しかし、実際に証明書情報を収集する作業は手間がかかり、手動ではミスや漏れが発生しやすいのが現状です。そこで本記事では、Pythonスクリプトを使って、指定したIPレンジやFQDNに対してTLS証明書を自動収集し、CSV形式で出力する簡易的なクリプト・インベントリーの作成方法を紹介します。
このスクリプトを使えば、証明書の有効期限、Issuer、Subject、Key Usage、Extended Key Usageなどの情報を一括取得でき、証明書管理の効率化とセキュリティー・リスク低減に役立ちます。
スクリプトの概要
今回紹介するスクリプトは、cert-scanner-for-inventory にあります。TLS証明書の情報を自動収集し、CSV形式で出力する簡易クリプト・インベントリー生成ツールです。
以下の特徴があります。
-
対象指定の柔軟性
-
IPレンジ(CIDR形式やワイルドカード)を複数指定可能
-
FQDN(ホスト名)を複数指定可能
-
ポート範囲や複数ポートの指定に対応
-
-
TLS証明書情報の取得
-
TLS接続を行い、証明書を取得
-
証明書そのもの(PEM形式など)はCSVに保存せず、属性の情報のみを保存
-
-
CSV出力項目
-
Host / Port / URI
-
Version
-
Serial Number
-
Signature Algorithm
-
Issuer
-
Subject
-
Not Before / Not After(有効期限)
-
Subject Alt Name
-
Key Usage
-
Extended Key Usage
-
Last Scanned(スキャン日時)
-
このスクリプトは、Python標準ライブラリー(ssl, socket, ipaddress)と cryptography を使用しています。証明書検証を無効化しているため、内部環境や自己署名証明書でもスキャンが可能です。
スクリプトの使い方
このスクリプトは、指定したIPレンジやFQDNに対してTLS接続を行い、証明書情報をCSV形式で出力します。
Usage出力
usage: tls_cert_scanner.py [-h] [--ip IP] [--hosts HOSTS] -p PORTS [-o OUTPUT_CSV] [--timeout TIMEOUT]
TLS Certificate Scanner: fetch certificate info from specified IP/host + ports and export to CSV
options:
-h, --help show this help message and exit
--ip IP Comma-separated IP ranges in CIDR or wildcard format (e.g., 192.168.1.0/24,10.0.0.*)
--hosts HOSTS Comma-separated hostnames/FQDNs (e.g., example.com,another.example.net)
-p PORTS, --ports PORTS
Port range or list (e.g., 443-8443 or 443,8443)
-o OUTPUT_CSV, --output_csv OUTPUT_CSV
Output CSV file name (default: certificate_info.csv)
--timeout TIMEOUT Optional connection timeout in seconds (default: 5.0)
オプション
以下にオプションの説明を示します。
| オプション | 説明 |
|---|---|
| --ip | カンマ区切りで複数のIPレンジを指定(CIDR形式やワイルドカード対応) 例:192.168.1.0/24,10.0.0.* |
| --hosts | カンマ区切りで複数のFQDNを指定 例:example.com,another.example.net |
| -p, --ports | ポート範囲または複数ポートを指定 例:443-8443 または 443,8443 |
| -o, --output_csv | 出力CSVファイル名(デフォルト:certificate_info.csv) |
| --timeout | 接続タイムアウト(秒)(デフォルト:5.0) |
注意: --ip または --hosts の、いずれかを指定する必要があります。
コマンド例
以下にコマンドラインの例を示します。
-
IPレンジとポート範囲を指定
python tls_cert_scanner.py \ --ip 192.168.1.0/24,10.0.0.* \ --ports 443-445 \ --output_csv cert_inventory.csv
-
FQDNのみを指定
python tls_cert_scanner.py \ --hosts example.com,another.example.net \ --ports 443,8443
-
IPレンジとFQDNを併用
python tls_cert_scanner.py \ --ip 192.168.1.0/24 \ --hosts example.com \ --ports 443 \ --timeout 10
出力CSVのヘッダー
以下のヘッダーを持つCSVが生成されます。
Host,Port,URI,Version,Serial Number,Signature Algorithm,Issuer,Subject,Not Before,Not After,Subject Alt Name,Key Usage,Extended Key Usage,Last Scanned
タイムアウトやハンドシェイク失敗時も、最低限 Host、Port、URI、Last Scanned の行を出力し、空の証明書情報を入れることで、後から再トライすべきターゲットが分かるようにしています。
サンプル出力例
以下は、https://test.openquantumsafe.org/ の ポート 443 をスキャンした場合の出力例です。
コマンドラインは以下のとおりです。
$ ./tls_cert_scanner.py --hosts test.openquantumsafe.org -p 443 -o output.csv
[INFO] Retrieved certificate: https://test.openquantumsafe.org:443
[INFO] Wrote 1 rows to output.csv
出力されたoutput.csvは、以下のとおりです。
Host,Port,URI,Version,Serial Number,Signature Algorithm,Issuer,Subject,Not Before,Not After,Subject Alt Name,Key Usage,Extended Key Usage,Last Scanned
test.openquantumsafe.org,443,https://test.openquantumsafe.org:443,v3,0x61d501a758700b72120a2e8c74a51cd667f,sha384,"countryName=US, organizationName=Let's Encrypt, commonName=E8",commonName=test.openquantumsafe.org,2025-11-09 15:37:52,2026-02-07 15:37:51,test.openquantumsafe.org,Digital Signature,"TLS Web Server Authentication, TLS Web Client Authentication",2025-12-09 14:25:47
既知の制約
このスクリプトはPython実行環境に依存した暗号処理を行っているため、いわゆるPQCに対応済みのサーバーから証明書の情報を取得するためには、PQCに対応したPython実行環境が必要です。
通常TLSでは、ServerHello の後に、サーバー証明書がCertificate メッセージとして送信されます。もし 暗号スイートやTLSバージョンの不一致などで、Certificate が送られる前に “handshake_failure” で失敗してしまった場合、証明書を取得することができません。
そのため、PQCに未対応のPython環境でこのスクリプトを実行し、PQC対応済みのTLSサーバーと接続した場合、暗号スイートの不一致で証明書を取得する前に接続が失敗します。
期限切れ検出などの応用例
スクリプトで収集した証明書情報は、CSV形式で出力されるため、簡単な分析やフィルタリングが可能です。
例えば、Excelで簡単に期限切れを確認したい場合、出力CSVをExcelで開き、「Not After」列にフィルターを設定して、条件付き書式で「今日より前の日付」を赤色にすることで、期限切れ証明書を一目で確認することができます。また、「30日以内」などの条件を設定すれば、更新が必要な証明書を早期に把握できます。
ただし、本記事のスクリプトは「簡易的な棚卸し」には有効ですが、大規模環境や厳格なコンプライアンス要件には限界があります。
IBM Guardium Cryptography Manager のような商用ソリューションを利用すれば、さらに以下のようなことが可能になります。
-
暗号資材の集中管理(証明書、鍵、プロトコル)、PKI製品との連携
-
暗号ポリシーの適用、有効期限のアラート、チケッティング・システムとの連携
-
監査ログの取得、SIEM連携
-
PQC対応状況や証明書管理のダッシュボード
こうした製品を導入することで、クリプト・インベントリーは、単なる棚卸しツールからセキュリティー・ガバナンスの一部となります。
まとめ
本記事では、TLS証明書情報を自動収集し、CSV形式で出力するPythonスクリプトを使った 簡易的なクリプト・インベントリーの作成方法を紹介しました。
このスクリプトを活用することで、以下のメリットがあります。
-
証明書の棚卸しを自動化し、管理の効率化を実現
-
有効期限、Issuer、Subject、Key Usage、Extended Key Usageなどの重要情報を一括取得
-
CSV形式で出力するため、Excelなどでの分析が容易
ただし、今回のスクリプトはあくまで「簡易的な棚卸し」を目的としたものです。
大規模環境や厳格なコンプライアンス要件に対応するには、IBM Guardium Cryptography Manager のような商用ソリューションを利用し、暗号資材の集中管理やポリシー適用、監査ログの取得を行うことが望まれます。
ポイントは、クリプト・インベントリーを単なる棚卸しではなく、セキュリティー・ガバナンスの一環として運用することです。
その第一歩として、今回のスクリプトが現場での証明書管理を効率化するための参考になれば幸いです。