OpenSSL x509 の使い方:証明書情報の表示と検証

OpenSSL x509 の使い方:証明書情報の表示と検証 – 詳細ガイド

本記事では、OpenSSLコマンドラインツールにおける x509 サブコマンドの使い方を詳細に解説します。x509 は、X.509証明書の様々な情報を表示したり、その証明書が有効かどうかを検証したりするための非常に強力なツールです。セキュリティエンジニア、システム管理者、開発者にとって、デジタル証明書を理解し、安全な通信を確保するために不可欠な知識となります。

目次

  1. X.509 証明書の基本
    • 1.1 X.509 証明書とは何か
    • 1.2 証明書の構成要素
    • 1.3 証明書の階層構造 (信頼の連鎖)
  2. OpenSSL の概要とインストール
    • 2.1 OpenSSL とは
    • 2.2 OpenSSL のインストール
    • 2.3 OpenSSL の基本的な使い方
  3. openssl x509 コマンドの概要
    • 3.1 openssl x509 コマンドの構文
    • 3.2 主なオプション
  4. 証明書情報の表示
    • 4.1 証明書の内容を表示する (-text)
    • 4.2 シリアル番号を表示する (-serial)
    • 4.3 発行者を表示する (-issuer)
    • 4.4 件名 (Subject) を表示する (-subject)
    • 4.5 開始日と終了日を表示する (-dates)
    • 4.6 公開鍵を表示する (-pubkey)
    • 4.7 指紋 (フィンガープリント) を表示する (-fingerprint)
      • 4.7.1 MD5 指紋
      • 4.7.2 SHA1 指紋
      • 4.7.3 SHA256 指紋
    • 4.8 証明書の拡張領域を表示する
      • 4.8.1 Basic Constraints
      • 4.8.2 Subject Alternative Name (SAN)
      • 4.8.3 Key Usage
      • 4.8.4 Extended Key Usage
      • 4.8.5 Authority Key Identifier (AKI)
      • 4.8.6 Subject Key Identifier (SKI)
      • 4.8.7 Certificate Policies
  5. 証明書の検証
    • 5.1 証明書の有効期限を確認する
    • 5.2 証明書の信頼チェーンを検証する (-CAfile, -CApath)
    • 5.3 CRL (Certificate Revocation List) による失効確認 (-crl_check, -crl_download)
    • 5.4 自己署名証明書の検証
    • 5.5 中間証明書の利用
  6. 証明書のフォーマット変換
    • 6.1 PEM 形式から DER 形式への変換 (-inform PEM, -outform DER)
    • 6.2 DER 形式から PEM 形式への変換 (-inform DER, -outform PEM)
  7. x509 コマンドを使った応用例
    • 7.1 証明書からドメイン名を確認する
    • 7.2 証明書の公開鍵を抽出する
    • 7.3 特定の CA 証明書を抽出する
  8. トラブルシューティング
    • 8.1 “unable to load certificate” エラー
    • 8.2 “verify error:num=20:unable to get local issuer certificate” エラー
    • 8.3 “verify error:num=21:unable to verify the first certificate” エラー
  9. セキュリティに関する考慮事項
    • 9.1 証明書の安全な保管
    • 9.2 証明書の失効に備える
    • 9.3 自己署名証明書の利用における注意点
  10. まとめ

1. X.509 証明書の基本

1.1 X.509 証明書とは何か

X.509 証明書は、インターネット上で安全な通信を確立するために広く使用されているデジタル証明書の標準規格です。この証明書は、公開鍵暗号基盤 (PKI) の重要な要素であり、ウェブサイト、電子メール、ソフトウェアの署名などの様々なアプリケーションで利用されています。X.509 証明書の主な目的は、あるエンティティ (個人、組織、デバイスなど) の身元を保証することです。これにより、ユーザーは、通信している相手が本当に主張する相手であることを確認でき、中間者攻撃 (Man-in-the-Middle attack) を防ぐことができます。

1.2 証明書の構成要素

