openssl x509:公開鍵証明書(X.509)の見方と使い方

はい、承知いたしました。opensslコマンドの一部であるx509について、公開鍵証明書(X.509)の見方と使い方に焦点を当て、約5000語の詳細な解説記事を記述します。


openssl x509:公開鍵証明書(X.509)の詳細な見方と実践的な使い方

はじめに

インターネット上での安全な通信や、ソフトウェアの信頼性を保証するために、公開鍵証明書(Public Key Certificate)は不可欠な要素となっています。特に、ウェブサイトのSSL/TLS通信、電子メールの署名、コード署名、VPN接続など、多岐にわたる場面で利用されています。

公開鍵証明書は、特定の「主体者(Subject)」の公開鍵が、信頼できる第三者である「認証局(Certificate Authority, CA)」によって正当なものであると保証されたデジタル文書です。最も広く普及している証明書の標準規格が、国際電気通信連合(ITU-T)が定めたX.509です。

X.509証明書には、主体者の情報、発行者の情報、公開鍵、有効期間、署名アルゴリズム、CAによるデジタル署名、さらには様々な拡張情報などが含まれています。これらの情報は、証明書が正当なものであるか、誰によって発行されたか、いつまで有効か、どのような用途に使用できるかなどを判断するために非常に重要です。

しかし、証明書ファイルはバイナリ形式や特定のテキスト形式(PEMなど)で保存されており、そのままの内容を人間が直接読み取ることは困難です。ここで活躍するのが、強力なコマンドラインツールであるOpenSSLです。

OpenSSLは、SSL/TLSプロトコルに関連する様々な暗号操作や証明書管理機能を備えたオープンソースのツールキットです。その中の主要なコマンドの一つがopenssl x509です。このコマンドは、X.509証明書に関する様々な操作を行うために使用されますが、特に証明書の内容を詳細に表示(view)したり、特定の情報を抽出(extract)したり、証明書の形式を変換(convert format)したりする際に頻繁に利用されます。

本記事では、openssl x509コマンドに焦点を当て、X.509証明書の内容をどのように見ればよいのか、各フィールドは何を意味するのか、そして証明書を扱う上でどのようにopenssl x509を実践的に活用できるのかについて、詳細かつ網羅的に解説します。OpenSSLやPKI(公開鍵基盤)の基本的な知識がある方を対象としていますが、各概念についても適宜説明を加えながら進めます。

必要なもの

  • OpenSSLがインストールされたシステム(Linux, macOS, Windowsなど)。多くのOSにはプリインストールされています。
  • 確認したいX.509証明書ファイル(例: .crt, .cer, .pem, .der 拡張子のファイル)。
  • 基本的なコマンドライン操作の知識。

openssl x509 コマンドの概要

openssl x509コマンドは、X.509証明書を操作するためのユーティリティです。その基本的な構文は以下のようになります。

bash
openssl x509 [オプション]

オプションによって、入力元の指定、出力形式の指定、表示する情報の種類、実行する操作などが制御されます。最も一般的な使い方は、入力として証明書ファイルを指定し、その内容を読みやすい形式で表示することです。

X.509証明書の基本構造と主要フィールド