X.509 証明書は、いくつかの重要な情報で構成されています。以下に、一般的な構成要素を説明します。

  • バージョン (Version): 証明書の X.509 バージョンを示します (v1, v2, v3)。最新の証明書は通常 v3 です。
  • シリアル番号 (Serial Number): 証明書発行局 (CA) が発行する各証明書に一意に割り当てる番号です。
  • 署名アルゴリズム (Signature Algorithm): 証明書に署名するために使用された暗号化アルゴリズム (例: SHA256withRSA) を示します。
  • 発行者 (Issuer): 証明書を発行した CA の識別名 (DN) を示します。DN は、組織名、国コード、共通名など、CA を一意に識別する属性の集合です。
  • 有効期間 (Validity): 証明書が有効な開始日 (Not Before) と終了日 (Not After) を示します。
  • 件名 (Subject): 証明書の所有者の識別名 (DN) を示します。通常、ウェブサイトの場合はドメイン名、個人の場合は氏名が含まれます。
  • 公開鍵情報 (Subject Public Key Info): 証明書の所有者の公開鍵と、使用されている公開鍵アルゴリズムの情報を含みます。
  • 署名 (Signature): 証明書全体のハッシュ値を、発行者の秘密鍵で暗号化したものです。これにより、証明書の改ざんを検出できます。
  • 拡張領域 (Extensions): 標準的なフィールド以外に追加情報を含めることができます。例えば、Subject Alternative Name (SAN) は、証明書が有効な複数のドメイン名や IP アドレスを列挙するために使用されます。

1.3 証明書の階層構造 (信頼の連鎖)

X.509 証明書は、階層構造で構成されています。これは、ルート証明機関 (Root CA) を頂点とし、そこから中間 CA (Intermediate CA) を経て、エンドエンティティ証明書 (End-Entity Certificate) に至る連鎖です。

  • ルート証明機関 (Root CA): 最上位の CA であり、自己署名証明書を持ちます。ルート CA は、信頼の基点となります。
  • 中間証明機関 (Intermediate CA): ルート CA によって署名された証明書を持ち、エンドエンティティ証明書を発行する役割を担います。
  • エンドエンティティ証明書 (End-Entity Certificate): 最終的なユーザー (ウェブサイト、個人など) に発行される証明書です。

信頼の連鎖は、エンドエンティティ証明書から始まり、その証明書を発行した中間 CA、さらにその中間 CA を発行したルート CA へと遡ります。この連鎖が検証されることで、エンドエンティティ証明書が信頼できるものであると判断されます。ブラウザや OS には、信頼されたルート CA のリストが組み込まれており、これらを使用して証明書の信頼性を検証します。


2. OpenSSL の概要とインストール

2.1 OpenSSL とは

OpenSSL は、TLS (Transport Layer Security) および SSL (Secure Sockets Layer) プロトコルを実装するためのオープンソースのツールキットです。暗号化、復号化、証明書の生成、管理など、様々なセキュリティ関連の操作をコマンドラインから実行できます。OpenSSL は、ウェブサーバー、メールサーバー、VPN など、幅広いアプリケーションで利用されており、インターネットセキュリティの基礎を支えています。

2.2 OpenSSL のインストール

OpenSSL は、多くのオペレーティングシステムで標準パッケージとして提供されています。以下に、主要な OS でのインストール方法を説明します。

  • Linux (Debian/Ubuntu):
    bash
    sudo apt update
    sudo apt install openssl
  • Linux (Red Hat/CentOS/Fedora):
    bash
    sudo yum install openssl

    または
    bash
    sudo dnf install openssl
  • macOS:
    macOS には OpenSSL がプリインストールされている場合がありますが、古いバージョンである可能性があります。Homebrew を使用して最新版をインストールすることを推奨します。
    bash
    brew install openssl
  • Windows:
    Windows に OpenSSL をインストールするには、Chocolatey や Scoop などのパッケージマネージャーを使用するか、OpenSSL のウェブサイトからバイナリファイルをダウンロードしてインストールします。

インストール後、ターミナルまたはコマンドプロンプトで openssl version コマンドを実行して、OpenSSL が正しくインストールされていることを確認できます。

2.3 OpenSSL の基本的な使い方

OpenSSL は、コマンドラインから様々な操作を実行できます。基本的な構文は以下の通りです。

bash
openssl <command> <options> <arguments>

  • <command>: 実行する OpenSSL のコマンド (例: x509, rsa, genrsa)
  • <options>: コマンドの動作を制御するオプション (例: -text, -in, -out)
  • <arguments>: コマンドに必要な引数 (例: 証明書ファイル名、鍵ファイル名)

3. openssl x509 コマンドの概要

3.1 openssl x509 コマンドの構文

openssl x509 コマンドは、X.509 証明書を操作するためのツールです。証明書の内容を表示したり、検証したり、フォーマットを変換したりすることができます。基本的な構文は以下の通りです。

bash
openssl x509 [options]

3.2 主なオプション

openssl x509 コマンドには、多くのオプションが用意されています。以下に、よく使用されるオプションを説明します。

  • -in <filename>: 入力証明書ファイルを指定します。
  • -inform <format>: 入力証明書ファイルのフォーマットを指定します (PEM または DER)。
  • -out <filename>: 出力ファイルを指定します。
  • -outform <format>: 出力ファイルのフォーマットを指定します (PEM または DER)。
  • -text: 証明書の内容をテキスト形式で表示します。
  • -serial: 証明書のシリアル番号を表示します。
  • -issuer: 証明書の発行者を表示します。
  • -subject: 証明書の件名 (Subject) を表示します。
  • -dates: 証明書の有効期間 (開始日と終了日) を表示します。
  • -pubkey: 証明書の公開鍵を表示します。
  • -fingerprint: 証明書の指紋 (フィンガープリント) を表示します。
  • -noout: 出力を抑制します。
  • -CAfile <filename>: 信頼された CA 証明書ファイル (.pem 形式) を指定します。
  • -CApath <directory>: 信頼された CA 証明書が格納されているディレクトリを指定します。
  • -crl_check: CRL (Certificate Revocation List) を使用して証明書が失効していないか確認します。
  • -crl_download: CRL をダウンロードして証明書が失効していないか確認します。

4. 証明書情報の表示

4.1 証明書の内容を表示する (-text)

-text オプションを使用すると、証明書の内容を人間が読める形式で表示できます。これは、証明書に含まれる情報を理解するための最も基本的な方法です。

bash
openssl x509 -in certificate.pem -text

このコマンドを実行すると、証明書のバージョン、シリアル番号、署名アルゴリズム、発行者、件名、有効期間、公開鍵情報、拡張領域など、すべての情報が表示されます。

4.2 シリアル番号を表示する (-serial)

-serial オプションを使用すると、証明書のシリアル番号を表示できます。シリアル番号は、CA が発行する各証明書に一意に割り当てる番号です。

bash
openssl x509 -in certificate.pem -serial -noout

-noout オプションは、他の出力を抑制し、シリアル番号のみを表示するために使用されます。

4.3 発行者を表示する (-issuer)

-issuer オプションを使用すると、証明書を発行した CA の識別名 (DN) を表示できます。

bash
openssl x509 -in certificate.pem -issuer -noout

DN は、組織名、国コード、共通名など、CA を一意に識別する属性の集合です。

4.4 件名 (Subject) を表示する (-subject)

-subject オプションを使用すると、証明書の所有者の識別名 (DN) を表示できます。

bash
openssl x509 -in certificate.pem -subject -noout

通常、ウェブサイトの場合はドメイン名、個人の場合は氏名が含まれます。

4.5 開始日と終了日を表示する (-dates)

-dates オプションを使用すると、証明書の有効期間 (開始日と終了日) を表示できます。

bash
openssl x509 -in certificate.pem -dates -noout

証明書が有効期限切れになっていないか確認するために、このオプションを使用できます。

4.6 公開鍵を表示する (-pubkey)

-pubkey オプションを使用すると、証明書に含まれる公開鍵を表示できます。

bash
openssl x509 -in certificate.pem -pubkey -noout

公開鍵は、暗号化や署名の検証に使用されます。