openssl x509コマンドで証明書の内容を読み解く前に、X.509証明書がどのような情報を含んでいるのか、その基本的な構造と主要なフィールドについて理解しておくことが役立ちます。X.509証明書(特に広く使われているv3形式)は、主に以下の情報で構成されています。

  1. 証明書本体(Certificate):

    • バージョン (Version): X.509のバージョン番号。現在の標準はバージョン3 (v3) です。v3では拡張領域が追加され、証明書の機能が大幅に向上しました。
    • シリアル番号 (Serial Number): 認証局が発行する証明書ごとに一意に割り振られる識別番号。失効リスト(CRL)などで特定の証明書を指定する際に使用されます。
    • 署名アルゴリズム (Signature Algorithm): この証明書に認証局が署名する際に使用したハッシュ関数と公開鍵暗号方式の組み合わせ(例: sha256WithRSAEncryption)。
    • 発行者 (Issuer): この証明書を発行した認証局(CA)の情報。通常、DN (Distinguished Name)形式で表現されます(例: C=US, O=Let's Encrypt, CN=R3)。
    • 有効期間 (Validity Period): この証明書が有効である開始日時 (Not Before) と終了日時 (Not After)。この期間外の証明書は無効とみなされます。
    • 主体者 (Subject): この証明書が誰(または何)に対して発行されたかを示す情報。ウェブサイトの証明書であればドメイン名(CN: Common Name)、個人の証明書であれば個人名などが含まれます。これもDN形式で表現されます(例: CN=www.example.com)。
    • 主体者の公開鍵情報 (Subject Public Key Info): 証明書に紐付けられた公開鍵そのものと、その鍵のアルゴリズム(RSA, ECDSAなど)およびパラメータ。
    • 拡張領域 (Extensions): バージョン3で追加された領域で、証明書に追加的な情報や制約を記述できます。非常に重要な情報が多く含まれます(例: Subject Alternative Name, Key Usage, Basic Constraintsなど)。
  2. 認証局の署名 (CA’s Digital Signature):

    • 上記の証明書本体の内容を、発行者(CA)の秘密鍵で署名した値。これにより、証明書がCAによって正当に発行され、かつ改ざんされていないことが検証できます。署名検証には、発行者(CA)の公開鍵が必要です。

これらの情報が組み合わさることで、利用者は証明書が正当であるかを検証し、その証明書に紐づく公開鍵を信頼して使用できるようになります。

openssl x509 を使って証明書の内容を表示する

openssl x509コマンドの最も一般的で重要な使い方は、証明書ファイルの内容を人間が読める形式で表示することです。これには、主に -in オプションと表示形式を指定するオプションを組み合わせて使用します。

入力元の指定: -in

-in <ファイル名> オプションで、読み込む証明書ファイルを指定します。

bash
openssl x509 -in server.crt ...

標準入力から読み込む場合は、-in オプションを省略するか、ファイル名として - を指定します。これは、他のコマンドの出力をパイプで渡す際に便利です(後述のopenssl s_clientの例を参照)。

出力形式の指定: -text, -noout, -inform, -outform

証明書の内容を表示する際に使用する主なオプションです。

  • -text: 証明書の内容を詳細なテキスト形式で表示します。主体者、発行者、有効期間、公開鍵、拡張領域など、ほとんど全ての重要な情報が含まれます。証明書の詳細を確認する際に最も頻繁に使用されます。
  • -noout: 証明書のPEM形式またはDER形式の出力を行わないようにします。-text, -subject, -issuerなどの特定の情報を表示するオプションと組み合わせて使用し、証明書ファイルそのものの内容を出力させたくない場合に指定します。 -textと組み合わせて「証明書の内容だけを詳細に表示する」という使い方が一般的です。
  • -inform <形式>: 入力ファイルの形式を指定します。<形式>には PEM または DER を指定します。省略した場合、OpenSSLは自動的に形式を判別しようとしますが、明示的に指定した方が確実です。ウェブサイトの証明書などでよく使われる .crt.pem は通常 PEM 形式、Javaキーストアなどで使われる .cer や Windowsでエクスポートされる .cer (バイナリ) は DER 形式の場合が多いです。
  • -outform <形式>: 出力ファイルの形式を指定します。<形式>には PEM または DER を指定します。-out オプションと組み合わせて使用し、証明書形式を変換する際に利用します。

最も基本的な表示方法: -text-noout

証明書の内容を詳細に確認したい場合、以下のコマンドが基本となります。

bash
openssl x509 -in server.crt -text -noout

または、標準入力から読み込む場合:

bash
cat server.crt | openssl x509 -text -noout

このコマンドを実行すると、server.crtファイルに含まれるX.509証明書の内容が、各フィールドの意味とともに詳細に表示されます。次に、-textオプションの出力で表示される各フィールドについて詳しく見ていきましょう。

-text オプションの出力詳細

openssl x509 -text -nooutコマンドの出力は、通常、以下のセクションで構成されます。各セクションの意味を理解することが、証明書を正しく読み解く鍵となります。

text
Certificate:
Data:
Version: 3 (0x2) # バージョン
Serial Number: # シリアル番号
...
Signature Algorithm: sha256WithRSAEncryption # 署名アルゴリズム
Issuer: # 発行者
...
Validity: # 有効期間
Not Before: ...
Not After: ...
Subject: # 主体者
...
Subject Public Key Info: # 主体者の公開鍵情報
Public Key Algorithm: ...
Public-Key: (bits)
Modulus: ... (or EC Public Key)
Exponent: ...
X509v3 extensions: # 拡張領域 (v3証明書のみ)
X509v3 Basic Constraints: # 基本制約
...
X509v3 Subject Alternative Name: # サブジェクト代替名 (SAN)
...
X509v3 Key Usage: # 鍵用途
...
X509v3 Extended Key Usage: # 拡張鍵用途
...
X509v3 Subject Key Identifier: # 主体者鍵識別子
...
X509v3 Authority Key Identifier: # 権威鍵識別子
...
CRL Distribution Points: # CRL配布ポイント
...
Certificate Policies: # 証明書ポリシー
...
...その他の拡張
Signature Algorithm: sha256WithRSAEncryption # 再度、署名アルゴリズムの表示
Signature Value: # 署名値
...

各セクションについて詳しく解説します。

Certificate:

証明書データの始まりを示す単なるラベルです。

Data:

証明書の本体データが含まれるセクションです。CAによって署名される対象となる情報全てがここに格納されています。

  • Version:: X.509のバージョン番号を示します。

    • 1 (0x0): 初期バージョン。基本的な情報のみ。
    • 2 (0x1): 発行者/主体者の一意な識別子を追加。あまり使われません。
    • 3 (0x2): 最も一般的。X509v3 extensions 領域が追加されました。証明書の機能や制約を柔軟に記述できます。
  • Serial Number:: 認証局(Issuer)が発行する証明書ごとに一意に割り振る整数値です。16進数で表示されることが多いです。証明書の失効(Revocation)を管理する際に、このシリアル番号が使用されます。同じCAが同じシリアル番号を複数の証明書に割り当てることは許されていません。

  • Signature Algorithm:: Dataセクション全体を署名するために、この証明書の発行者(CA)が使用したアルゴリズムを示します。通常、「ハッシュアルゴリズム + 公開鍵アルゴリズム」の形式で表記されます(例: sha256WithRSAEncryption, ecdsa-with-sha384)。検証者は、このアルゴリズムとCAの公開鍵を用いて署名を検証します。

  • Issuer:: この証明書を発行した認証局(CA)の情報です。DN (Distinguished Name)形式で記述されます。DNは、階層的な名前空間でエンティティを一意に識別するための形式です。一般的なフィールドとして以下があります。

    • C: Country (国名)
    • ST: State or Province (都道府県/州)
    • L: Locality (市町村/地域)
    • O: Organization (組織名)
    • OU: Organizational Unit (部門名)
    • CN: Common Name (一般的な名前 – CA名やサーバー名)
      ウェブサイトの証明書であれば、通常、SSL/TLS証明書を発行した認証局の名前(例: Let's Encrypt, DigiCert, Sectigoなど)がCNに含まれます。
  • Validity:: 証明書が有効な期間を示します。

    • Not Before:: 証明書が有効になる日時。
    • Not After:: 証明書が無効になる日時。
      この期間外に使用された証明書は、たとえ他の情報が正しくても無効とみなされます。システムの日付/時刻が正確であることの重要性を示しています。
  • Subject:: この証明書が誰(または何)に対して発行されたかを示す情報です。これもDN形式で記述されます。ウェブサイトの証明書であれば、通常、ウェブサイトのドメイン名(例: www.example.com)がCNに含まれます。個人証明書であれば個人名、組織証明書であれば組織名などが含まれます。

  • Subject Public Key Info:: 証明書に紐付けられた主体者(Subject)の公開鍵そのものと、その鍵に関する情報を含みます。

    • Public Key Algorithm:: 公開鍵のアルゴリズム(例: RSA, ECDSA)。
    • Public-Key: (bits): 鍵長(ビット数)が表示されます(例: (2048 bit))。鍵長は鍵の強度を示す重要な要素です。
    • Modulus:, Exponent: (RSAの場合): RSA公開鍵の構成要素であるモジュラス(n)と公開指数(e)が16進数で表示されます。
    • EC Public Key (ECDSAの場合): 楕円曲線公開鍵の情報が表示されます。
      この公開鍵は、主体者の秘密鍵で署名されたデータを検証したり、主体者の公開鍵で暗号化されたデータを主体者の秘密鍵で復号したりするために使用されます。
  • X509v3 extensions:: バージョン3証明書における最も柔軟で重要な領域です。証明書の用途や制約に関する様々な追加情報が含まれます。代表的な拡張について説明します。

    • X509v3 Basic Constraints:: これが認証局(CA)証明書であるか(CA:TRUE)、それとも末端のエンティティ証明書であるか(CA:FALSE)を示します。CA:TRUEの場合、そのCAが他の証明書に署名することを許可されていることを意味します。pathLenConstraintは、そのCAの下に存在できる中間CAの数を制限します。信頼チェーンの構築において非常に重要な拡張です。
    • X509v3 Subject Alternative Name (SAN):: 主体者(Subject)の代替となる名前を指定します。ウェブサイトの証明書において、一つの証明書で複数のドメイン名(DNS:www.example.com, DNS:example.com)やIPアドレス(IP Address:192.168.1.1)をカバーするために広く使用されます。現代のブラウザでは、SubjectのCNフィールドよりもSANフィールドを優先してドメイン名を検証します。
    • X509v3 Key Usage:: この公開鍵がどのような暗号操作に使用できるかを示すビットマスクです。複数の用途が指定されることがあります。
      • Digital Signature: デジタル署名に使用。
      • Non Repudiation: 否認防止(署名者が後に署名を否定できない)。
      • Key Encipherment: 鍵を暗号化するために使用(例: TLSの共通鍵を公開鍵で暗号化)。
      • Data Encipherment: データを直接暗号化するために使用。
      • Key Agreement: 鍵交換プロトコル(Diffie-Hellmanなど)に使用。
      • Certificate Sign: 証明書に署名するために使用(CA証明書に必須)。
      • CRL Sign: 証明書失効リスト(CRL)に署名するために使用(CA証明書に必須)。
      • Encipher Only: 鍵合意の際にデータの暗号化にのみ使用。
      • Decipher Only: 鍵合意の際にデータの復号にのみ使用。
    • X509v3 Extended Key Usage:: Key Usageをより具体的なアプリケーションレベルでの用途を指定します。
      • TLS Web Server Authentication: TLSサーバー証明書として使用。
      • TLS Web Client Authentication: TLSクライアント証明書として使用。
      • Code Signing: コード署名に使用。
      • Email Protection: 電子メールの暗号化や署名に使用。
      • Time Stamping: タイムスタンプに使用。
        これは、証明書が意図された目的にのみ使用されることを保証するのに役立ちます。
    • X509v3 Subject Key Identifier:: 主体者(Subject)の公開鍵を一意に識別するための短いハッシュ値などです。これにより、複数の証明書に同じ公開鍵が使われている場合に、どの証明書かを素早く特定できます。
    • X509v3 Authority Key Identifier:: この証明書に署名した認証局(CA)の公開鍵を識別します。通常、CA証明書のSubject Key IdentifierまたはCA証明書のシリアル番号と発行者名が含まれます。これにより、証明書チェーンを遡る際に、どのCA証明書がこの証明書に署名したのかを素早く見つけることができます。
    • CRL Distribution Points:: 証明書が失効していないかを確認するためのCRL (Certificate Revocation List) を取得できる場所(通常はURL)を指定します。
    • Certificate Policies:: 証明書が発行されたポリシーを示すオブジェクト識別子(OID)や、ポリシーに関する説明へのリンク(URL)を指定します。証明書の信頼レベルや、CAが証明書を発行する際に従った規則を示します。
    • その他にも、Policy Constraints, Name Constraints, Authority Information Access (OCSP responderの場所など) といった重要な拡張があります。

Signature Algorithm: (再掲)

Dataセクションの末尾に、署名に使用されたアルゴリズムが再度表示されることがあります。

Signature Value:

Dataセクション全体を、発行者(CA)の秘密鍵で署名した結果のデジタル署名そのものです。これは16進数のバイト列として表示されます。証明書の利用者は、発行者(CA)の公開鍵を用いてこの署名を検証し、証明書が正当かつ改ざんされていないことを確認します。

特定の情報を抽出して表示する

-text -nooutオプションは証明書の全ての詳細を表示しますが、特定の情報だけを素早く確認したい場合もあります。openssl x509コマンドは、そのための便利なオプションを多数提供しています。これらのオプションも通常、-nooutと組み合わせて使用します。

  • -subject: 証明書の主体者(Subject)情報を表示します。

    “`bash
    openssl x509 -in server.crt -noout -subject

    出力例: subject=CN = www.example.com

    “`

  • -issuer: 証明書の発行者(Issuer)情報を表示します。

    “`bash
    openssl x509 -in server.crt -noout -issuer

    出力例: issuer=C = US, O = Let’s Encrypt, CN = R3

    “`

  • -dates: 証明書の有効期間(Not BeforeとNot After)を表示します。

    “`bash
    openssl x509 -in server.crt -noout -dates

    出力例:

    notBefore=Sep 22 08:00:00 2023 GMT

    notAfter=Dec 21 07:59:59 2023 GMT

    ``
    個別に
    -startdate-enddate`オプションもあります。

  • -serial: 証明書のシリアル番号を10進数で表示します。-serial_hexオプションで16進数で表示することも可能です。

    “`bash
    openssl x509 -in server.crt -noout -serial

    出力例: serial=12345678901234567890… (長い数値)

    “`

    “`bash
    openssl x509 -in server.crt -noout -serial_hex

    出力例: serial=ABCD1234EF567890… (16進数)

    “`

  • -fingerprint: 証明書のフィンガープリント(ハッシュ値)をデフォルトのSHA1または指定したアルゴリズムで表示します。証明書を一意に識別したり、比較したりするのに便利です。

    “`bash
    openssl x509 -in server.crt -noout -fingerprint

    出力例: SHA1 Fingerprint=AB:CD:EF:12:34:56:… (SHA1ハッシュ)

    “`

    他のハッシュアルゴリズムを指定する場合は、-sha1, -sha256, -md5などのオプションを使用します(SHA1やMD5はセキュリティ上の理由から非推奨です)。

    “`bash
    openssl x509 -in server.crt -noout -sha256

    出力例: SHA256 Fingerprint=A1:B2:C3:D4:… (SHA256ハッシュ)

    “`

  • -pubkey: 証明書に含まれる公開鍵をPEM形式で表示します。

    “`bash
    openssl x509 -in server.crt -noout -pubkey

    出力例:

    —–BEGIN PUBLIC KEY—–

    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA…

    —–END PUBLIC KEY—–

    “`
    抽出した公開鍵は、後続の暗号化や署名検証の操作に使用できます。

  • -purpose: 証明書の各拡張(特にKey UsageとExtended Key Usage)に基づいて、その証明書がどのような用途に適しているか(または不適切か)をOpenSSLが判断した結果を表示します。証明書の用途を素早く理解するのに便利です。

    “`bash
    openssl x509 -in server.crt -noout -purpose

    出力例:

    Certificate purposes:

    SSL server : Yes

    SSL client : No

    Code signing : No

    “`

PEM形式とDER形式の変換

X.509証明書は、様々な形式でファイルに保存されます。最も一般的なのは以下の2つです。

  • PEM形式 (Privacy Enhanced Mail): Base64エンコードされたテキスト形式で、-----BEGIN CERTIFICATE----------END CERTIFICATE-----のようなヘッダー/フッターで囲まれています。人間が読みやすく、テキストエディタで開いたりコピー&ペーストしたりしやすい形式です。多くのUnix系システムやウェブサーバー(Apache, Nginx)で標準的に使用されます。ファイル拡張子は .pem, .crt, .cer, .key などが使われます。
  • DER形式 (Distinguished Encoding Rules): ASN.1形式で符号化されたバイナリ形式です。テキストエディタで開いても読めません。Java環境(Java Keytool)やWindows環境でよく使用されます。ファイル拡張子は .der, .cer などが使われます。

openssl x509コマンドは、-inform(入力形式)と-outform(出力形式)、そして-out(出力ファイル名)オプションを使用して、これらの形式間で証明書を変換できます。

例えば、DER形式の証明書ファイル (cert.der) をPEM形式に変換して cert.pem という名前で保存するには、以下のようにします。

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

逆に、PEM形式の証明書ファイル (cert.pem) をDER形式に変換して cert.der という名前で保存するには、以下のようにします。

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

-inform-outformを省略した場合、OpenSSLはデフォルトとしてPEM形式を試みます。ファイルの内容を見て自動判別しようとしますが、確実に変換するためには明示的に形式を指定することが推奨されます。

実行中のサーバーから証明書を取得して確認する

ウェブサーバーや他のTLSを提供するサーバーが使用している証明書を、その場で確認したい場合があります。openssl s_clientコマンドは、指定したホストとポートに対してTLS接続を確立し、その際にサーバーから提示される証明書を表示する機能を持っています。この機能とopenssl x509をパイプで組み合わせることで、サーバー証明書の内容を詳細に確認できます。

bash
openssl s_client -connect www.google.com:443 -servername www.google.com </dev/null | openssl x509 -text -noout

このコマンドをステップごとに解説します。

  1. openssl s_client -connect www.google.com:443 -servername www.google.com:

    • openssl s_client: TLS/SSLクライアントを起動するコマンドです。
    • -connect www.google.com:443: www.google.comのポート443(HTTPSの標準ポート)に接続します。
    • -servername www.google.com: SNI (Server Name Indication) 拡張を使用して、接続したいホスト名(この場合はwww.google.com)をサーバーに伝えます。これにより、一つのIPアドレスで複数のバーチャルホストを運用しているサーバーから、正しい証明書を取得できます。HTTP/1.1以降のほとんどのウェブサイトで必要です。
    • </dev/null: openssl s_clientは接続後に対話的なセッションを開始しようとしますが、ここでは証明書情報だけを取得したいので、標準入力として空の入力(/dev/null)を与えて即座に終了させます。
  2. |: パイプ演算子です。前のコマンドの標準出力を、次のコマンドの標準入力に渡します。openssl s_clientコマンドは、接続が成功するとサーバー証明書を含む様々な接続情報を標準出力に出力します。

  3. openssl x509 -text -noout:

    • openssl x509: X.509証明書を処理するコマンドです。
    • -inオプションなし): 標準入力からデータを読み込みます。パイプで渡されたopenssl s_clientの出力がここに入力されます。
    • -text: 証明書の内容を詳細なテキスト形式で表示します。
    • -noout: 証明書そのもののPEM/DER出力を抑制します。

openssl s_clientの出力には証明書だけでなく、接続に関する様々な情報が含まれますが、openssl x509は入力から有効な証明書データ(-----BEGIN CERTIFICATE----------END CERTIFICATE-----で囲まれた部分など)を自動的に探し出して処理します。

このコマンドを実行することで、対象のウェブサイトが使用しているSSL証明書の詳細(発行者、有効期間、SANに含まれるドメイン名、公開鍵情報、鍵用途など)を即座に確認できます。証明書に関するトラブルシューティングを行う際に非常に役立ちます。

もし証明書チェーン全体を確認したい場合は、openssl s_client-showcertsオプションを追加します。このオプションは、サーバーから提示された証明書チェーンに含まれる全ての証明書(サーバー証明書、中間CA証明書など)をPEM形式で出力します。これをopenssl x509にパイプすると、チェーン内の各証明書の内容を順次確認できます。

“`bash
openssl s_client -connect www.google.com:443 -servername www.google.com </dev/null -showcerts

この出力には複数の証明書が含まれるため、個別にx509にかけるか、手動で分割する必要があります。

簡易的に全証明書をまとめてx509 -textにかけることもできますが、出力が繋がって見にくくなる場合があります。

例(全ての証明書テキストをまとめて表示):

openssl s_client -connect www.google.com:443 -servername www.google.com </dev/null -showcerts | openssl x509 -text -noout

“`

証明書の有効期限を確認するスクリプト例

-datesオプションを使えば、証明書の有効期限を簡単に取得できます。これを活用して、証明書の期限切れが近づいていないかを確認する簡単なスクリプトを作成することも可能です。

“`bash

!/bin/bash

CERT_FILE=”server.crt”

有効期限を取得

NOT_BEFORE=$(openssl x509 -in “$CERT_FILE” -noout -startdate | cut -d= -f2)
NOT_AFTER=$(openssl x509 -in “$CERT_FILE” -noout -enddate | cut -d= -f2)

日付形式を変換してタイムスタンプを取得 (macOSとLinuxでdateコマンドのオプションが異なる場合あり)

GNU date (Linux)の場合

if date –version >/dev/null 2>&1; then
NOT_BEFORE_TS=$(date -d “$NOT_BEFORE” +%s)
NOT_AFTER_TS=$(date -d “$NOT_AFTER” +%s)
else # BSD date (macOS)の場合など
NOT_BEFORE_TS=$(date -j -f “%b %d %H:%M:%S %Y %Z” “$NOT_BEFORE” +%s)
NOT_AFTER_TS=$(date -j -f “%b %d %H:%M:%S %Y %Z” “$NOT_AFTER” +%s)
fi

CURRENT_TS=$(date +%s)

echo “Certificate: $CERT_FILE”
echo “Not Before: $NOT_BEFORE”
echo “Not After: $NOT_AFTER”

有効期限が切れているか判定

if [ “$CURRENT_TS” -lt “$NOT_BEFORE_TS” ]; then
echo “Status: Not yet valid.”
elif [ “$CURRENT_TS” -gt “$NOT_AFTER_TS” ]; then
echo “Status: EXPIRED!”
else
# 残り日数を計算
SECONDS_LEFT=$((NOT_AFTER_TS – CURRENT_TS))
DAYS_LEFT=$((SECONDS_LEFT / 86400)) # 86400秒 = 1日
echo “Status: Valid.”
echo “Days Left: $DAYS_LEFT”

# 警告しきい値 (例: 30日)
WARNING_THRESHOLD=30
if [ "$DAYS_LEFT" -le "$WARNING_THRESHOLD" ]; then
    echo "WARNING: Certificate expires in $DAYS_LEFT days!"
fi

fi
“`
このスクリプトは、指定した証明書ファイルの有効期限を取得し、現在日時と比較して有効か無効か、残り日数はどれくらいかを表示します。実際の運用では、さらにエラー処理や監視システムとの連携などを考慮する必要があります。

その他の便利なオプションと使い方

openssl x509には、他にも様々なオプションがあります。いくつか例を挙げます。

  • -checkend <秒数>: 証明書が指定した秒数以内に期限切れになるかどうかをチェックします。期限切れになる場合は1、ならない場合は0を返します。スクリプトでの自動チェックに便利です。

    “`bash

    7日後 (606024*7 = 604800秒) 以内に期限切れになるかチェック

    openssl x509 -in server.crt -checkend 604800

    証明書が期限切れになる場合は “Certificate will expire” と表示され、終了コードは1

    期限切れにならない場合は何も表示されず、終了コードは0

    “`

  • -modulus: 証明書に含まれる公開鍵のモジュラス(RSAの場合)を16進数で表示します。同じ公開鍵を持つ複数の証明書や秘密鍵と比較する際に利用できます。(秘密鍵のモジュラスはopenssl rsa -in private.key -noout -modulusで取得できます)。

    “`bash
    openssl x509 -in server.crt -noout -modulus

    出力例: Modulus=AB:CD:EF:…

    “`

  • -fingerprint_md5: MD5フィンガープリントを表示します。(MD5は非推奨)

  • -set_serial <シリアル番号>: 新しいシリアル番号を設定して、証明書を再度出力します。CA運用で証明書を再発行する際などに使われることがありますが、通常はCAツールやAPIを使用します。

  • -req: 入力が証明書要求(CSR)ではなく証明書であることを明示します。通常、自動で判別されます。

  • -signkey <秘密鍵ファイル>: (自己署名証明書生成など)指定した秘密鍵で証明書に署名します。通常はopenssl reqコマンドと組み合わせてCSRを作成し、それをCA(または自分自身)が署名するという流れになります。自己署名証明書をx509単体で生成する簡単な例:

    “`bash

    テスト用の秘密鍵を生成

    openssl genrsa -out private.key 2048

    自己署名証明書を生成 (有効期間 365日)

    -new オプションはCSRを生成するが、ここではreqコマンドではなくx509コマンド内でCSRライクな情報を扱う

    -x509 オプションは入力をCSRとみなし、自己署名証明書として出力する

    -key オプションで署名に使う秘密鍵を指定

    openssl req -new -x509 -key private.key -out selfsigned.crt -days 365 -subj “/CN=Self-Signed Test Cert”
    ``
    上記の例は
    openssl reqを使っていますが、openssl x509単体で既存の証明書に署名したり、新しい証明書を生成したりする機能もありますが、CSRから正規の証明書を発行するワークフローではopenssl reqとCA機能(openssl caや外部CA)を組み合わせるのが一般的です。openssl x509-signkey-req`オプションは、より低レベルな操作やテスト目的で使われることが多いです。

関連するOpenSSLコマンド

openssl x509は、OpenSSLが提供する様々なコマンドと組み合わせて使用することで、PKIに関するより高度なタスクを実行できます。

  • openssl req: 証明書署名要求(CSR – Certificate Signing Request)や自己署名証明書を生成するコマンドです。CSRは、新しい証明書を発行してもらうためにCAに提出する情報(公開鍵、主体者情報など)を含んだファイルです。
  • openssl rsa / openssl ec: RSA鍵ペアや楕円曲線鍵ペアを生成・管理するコマンドです。これらのコマンドで生成した秘密鍵に対応する公開鍵は、CSRや証明書に含まれます。
  • openssl pkcs12: PKCS#12形式(.pfx.p12拡張子)のファイルを操作するコマンドです。PKCS#12ファイルは、証明書とそれに対応する秘密鍵をまとめて一つのファイルに格納するために使用されます。ウェブサーバーへの証明書インストールや、クライアント証明書の配布などでよく利用されます。pkcs12コマンドでPKCS#12ファイルから証明書や秘密鍵を抽出した後、x509rsa/ecコマンドで内容を確認できます。
  • openssl verify: 証明書が信頼できる認証局によって発行され、有効な証明書チェーンを構築できるかを検証するコマンドです。証明書の有効期間、署名、CAの信頼性などを包括的にチェックします。openssl x509で証明書の内容を確認した後、その証明書が実際に使用可能か(信頼されるか)を判断するためにopenssl verifyを使用します。

これらのコマンドを理解し、適切に使い分けることで、PKI環境における証明書の管理、発行、検証といった様々なタスクを効果的に実行できるようになります。

openssl x509 使用上の注意点

  • ファイル形式 (-inform): 入力ファイルの形式(PEMまたはDER)を誤ると、「unable to load certificate」のようなエラーが発生します。エラーが出た場合は、-inform DERまたは-inform PEMを試してみてください。
  • 秘密鍵のパスフレーズ: 証明書自体には秘密鍵は含まれません。証明書と秘密鍵が別のファイルになっている場合、openssl x509で証明書を見る際には秘密鍵は不要です。もし秘密鍵ファイルにアクセスしようとしてパスフレーズを聞かれるような状況になったら、それはx509コマンドの用途から外れているか、誤ったオプション(例: -signkeyなど)を使っている可能性があります。
  • 証明書チェーン: -textオプションは個々の証明書の内容を表示しますが、その証明書が有効な信頼チェーンの一部であるか(中間CAやルートCAが正しく繋がっているか)は直接は示しません。チェーン全体の検証はopenssl verifyコマンドの役割です。
  • 出力の解釈: -textの出力は詳細ですが、特に拡張領域(Extensions)に含まれるOIDや値の解釈にはPKIの知識が必要となる場合があります。一般的な用途であれば、本記事で解説した主要な拡張(Basic Constraints, SAN, Key Usage, Extended Key Usage)を理解しておけば十分なことが多いです。
  • セキュリティ: 証明書ファイルそのものは公開情報(公開鍵を含む)なので、表示するだけならセキュリティリスクは低いですが、秘密鍵ファイルは厳重に管理する必要があります。

まとめ

本記事では、openssl x509コマンドを使用してX.509公開鍵証明書の内容を詳細に表示・分析する方法、特定の情報を抽出する方法、PEM形式とDER形式を変換する方法、そして実行中のサーバー証明書を確認する方法について解説しました。

openssl x509 -in <ファイル> -text -nooutコマンドは、証明書に含まれる情報を人間が読みやすい形式で提供する最も強力な手段です。バージョン、シリアル番号、発行者、主体者、有効期間、公開鍵、そして特に重要な拡張領域(SAN, Key Usage, Basic Constraintsなど)といった各フィールドの意味を理解することで、証明書が正当なものであるか、どのような用途に使えるか、そして信頼できるルートから発行されているかを判断できるようになります。

また、-subject, -issuer, -dates, -fingerprint, -serial, -pubkeyといったオプションを使うことで、必要な情報を素早く抽出できます。これにより、証明書の特定の属性を確認したり、他のファイルと比較したりする作業が容易になります。

PEM形式とDER形式の変換機能や、openssl s_clientコマンドとの連携によるサーバー証明書のオンザフライでの確認機能も、日々の運用やトラブルシューティングにおいて非常に実践的です。

公開鍵証明書は、現代のデジタルセキュリティインフラストラクチャにおいて基盤となる技術です。openssl x509コマンドは、この重要なコンポーネントを理解し、適切に管理するために不可欠なツールと言えるでしょう。本記事が、皆様がX.509証明書とより効果的に向き合うための一助となれば幸いです。証明書に関する問題に直面した際は、まずopenssl x509 -textで内容を確認することから始めるのが、解決への第一歩となるでしょう。

さらに学ぶために

  • OpenSSL公式ドキュメントやmanページ (man openssl-x509, man x509)
  • RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile (X.509証明書の標準仕様)
  • 公開鍵基盤 (PKI) およびSSL/TLSに関する一般的な技術資料

これらのリソースを参照することで、X.509証明書やOpenSSLに関する理解をさらに深めることができます。


コメントする

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

上部へスクロール