4.7 指紋 (フィンガープリント) を表示する (-fingerprint)

-fingerprint オプションを使用すると、証明書の指紋 (フィンガープリント) を表示できます。指紋は、証明書のハッシュ値を計算したものであり、証明書を一意に識別するために使用されます。

bash
openssl x509 -in certificate.pem -fingerprint -noout

OpenSSL は、複数のハッシュアルゴリズム (MD5, SHA1, SHA256 など) をサポートしています。デフォルトでは SHA1 が使用されますが、-md5, -sha1, -sha256 などのオプションを使用して、特定のアルゴリズムを指定できます。

  • 4.7.1 MD5 指紋

    MD5 は古いハッシュアルゴリズムであり、セキュリティ上の脆弱性が指摘されています。可能な限り SHA256 などのより安全なアルゴリズムを使用することを推奨します。

    bash
    openssl x509 -in certificate.pem -md5 -fingerprint -noout

  • 4.7.2 SHA1 指紋

    SHA1 も MD5 と同様に、セキュリティ上の脆弱性が指摘されています。SHA256 への移行が進んでいます。

    bash
    openssl x509 -in certificate.pem -sha1 -fingerprint -noout

  • 4.7.3 SHA256 指紋

    SHA256 は、現在最も推奨されるハッシュアルゴリズムです。

    bash
    openssl x509 -in certificate.pem -sha256 -fingerprint -noout

指紋は、証明書の真正性を検証するために使用されます。例えば、ウェブサイトの証明書をダウンロードし、その指紋とウェブサイト運営者が公開している指紋を比較することで、証明書が改ざんされていないことを確認できます。

4.8 証明書の拡張領域を表示する

証明書の拡張領域には、標準的なフィールド以外に追加情報が含まれています。openssl x509 -text コマンドを使用すると、拡張領域の内容をすべて表示できます。以下に、よく使用される拡張領域について説明します。

  • 4.8.1 Basic Constraints

    Basic Constraints は、証明書が CA 証明書であるかどうかを示します。CA 証明書の場合、CA:TRUE と表示されます。エンドエンティティ証明書の場合は、CA:FALSE と表示されます。また、pathlen パラメータは、この CA 証明書の下に何階層まで CA 証明書が存在できるかを示します。

  • 4.8.2 Subject Alternative Name (SAN)

    Subject Alternative Name (SAN) は、証明書が有効な複数のドメイン名や IP アドレスを列挙するために使用されます。ウェブサイトの証明書の場合、SAN には、ウェブサイトのドメイン名 (例: www.example.com) や、ワイルドカードドメイン名 (例: *.example.com) が含まれることがあります。

  • 4.8.3 Key Usage

    Key Usage は、証明書が使用できる暗号化操作を指定します。例えば、digitalSignature はデジタル署名に使用できることを示し、keyEncipherment は鍵の暗号化に使用できることを示します。

  • 4.8.4 Extended Key Usage

    Extended Key Usage は、証明書が使用できる特定のアプリケーションを指定します。例えば、TLS Web Server Authentication はウェブサーバーの認証に使用できることを示し、TLS Web Client Authentication はウェブクライアントの認証に使用できることを示します。

  • 4.8.5 Authority Key Identifier (AKI)

    Authority Key Identifier (AKI) は、証明書を発行した CA の鍵を識別するために使用されます。AKI は、CA 証明書の Subject Key Identifier (SKI) と一致します。

  • 4.8.6 Subject Key Identifier (SKI)

    Subject Key Identifier (SKI) は、証明書の公開鍵を一意に識別するために使用されます。SKI は、証明書の公開鍵に基づいて生成されます。

  • 4.8.7 Certificate Policies

    Certificate Policies は、証明書が準拠するポリシーを識別します。これらのポリシーは、証明書の使用方法や信頼レベルに関する情報を定義します。


5. 証明書の検証

5.1 証明書の有効期限を確認する

証明書の有効期限は、-dates オプションを使用して確認できます。

bash
openssl x509 -in certificate.pem -dates -noout

証明書が有効期限切れになっている場合、ブラウザやアプリケーションは、その証明書を信頼しません。

5.2 証明書の信頼チェーンを検証する (-CAfile, -CApath)

証明書の信頼チェーンを検証するには、信頼された CA 証明書が必要です。信頼された CA 証明書は、-CAfile オプションまたは -CApath オプションを使用して指定できます。

  • -CAfile <filename>: 信頼された CA 証明書ファイル (.pem 形式) を指定します。

    bash
    openssl verify -CAfile ca.pem certificate.pem

  • -CApath <directory>: 信頼された CA 証明書が格納されているディレクトリを指定します。ディレクトリ内の各 CA 証明書は、ハッシュ値 .0 という名前で保存されている必要があります。c_rehash コマンドを使用して、ディレクトリ内の CA 証明書を正しくハッシュ化できます。

    bash
    openssl verify -CApath /path/to/ca/certs certificate.pem

証明書の信頼チェーンが検証された場合、OK と表示されます。検証に失敗した場合、エラーメッセージが表示されます。

5.3 CRL (Certificate Revocation List) による失効確認 (-crl_check, -crl_download)

CRL (Certificate Revocation List) は、失効した証明書のリストです。証明書が失効しているかどうかを確認するには、-crl_check オプションまたは -crl_download オプションを使用します。

  • -crl_check: 証明書に CRL 配布ポイント (CDP) が含まれている場合、その CDP から CRL をダウンロードして、証明書が失効していないか確認します。

    bash
    openssl x509 -in certificate.pem -crl_check

  • -crl_download: CRL をダウンロードして証明書が失効していないか確認します。

    bash
    openssl x509 -in certificate.pem -crl_download

これらのオプションを使用するには、OpenSSL が CRL をダウンロードできる必要があります。ファイアウォールなどのネットワーク設定によっては、CRL のダウンロードに失敗する場合があります。

5.4 自己署名証明書の検証

自己署名証明書は、CA によって署名されていない証明書です。自己署名証明書を検証するには、その証明書自体を信頼された CA 証明書として指定する必要があります。

bash
openssl verify -CAfile certificate.pem certificate.pem

自己署名証明書は、信頼された CA によって署名されていないため、通常はブラウザやアプリケーションによって信頼されません。自己署名証明書を使用する場合は、セキュリティ上のリスクを理解しておく必要があります。

5.5 中間証明書の利用

多くの CA は、ルート CA ではなく中間 CA を使用してエンドエンティティ証明書を発行します。中間 CA 証明書は、エンドエンティティ証明書の信頼チェーンを構築するために必要です。中間 CA 証明書は、通常、エンドエンティティ証明書と一緒に提供されます。

中間 CA 証明書を使用して証明書を検証するには、-CAfile オプションを使用して、中間 CA 証明書とルート CA 証明書の両方を指定する必要があります。

bash
openssl verify -CAfile intermediate.pem:root.pem certificate.pem

または、中間 CA 証明書とルート CA 証明書を連結したファイルを -CAfile オプションに指定することもできます。


6. 証明書のフォーマット変換

OpenSSL を使用して、証明書のフォーマットを変換できます。一般的に使用されるフォーマットは、PEM 形式と DER 形式です。

  • PEM (Privacy Enhanced Mail): テキスト形式であり、Base64 エンコードされた証明書データを BEGIN CERTIFICATE と END CERTIFICATE で囲んだものです。
  • DER (Distinguished Encoding Rules): バイナリ形式であり、より効率的にデータを保存できます。

6.1 PEM 形式から DER 形式への変換 (-inform PEM, -outform DER)

bash
openssl x509 -in certificate.pem -inform PEM -out certificate.der -outform DER

6.2 DER 形式から PEM 形式への変換 (-inform DER, -outform PEM)

bash
openssl x509 -in certificate.der -inform DER -out certificate.pem -outform PEM


7. x509 コマンドを使った応用例

7.1 証明書からドメイン名を確認する

ウェブサイトの証明書からドメイン名を確認するには、以下のコマンドを使用できます。

bash
openssl x509 -in certificate.pem -text | grep "DNS:"

このコマンドは、証明書の Subject Alternative Name (SAN) 拡張領域から DNS エントリを抽出します。

7.2 証明書の公開鍵を抽出する

証明書から公開鍵を抽出するには、以下のコマンドを使用できます。

bash
openssl x509 -in certificate.pem -pubkey -noout > public.pem

このコマンドは、証明書の公開鍵を public.pem ファイルに保存します。

7.3 特定の CA 証明書を抽出する

ウェブサイトにアクセスした際にブラウザが提示する証明書チェーンに含まれる中間CA証明書を抽出するには、まずウェブサイトの証明書をダウンロードします。その後、-showcerts オプションを使用して証明書チェーン全体を表示し、必要な中間CA証明書を抽出します。

bash
openssl s_client -showcerts -connect example.com:443 </dev/null 2>/dev/null | openssl x509 -out intermediate.pem

このコマンドは、example.com の証明書チェーンを表示し、最初に見つかった証明書を intermediate.pem ファイルに保存します。ただし、この方法では必ずしも中間CA証明書が抽出されるとは限りません。状況によっては、ルート証明書またはエンドエンティティ証明書が抽出されることがあります。証明書チェーン全体を分析し、適切な証明書を特定する必要があります。


8. トラブルシューティング

8.1 “unable to load certificate” エラー

このエラーは、OpenSSL が証明書ファイルを読み込めない場合に発生します。主な原因は以下の通りです。

  • ファイルが存在しない
  • ファイルへのアクセス権がない
  • ファイルが破損している
  • ファイル形式が正しくない

ファイル名とパスが正しいことを確認し、ファイルへのアクセス権があることを確認してください。また、ファイルが破損していないか、ファイル形式が正しいかを確認してください (PEM 形式の場合は、BEGIN CERTIFICATEEND CERTIFICATE で囲まれていることを確認してください)。

8.2 “verify error:num=20:unable to get local issuer certificate” エラー

このエラーは、証明書の信頼チェーンを構築するために必要な CA 証明書が見つからない場合に発生します。-CAfile オプションまたは -CApath オプションを使用して、必要な CA 証明書を指定してください。

8.3 “verify error:num=21:unable to verify the first certificate” エラー

このエラーは、証明書の署名が無効である場合に発生します。証明書が改ざんされていないか、証明書を発行した CA の秘密鍵が漏洩していないかを確認してください。


9. セキュリティに関する考慮事項

9.1 証明書の安全な保管

証明書 (特に秘密鍵) は、安全な場所に保管する必要があります。秘密鍵が漏洩した場合、攻撃者はその鍵を使用してデータを暗号化したり、署名を偽造したりすることができます。秘密鍵は、パスワードで保護されたファイルに保存し、アクセス制御を厳しく設定することを推奨します。

9.2 証明書の失効に備える

証明書が漏洩した場合や、秘密鍵が侵害された場合、証明書を失効させる必要があります。証明書を失効させると、その証明書は信頼されなくなり、安全な通信に使用できなくなります。CA に連絡して、証明書の失効手続きを行ってください。

9.3 自己署名証明書の利用における注意点

自己署名証明書は、信頼された CA によって署名されていないため、通常はブラウザやアプリケーションによって信頼されません。自己署名証明書を使用する場合は、セキュリティ上のリスクを理解しておく必要があります。自己署名証明書は、テスト環境や、信頼された CA が存在しない環境でのみ使用することを推奨します。


10. まとめ

本記事では、OpenSSL x509 コマンドの使い方について詳細に解説しました。x509 コマンドは、証明書情報を表示したり、検証したりするための非常に強力なツールです。セキュリティエンジニア、システム管理者、開発者は、本記事で解説した知識を活用して、デジタル証明書を理解し、安全な通信を確保してください。

デジタル証明書は、インターネットセキュリティの重要な要素であり、その理解と適切な管理は、安全なオンライン環境を構築するために不可欠です。OpenSSL x509 コマンドを使いこなすことで、より深く証明書を理解し、セキュリティリスクを軽減することができます。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール