Openssl コマンド オプション完全ガイド


OpenSSLコマンド オプション完全ガイド

はじめに

今日のデジタル世界では、データのセキュリティとプライバシーは不可欠です。インターネット上の通信、ソフトウェアの署名、データの暗号化など、様々な場面で暗号技術が利用されています。その中心的なツールの一つが「OpenSSL」です。

OpenSSLは、SSL (Secure Sockets Layer) および TLS (Transport Layer Security) プロトコルの実装、証明書関連の操作、暗号化、復号化、ハッシュ計算など、幅広い暗号関連の機能を提供する強力なコマンドラインツールです。Linux、macOS、Windowsなど、多くのオペレーティングシステムで利用できます。

OpenSSLコマンドは非常に多機能である反面、そのオプションの多さから初心者にとっては難解に感じられることがあります。しかし、一度基本を理解し、主要なサブコマンドとオプションの使い方を覚えれば、セキュリティ関連の多くのタスクを効率的に実行できるようになります。

この記事では、OpenSSLコマンドの基本的な使い方から始め、主要なサブコマンドとそれに付随する重要なオプションについて、詳細かつ実践的な解説を行います。約5000語というボリュームで、各オプションの役割、使用例、注意点などを網羅的に説明し、読者の皆様がOpenSSLコマンドを自在に使いこなせるようになることを目指します。

OpenSSLコマンドの基本構造

OpenSSLコマンドの基本的な呼び出し形式は以下のようになります。

bash
openssl <サブコマンド> [オプション...] [引数...]

  • <サブコマンド>: 実行したい操作を指定します。例えば、req (証明書署名要求の操作)、x509 (X.509証明書の操作)、genrsa (RSA秘密鍵の生成) などがあります。
  • [オプション...]: サブコマンドの動作を細かく制御するための様々なオプションを指定します。オプションはハイフン (-) から始まるものが一般的です。
  • [引数...]: 入力ファイル、出力ファイル、追加情報などを指定します。

OpenSSLコマンドには非常に多くのサブコマンドがあり、それぞれのサブコマンドが固有のオプションを持っています。まずは、よく利用される主要なサブコマンドに焦点を当てて解説します。

主要なサブコマンドとオプションの詳細解説

genrsa / genpkey: 秘密鍵の生成

秘密鍵は、公開鍵暗号システムにおいて最も重要な要素の一つです。公開鍵と秘密鍵はペアで生成され、暗号化、復号化、デジタル署名に利用されます。genrsaはRSA方式の秘密鍵を生成するための古いサブコマンドですが、より汎用的なgenpkeyサブコマンドでRSAを含む様々なアルゴリズムの鍵を生成することが推奨されています。ここでは主にgenpkeyを中心に解説し、genrsa固有のオプションについても触れます。

genpkey サブコマンド

より新しい汎用的な鍵生成サブコマンドです。RSAだけでなく、EC (楕円曲線) や DH (Diffie-Hellman) などの鍵も生成できます。

  • -algorithm <アルゴリズム名>:
    • 生成する鍵のアルゴリズムを指定します。
    • 例: RSA, EC, DH など。
    • 必須オプションです。
    • 例: -algorithm RSA
  • -out <ファイル名>:
    • 生成された秘密鍵を保存するファイル名を指定します。
    • このオプションがない場合、秘密鍵は標準出力に表示されます。
    • 例: -out private.key
  • -pkeyopt <オプション名>:<値>:
    • 選択したアルゴリズムに固有のパラメータを指定します。
    • RSAの場合:
      • rsa_keygen_bits:<ビット長>: 鍵のビット長を指定します。セキュリティのため、2048ビット以上(現在では4096ビットが推奨されることも多い)を指定することが一般的です。
      • rsa_keygen_pubexp:<指数>: 公開指数を指定します。一般的に3または65537が使用されます。指定しない場合はデフォルトの65537が使用されます。
    • ECの場合:
      • ec_paramgen_curve:<曲線名>: 楕円曲線暗号で使用する曲線名を指定します。openssl ec paramgen -list_curvesで利用可能な曲線を確認できます。よく使われるのはprime256v1 (NIST P-256), secp384r1 (NIST P-384), secp521r1 (NIST P-521) などです。
      • ec_param_enc:<エンコーディング>: パラメータのエンコーディング方式を指定します。named_curveが一般的です。
    • 例 (RSA 4096bit, 公開指数65537): -pkeyopt rsa_keygen_bits:4096 -pkeyopt rsa_keygen_pubexp:65537
    • 例 (EC P-256曲線): -pkeyopt ec_paramgen_curve:prime256v1 -pkeyopt ec_param_enc:named_curve
  • -pass <パスワード>:
    • 秘密鍵を暗号化するためのパスワードを指定します。セキュリティのためにパスワードで保護することが強く推奨されます。このオプションは非推奨であり、代わりに-passoutを使用することが推奨されます。
    • 例: -pass pass:mypassword
  • -passout <パスワード指定方法>:
    • 秘密鍵を暗号化するためのパスワードを指定する推奨の方法です。
    • pass:<パスワード>: パスワードを直接指定します。コマンド履歴に残るため非推奨です。
    • env:<環境変数名>: 環境変数に設定されたパスワードを使用します。
    • file:<ファイル名>: ファイルの先頭行をパスワードとして使用します。
    • fd:<ファイルディスクリプタ>: 指定されたファイルディスクリプタからパスワードを読み込みます。
    • stdin: 標準入力からパスワードを読み込みます。安全な方法です。
    • 例: -passout pass:MyStrongPassword (非推奨), -passout stdin (推奨)
  • -aes128/-aes192/-aes256/-des/-des3/-idea:
    • 秘密鍵を暗号化する際に使用する暗号アルゴリズムを指定します。AES-256が現在では最も推奨される強度です。-des-des3は古いアルゴリズムであり、セキュリティ上のリスクがあるため非推奨です。-ideaも同様です。
    • 例: -aes256
  • -f4/-3:
    • RSA鍵生成において、公開指数を65537 (-f4) または 3 (-3) に設定します。-pkeyopt rsa_keygen_pubexpオプションのエイリアスのようなものです。通常は-f4 (65537) を使用します。
  • -pubout:
    • 生成した秘密鍵ファイルではなく、対応する公開鍵ファイルをPEM形式で出力します。秘密鍵も同時に必要であれば、別途生成する必要があります。
    • 例: -pubout
  • -text:
    • 生成された鍵のパラメータを人間が読める形式で表示します。秘密鍵、公開鍵のどちらと組み合わせて使用することも可能です。
    • 例: -text

genrsa サブコマンド (非推奨)

RSA鍵生成専用の古いサブコマンドです。genpkey -algorithm RSAとほぼ同等ですが、一部オプションが異なります。

  • <ビット長>: 生成するRSA鍵のビット長を指定します。必須です。
    • 例: openssl genrsa 4096
  • -out <ファイル名>: genpkeyと同じ。
  • -passout <パスワード指定方法>: genpkeyと同じ。
  • -aes128/-aes192/-aes256/-des/-des3: genpkeyと同じ。
  • -f4/-3: genpkeyと同じ。
  • -pubout: genpkeyと同じ。
  • -text: genpkeyと同じ。

利用例:

  • パスワードなしでRSA 2048ビット秘密鍵を生成 (非推奨):
    bash
    openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out private_unencrypted.key
    # または (古い): openssl genrsa -out private_unencrypted.key 2048
  • AES-256で暗号化されたRSA 4096ビット秘密鍵を生成 (パスワードは標準入力から):
    bash
    openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -aes256 -out private_encrypted.key -passout stdin
    # または (古い): openssl genrsa -aes256 -out private_encrypted.key 4096 -passout stdin

    実行するとパスワードの入力を求められます。
  • 楕円曲線 (secp384r1) 秘密鍵を生成:
    bash
    openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp384r1 -out ec_private.key
  • 生成した秘密鍵から公開鍵のみを抽出して表示:
    bash
    openssl pkey -in private_encrypted.key -pubout -out public.key -passin stdin

    (注: pkeyサブコマンドは秘密鍵や公開鍵の操作に使われます。)

req: 証明書署名要求 (CSR) の作成と操作

CSR (Certificate Signing Request) は、認証局 (CA) に対して公開鍵証明書の発行を依頼する際に提出するファイルです。公開鍵、申請者の情報 (組織名、コモンネームなど)、署名などが含まれます。

  • -new:
    • 新しいCSRを作成します。通常、このオプションと同時に-keyオプションで秘密鍵を指定します。
    • 例: -new
  • -key <秘密鍵ファイル>:
    • CSRに含める公開鍵に対応する秘密鍵ファイルを指定します。この秘密鍵を使用してCSRに署名が行われます。
    • 例: -key private.key
  • -keyform <形式>:
    • -keyで指定した秘密鍵ファイルの形式を指定します。PEM (デフォルト), DER, ENGINE などがあります。
    • 例: -keyform DER
  • -passin <パスワード指定方法>:
    • -keyで指定した秘密鍵ファイルがパスワードで保護されている場合に、そのパスワードを指定する方法を指定します。pass:, env:, file:, fd:, stdin などは-passoutオプションと同じです。
    • 例: -passin stdin
  • -out <出力ファイル>:
    • 生成されたCSRを保存するファイル名を指定します。
    • このオプションがない場合、CSRは標準出力に表示されます。
    • 例: -out server.csr
  • -subj <サブジェクト名>:
    • 証明書のサブジェクト (申請者) 名をコマンドラインで直接指定します。対話形式での入力をスキップできます。
    • 形式は/CN=コモンネーム/O=組織名/OU=部署名/L=市区町村/ST=都道府県/C=国コード のようになります。各要素の区切りは/です。
    • 例: -subj "/CN=www.example.com/O=Example Inc./L=Tokyo/ST=Tokyo/C=JP"
  • -config <設定ファイル>:
    • CSRの作成や拡張属性の設定に使用するOpenSSL設定ファイルを指定します。このファイルでデフォルト値を設定したり、Subject Alternative Name (SAN) などの拡張属性を定義したりできます。
    • 例: -config openssl.cnf
  • -extensions <セクション名>:
    • -configで指定した設定ファイル内の、証明書拡張属性 (Extensions) を定義しているセクション名を指定します。これにより、SANなどの拡張属性をCSRに含めることができます。
    • 例: -extensions v3_req (openssl.cnfのデフォルトではv3_reqセクションでSANなどが設定されていることが多い)
  • -reqexts <セクション名>:
    • -configで指定した設定ファイル内の、CSR拡張属性 (Request Extensions) を定義しているセクション名を指定します。-extensionsと似ていますが、CSRそのものに含める拡張属性を指定します。
    • 例: -reqexts req_ext
  • -nodes:
    • 生成するCSRに署名する際に、秘密鍵のパスワード入力をスキップします。つまり、パスワードで保護されていないCSRが作成されます。通常、-keyで指定する秘密鍵ファイルがパスワードで保護されていない場合にこのオプションを使用します。
    • 例: -nodes
  • -sha256/-sha512/-md5 など:
    • CSRに署名する際に使用するハッシュアルゴリズムを指定します。SHA-256やSHA-512が現在では一般的で推奨されます。MD5はセキュリティ上の脆弱性があるため非推奨です。
    • 例: -sha256
  • -text:
    • CSRの内容を人間が読める形式で表示します。証明書のサブジェクト、公開鍵、拡張属性などを確認できます。
    • 例: -text
  • -noout:
    • CSRを標準出力やファイルに出力せず、検証のみを行います。-textオプションと組み合わせて内容を表示する際などに使用されます。
    • 例: -noout
  • -verify:
    • CSRの署名を検証します。CSRが対応する秘密鍵で正しく署名されているかを確認できます。
    • 例: -verify

利用例:

  • 秘密鍵から対話形式でCSRを作成:
    bash
    openssl req -new -key private.key -out server.csr

    実行すると、国名、都道府県、組織名、コモンネームなどを順に入力するように求められます。秘密鍵がパスワードで保護されている場合は、パスワードも入力する必要があります。
  • 秘密鍵から非対話形式 (-subj) でCSRを作成 (秘密鍵はパスワード保護なし):
    bash
    openssl req -new -key private_unencrypted.key -nodes -out server_no_pass.csr -subj "/CN=api.example.com/O=Example API/C=JP"
  • CSRの内容を表示:
    bash
    openssl req -in server.csr -text -noout
  • CSRの署名を検証:
    bash
    openssl req -in server.csr -verify -noout -key public.key

    (注: 公開鍵ファイル (public.key) は秘密鍵ファイルから別途抽出しておく必要があります。)

x509: X.509証明書の操作と表示

x509サブコマンドは、公開鍵証明書(X.509証明書)の表示、検証、変換、自己署名証明書の作成など、証明書に関する様々な操作に使用します。

  • -in <証明書ファイル>:
    • 操作対象となる入力の証明書ファイルを指定します。
    • このオプションがない場合、標準入力から証明書を読み込みます。
    • 例: -in server.crt
  • -inform <形式>:
    • 入力ファイルの形式を指定します。PEM (デフォルト), DER, NET (Netscape) などがあります。
    • 例: -inform DER
  • -out <出力ファイル>:
    • 処理結果を保存するファイル名を指定します。
    • このオプションがない場合、結果は標準出力に表示されます。
    • 例: -out converted.der
  • -outform <形式>:
    • 出力ファイルの形式を指定します。PEM (デフォルト), DER, NET (Netscape) などがあります。
    • 例: -outform DER
  • -text:
    • 証明書の詳細な内容を人間が読める形式で表示します。証明書のバージョン、シリアル番号、発行者、有効期間、サブジェクト、公開鍵情報、拡張属性 (SAN, Basic Constraintsなど) など、全ての情報が表示されます。
    • 例: -text
  • -noout:
    • 証明書のPEM/DER形式の出力を行わず、情報表示オプション (-text, -subject, -issuerなど) のみ実行します。
    • 例: -noout
  • -subject:
    • 証明書のサブジェクト名のみを表示します。
    • 例: -subject -noout
  • -issuer:
    • 証明書の発行者名のみを表示します。
    • 例: -issuer -noout
  • -dates:
    • 証明書の有効期間 (Not BeforeNot After) のみを表示します。
    • 例: -dates -noout
  • -startdate/-enddate:
    • 有効期間の開始日 (Not Before) または終了日 (Not After) のみを表示します。
    • 例: -startdate -noout
  • -fingerprint:
    • 証明書のフィンガープリント (ハッシュ値) を表示します。デフォルトはSHA-1ハッシュです。
    • 例: -fingerprint -noout
  • -sha1/-sha256/-md5 など:
    • -fingerprintで使用するハッシュアルゴリズムを指定します。SHA-256が推奨されます。
    • 例: -sha256 -fingerprint -noout
  • -pubkey:
    • 証明書に含まれる公開鍵をPEM形式で表示します。
    • 例: -pubkey -noout
  • -modulus:
    • 証明書に含まれる公開鍵のモジュラスを表示します (RSA鍵の場合)。秘密鍵のモジュラスと比較することで、秘密鍵と公開鍵がペアであるか確認できます。
    • 例: -modulus -noout
  • -alias:
    • 証明書のエイリアスを表示します (PKCS#7/PKCS#12形式の場合)。
  • -checkend <秒>:
    • 証明書の有効期限が指定した秒数以内に切れるかどうかを確認します。切れる場合はゼロ以外のステータスコードを返します。
    • 例: -checkend 86400 (24時間以内に期限が切れるか確認)
  • -signcert:
    • CAとして、指定された秘密鍵と設定ファイルを使用して証明書に署名します。通常、CSRを入力として、新しい証明書を出力します。
    • 例: openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -days 365 -out server.crt
  • -req:
    • 入力を証明書ではなくCSRとして扱います。自己署名証明書の作成や、CAとしてCSRに署名する際に-signcertと組み合わせて使用します。
    • 例: -req
  • -CA <CA証明書>:
    • CAとして証明書に署名する際に使用するCAの証明書を指定します。
    • 例: -CA ca.crt
  • -CAkey <CA秘密鍵>:
    • CAとして証明書に署名する際に使用するCAの秘密鍵を指定します。
    • 例: -CAkey ca.key
  • -CAcreateserial:
    • CA証明書と同じディレクトリに<CA証明書ファイル名>.srlというファイルを作成し、シリアル番号を自動で管理します。ファイルが存在しない場合は01から開始し、署名ごとにインクリメントされます。
    • 例: -CAcreateserial
  • -set_serial <シリアル番号>:
    • 生成する証明書に明示的にシリアル番号を指定します。シリアル番号は16進数または10進数で指定できます。
    • 例: -set_serial 12345 (10進数), -set_serial 0x3039 (16進数)
  • -days <日数>:
    • 生成する証明書の有効期間を日数で指定します。
    • 例: -days 365
  • -extfile <設定ファイル>:
    • 証明書拡張属性 (Extensions) を定義した設定ファイルを指定します。通常はopenssl.cnfなどの設定ファイルの一部を抜き出したものを使用します。
    • 例: -extfile v3.cnf
  • -extensions <セクション名>:
    • -extfileで指定した設定ファイル内の、使用する拡張属性のセクション名を指定します。デフォルトはv3_ca (CA証明書の場合) またはv3_req (エンドエンティティ証明書の場合) です。
    • 例: -extensions custom_exts
  • -purpose:
    • 証明書がどのような用途に使用できるか (SSLクライアント、SSLサーバー、コード署名など) を表示します。証明書のKey UsageやExtended Key Usage拡張属性に基づいています。
    • 例: -purpose -noout
  • -addtrust <用途>:
    • 出力する証明書に、指定された追加の用途 (trust purpose) を設定します。OpenSSL内部で使用されるフラグを設定します。
  • -trusted:
    • 入力証明書を信頼された証明書として扱います。通常、CA証明書を扱う際に使用されます。
  • -clcerts:
    • 入力ファイルがPKCS#7形式の場合に、クライアント証明書のみを抽出します。
  • -crls:
    • 入力ファイルがPKCS#7形式の場合に、CRL (証明書失効リスト) のみを抽出します。

利用例:

  • PEM形式の証明書の内容を詳細表示:
    bash
    openssl x509 -in server.crt -text -noout
  • PEM形式の証明書をDER形式に変換:
    bash
    openssl x509 -in server.crt -inform PEM -out server.der -outform DER
  • 自己署名証明書を作成 (CSRを作成し、CA機能で自分自身に署名):
    bash
    openssl req -x509 -new -nodes -key private_unencrypted.key -days 365 -out selfsigned.crt -subj "/CN=Self-Signed Certificate"
  • 秘密鍵とCSRからCAとして証明書に署名 (シリアル番号を自動生成):
    bash
    openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 365 -out server.crt

    CA秘密鍵がパスワードで保護されている場合は、-CAkeyform-passinオプションも必要になります。
  • 証明書の有効期限を確認 (残り30日未満か):
    bash
    openssl x509 -in server.crt -checkend $((30 * 86400))

    終了コードが0なら有効期限は30日以上先、1なら30日未満、それ以外ならエラーです。

pkcs12: PKCS#12ファイル (PFX/p12) の作成と操作

PKCS#12 (通称PFXまたはp12) ファイルは、秘密鍵、対応する証明書、中間CA証明書などを一つのファイルにまとめて格納し、パスワードで保護するための標準的な形式です。主にクライアント証明書の配布や、Webサーバーでの証明書と秘密鍵のインポート/エクスポートに使用されます。

  • -export:
    • 秘密鍵と証明書をPKCS#12ファイルにエクスポートします。このオプションを指定しない場合は、PKCS#12ファイルを読み込んで内容をPEM形式で出力します。
    • 例: -export
  • -in <入力ファイル>:
    • エクスポート時は秘密鍵または証明書ファイル (通常は証明書を指定し、-inkeyで秘密鍵を指定)。
    • インポート時はPKCS#12ファイル。
    • 例: -in server.crt (エクスポート時), -in bundle.p12 (インポート時)
  • -inkey <秘密鍵ファイル>:
    • エクスポート時に使用する秘密鍵ファイルを指定します。
    • 例: -inkey server.key
  • -certfile <追加証明書ファイル>:
    • エクスポート時に、バンドルに含める追加の証明書ファイル (通常は中間CA証明書やルートCA証明書) を指定します。複数のCA証明書を含める場合は、ファイル内に複数のPEM形式証明書を連結して指定します。
    • 例: -certfile ca-bundle.pem
  • -out <出力ファイル>:
    • 生成されたPKCS#12ファイル (エクスポート時) または抽出された秘密鍵/証明書ファイル (インポート時) を保存するファイル名を指定します。
    • 例: -out bundle.p12 (エクスポート時), -out extracted.pem (インポート時)
  • -name <フレンドリー名>:
    • PKCS#12ファイルに格納される秘密鍵/証明書ペアに付けるフレンドリー名 (ニックネームのようなもの) を指定します。ブラウザやOSの証明書ストアで表示される名前に使われることがあります。
    • 例: -name "My Server Certificate"
  • -caname <CAフレンドリー名>:
    • PKCS#12ファイルに格納される追加のCA証明書に付けるフレンドリー名を指定します。
  • -password <パスワード>:
    • PKCS#12ファイルを保護するためのパスワードを直接指定します。セキュリティ上非推奨であり、代わりに-passin/-passoutを使用すべきです。
  • -passin <入力パスワード指定方法>:
    • 入力ファイル (秘密鍵ファイルやPKCS#12ファイル) がパスワードで保護されている場合に、そのパスワードを指定する方法です。pass:, env:, file:, fd:, stdin など。
    • 例: -passin pass:privatekeypassword
  • -passout <出力パスワード指定方法>:
    • 出力するPKCS#12ファイルを保護するためのパスワードを指定する方法です。pass:, env:, file:, fd:, stdin など。
    • 例: -passout pass:pkcs12password, -passout stdin
  • -noiter:
    • PKCS#12ファイルの暗号化/MAC計算の際に、PBKDF2などのストレッチング処理を省略します。これにより処理は高速になりますが、パスワード推測に対する耐性が著しく低下するため、特別な理由がない限り使用すべきではありません。
  • -nomaciter:
    • PKCS#12ファイルのMAC計算時に、ストレッチング処理を省略します。暗号化はストレッチングを使用します。-noiterと同様に非推奨です。
  • -twopass:
    • 入力と出力で異なるパスワードを使用する場合に指定します。通常、入力パスワードは-passinで、出力パスワードは-passoutで指定しますが、このオプションは非推奨です。新しいバージョンでは-passin-passoutを両方指定すれば十分です。
  • -macalg <ハッシュアルゴリズム>:
    • PKCS#12ファイルのMAC計算に使用するハッシュアルゴリズムを指定します。sha256, sha512 などが指定できます。デフォルトはSHA-1であることが多いですが、セキュリティのためSHA-256以上を推奨します。
  • -keypbe <暗号アルゴリズム>:
    • PKCS#12ファイル内の秘密鍵を暗号化する際に使用するアルゴリズムを指定します。aes-256-cbc, aes-128-cbc, des3 などが指定できます。AES-256が推奨されます。
  • -certpbe <暗号アルゴリズム>:
    • PKCS#12ファイル内の証明書を暗号化する際に使用するアルゴリズムを指定します。aes-256-cbc, aes-128-cbc, des3 などが指定できます。通常、証明書は公開情報なので暗号化する必要はありませんが、PKCS#12標準では暗号化も可能です。デフォルトは証明書の暗号化をしないことが多いです。

利用例:

  • 秘密鍵、証明書、中間CA証明書をまとめてPKCS#12ファイルにエクスポート (パスワードは標準入力から):
    bash
    openssl pkcs12 -export -in server.crt -inkey server.key -certfile ca-bundle.pem -out bundle.p12 -name "My Web Server Cert" -passin stdin -passout stdin
  • PKCS#12ファイルから秘密鍵と証明書をPEM形式で抽出 (パスワードは標準入力から):
    bash
    openssl pkcs12 -in bundle.p12 -out extracted.pem -passin stdin -passout stdin

    -passout stdinを指定することで、抽出される秘密鍵に新しいパスワードを設定できます。パスワードなしで抽出したい場合は-nodesオプションを使用します (ただし抽出される秘密鍵がパスワード保護されなくなるため注意が必要です)。
  • PKCS#12ファイルの内容 (鍵、証明書) を確認:
    bash
    openssl pkcs12 -in bundle.p12 -info -noout -passin stdin

    -infoオプションは読み込んだPKCS#12ファイルの構造情報を表示します。

s_client / s_server: SSL/TLS接続のテスト

これらのサブコマンドは、SSL/TLS接続のクライアントまたはサーバーとして動作し、接続テスト、証明書情報の取得、暗号スイートの確認などを行います。Webサーバーや他のSSL/TLS対応サービスのデバッグに非常に有用です。

s_client サブコマンド

SSL/TLSクライアントとして指定したサーバーに接続します。

  • -connect <ホスト名>:<ポート番号>:
    • 接続先のホスト名またはIPアドレスとポート番号を指定します。
    • 例: -connect www.example.com:443
  • -port <ポート番号>:
    • 接続先のポート番号のみを指定します。ホスト名は指定する必要があります。-connectと組み合わせて使用することは少ないです。
  • -servername <ホスト名>:
    • TLS Server Name Indication (SNI) 拡張でサーバーに送信するホスト名を指定します。一つのIPアドレスで複数の仮想ホストを運用しているサーバーで、正しい証明書を取得するために必要です。通常、-connectで指定したホスト名と同じにします。
    • 例: -servername www.example.com
  • -cert <クライアント証明書ファイル>:
    • クライアント認証を行う際に使用するPEM形式のクライアント証明書ファイルを指定します。
    • 例: -cert client.crt
  • -key <クライアント秘密鍵ファイル>:
    • クライアント認証を行う際に使用するPEM形式のクライアント秘密鍵ファイルを指定します。
    • 例: -key client.key
  • -passin <パスワード指定方法>:
    • -keyで指定した秘密鍵ファイルがパスワード保護されている場合のパスワード指定方法です。
  • -CAfile <信頼できるCA証明書バンドル>:
    • サーバー証明書の検証に使用する、信頼できるCA証明書をまとめたPEM形式のファイルを指定します。通常、ルートCAや中間CAの証明書が連結されています。
    • 例: -CAfile /etc/ssl/certs/ca-certificates.crt
  • -CApath <信頼できるCA証明書ディレクトリ>:
    • サーバー証明書の検証に使用する、信頼できるCA証明書ファイルが格納されているディレクトリを指定します。ディレクトリ内の各CA証明書ファイルはハッシュ値に基づくファイル名になっている必要があります (c_rehashコマンドなどで作成)。
    • 例: -CApath /etc/ssl/certs/
  • -ciphers <暗号スイートリスト>:
    • クライアントが提供する暗号スイートのリストを指定します。特定の暗号スイートでの接続をテストするのに使用します。リストの形式はOpenSSLのcipher string formatに従います。
    • 例: -ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256'
  • -ssl2/-ssl3/-tls1/-tls1_1/-tls1_2/-tls1_3:
    • 使用するSSL/TLSプロトコルのバージョンを強制的に指定します。セキュリティのため、SSLv2/v3の使用は避けるべきです。TLSv1.2またはTLSv1.3を推奨します。
    • 例: -tls1_2
  • -no_ssl3/-no_tls1/-no_tls1_1/-no_tls1_2/-no_tls1_3:
    • 特定のSSL/TLSプロトコルバージョンを無効にします。これにより、指定したバージョンを除外したネゴシエーションが行われます。
    • 例: -no_ssl3 -no_tls1 -no_tls1_1 (TLSv1.2以降のみを許可)
  • -showcerts:
    • サーバーから提供された証明書チェーン全体をPEM形式で表示します。
    • 例: -showcerts
  • -debug:
    • SSL/TLSハンドシェイクのデバッグ情報を詳細に表示します。問題解決に役立ちます。
    • 例: -debug
  • -state:
    • SSL/TLSセッションの状態をハンドシェイクの各段階で表示します。
    • 例: -state
  • -sess_out <セッションファイル>:
    • 確立されたSSL/TLSセッションの情報をファイルに保存します。セッション再開 (session resumption) のテストに使用できます。
    • 例: -sess_out session.pem
  • -sess_in <セッションファイル>:
    • -sess_outで保存したセッション情報を使用して、セッション再開を試みます。
    • 例: -sess_in session.pem
  • -timeout <秒>:
    • 接続試行のタイムアウト時間を秒で指定します。
    • 例: -timeout 10
  • -verify <深さ>:
    • サーバー証明書チェーンの検証を行います。<深さ>は、ルートCAから数えて何番目までの証明書を検証するかを指定します。通常、-verify 10など、十分な深さを指定します。検証が成功するとゼロが返されます。
    • 例: -verify 5
  • -verify_depth <深さ>:
    • -verifyと同じ。
  • -attime <タイムスタンプ>:
    • 証明書の有効期限チェックを、現在の時刻ではなく指定したタイムスタンプ (Unix epoch time) で行います。過去や未来の有効性を確認するのに使用できます。

s_server サブコマンド

SSL/TLSサーバーとして動作し、クライアントからの接続を待ち受けます。

  • -accept <ポート番号>:
    • 接続を待ち受けるポート番号を指定します。
    • 例: -accept 4433
  • -cert <サーバー証明書ファイル>:
    • サーバーがクライアントに提示するPEM形式のサーバー証明書ファイルを指定します。
    • 例: -cert server.crt
  • -key <サーバー秘密鍵ファイル>:
    • サーバー証明書に対応するPEM形式の秘密鍵ファイルを指定します。
    • 例: -key server.key
  • -passin <パスワード指定方法>:
    • -keyで指定した秘密鍵ファイルがパスワード保護されている場合のパスワード指定方法です。
  • -CAfile <信頼できるCA証明書バンドル>:
    • クライアント証明書を要求する場合に、クライアント証明書の検証に使用する信頼できるCA証明書バンドルを指定します (クライアント認証を有効にするには-verifyオプションも必要)。
  • -CApath <信頼できるCA証明書ディレクトリ>:
    • クライアント認証時のCA証明書ディレクトリを指定します (-CAfileと同様)。
  • -verify <深さ>:
    • クライアント認証を要求し、クライアント証明書チェーンの検証を行います。<深さ>は検証深度です。
    • 例: -verify 5
  • -Verify <深さ>:
    • -verifyと同じですが、検証に失敗した場合でも接続を継続します (検証結果は後で取得可能)。
  • -ciphers <暗号スイートリスト>:
    • サーバーが提供する暗号スイートのリストを指定します。
  • -ssl2/-ssl3/-tls1/-tls1_1/-tls1_2/-tls1_3:
    • 許可するSSL/TLSプロトコルバージョンを強制的に指定します。
  • -no_ssl3/-no_tls1/-no_tls1_1/-no_tls1_2/-no_tls1_3:
    • 特定のプロトコルバージョンを無効にします。
  • -debug:
    • デバッグ情報を表示します。
  • -state:
    • セッションの状態を表示します。
  • -sess_out <セッションファイル>:
    • セッション情報をファイルに保存します。
  • -sess_in <セッションファイル>:
    • セッション再開に使用するセッションファイルを読み込みます。
  • -crlf:
    • 入力/出力の改行コードをLFではなくCRLFとして扱います。HTTPプロトコルなどのテストに便利です。
  • -www:
    • 受信したリクエストに対して簡単なHTTPレスポンス (<HTML><BODY>Success</BODY></HTML>) を返します。Webサーバーの基本的な応答テストに使用できます。

利用例:

  • 指定したホストの443ポートに対してTLSv1.2またはTLSv1.3で接続し、証明書情報を表示:
    bash
    openssl s_client -connect www.example.com:443 -tls1_2 -tls1_3 -servername www.example.com -showcerts

    接続が確立されると、サーバー証明書、中間証明書などが表示され、その後キーボード入力待ちになります。Ctrl+Dで接続を閉じます。
  • サーバー証明書の検証と情報の表示:
    bash
    openssl s_client -connect www.example.com:443 -servername www.example.com -CAfile /etc/ssl/certs/ca-certificates.crt -verify 5 -showcerts

    検証に成功すればVerify return code: 0 (ok)のようなメッセージが表示されます。
  • ローカルでテストサーバーを起動 (ポート4433, 自己署名証明書を使用):
    bash
    openssl s_server -accept 4433 -cert selfsigned.crt -key private_unencrypted.key

    別のターミナルから openssl s_client -connect localhost:4433などで接続テストができます。クライアント側で自己署名証明書を信頼していないため検証エラーになりますが、接続自体は可能です。

ciphers: サポートされている暗号スイートのリスト表示

OpenSSLがサポートしている暗号スイートのリストを表示します。s_clients_serverで使用できる暗号スイート文字列の指定時に役立ちます。

  • <暗号スイート文字列>:
    • 指定した暗号スイート文字列に対応する具体的な暗号スイートのリストを表示します。
    • 例: openssl ciphers 'HIGH:!aNULL:!MD5'
  • -v:
    • 各暗号スイートの詳細情報 (プロトコルバージョン、キー交換、認証、暗号化、ハッシュなど) を表示します。
    • 例: openssl ciphers -v HIGH
  • -ssl2/-ssl3/-tls1/-tls1_2/-tls1_3:
    • 指定したプロトコルバージョンで利用可能な暗号スイートのみを表示します。TLSv1.3の暗号スイートはそれ以前とは形式が異なります。
    • 例: openssl ciphers -tls1_3 -v

利用例:

  • デフォルト設定で利用可能な暗号スイートを全て表示:
    bash
    openssl ciphers
  • TLSv1.2で利用可能な高セキュリティな暗号スイートを詳細表示:
    bash
    openssl ciphers -v -tls1_2 'HIGH'

dgst: ハッシュ値の計算、デジタル署名、検証

ファイルやデータのハッシュ値を計算したり、秘密鍵でデジタル署名を作成したり、公開鍵で署名を検証したりします。

  • -md5/-sha1/-sha256/-sha512 など:
    • 使用するハッシュアルゴリズムを指定します。通常、このオプションが最初に指定されます。SHA-256やSHA-512が推奨されます。
    • 例: -sha256
  • -sign <秘密鍵ファイル>:
    • 入力データのハッシュ値を計算し、指定した秘密鍵で署名を作成します。
    • 例: -sign private.key
  • -verify <公開鍵または証明書ファイル>:
    • 入力データと別途提供される署名 (-signatureオプション) を使用して、署名を検証します。指定するのは署名者の公開鍵またはその公開鍵を含む証明書です。
    • 例: -verify public.key, -verify server.crt
  • -prverify <秘密鍵ファイル>:
    • 入力データと提供される署名 (-signature) を使用して、秘密鍵で署名を検証します。これは通常デバッグ目的で使用され、本来の検証は公開鍵で行うべきです。
    • 例: -prverify private.key
  • -signature <署名ファイル>:
    • -verifyまたは-prverifyオプションを指定する場合に、検証対象となる署名が格納されたファイルを指定します。
    • 例: -signature data.sig
  • -hex:
    • 計算されたハッシュ値または署名を16進数文字列として表示します。
    • 例: -hex
  • -binary:
    • 計算されたハッシュ値または署名をバイナリ形式で出力します。通常、ファイルに保存する際に使用します。
    • 例: -binary
  • -out <出力ファイル>:
    • 計算されたハッシュ値または署名を保存するファイル名を指定します。
    • 例: -out data.sha256, -out data.sig
  • -in <入力ファイル>:
    • ハッシュ計算または署名/検証対象となる入力ファイル。指定しない場合は標準入力から読み込みます。
    • 例: -in document.txt
  • -passin <パスワード指定方法>:
    • -signまたは-prverifyで指定した秘密鍵ファイルがパスワード保護されている場合のパスワード指定方法です。

利用例:

  • ファイルのSHA-256ハッシュ値を計算して表示:
    bash
    openssl dgst -sha256 document.txt
  • ファイルのSHA-256ハッシュ値を計算し、指定した秘密鍵で署名を作成してファイルに保存:
    bash
    openssl dgst -sha256 -sign private.key -out document.sig document.txt

    秘密鍵がパスワードで保護されている場合、パスワード入力を求められます (または-passinオプションを使用)。
  • ファイルとその署名を公開鍵で検証:
    bash
    openssl dgst -sha256 -verify public.key -signature document.sig document.txt

    検証が成功すればVerified OKと表示され、失敗すればエラーメッセージが表示されます。

enc: ファイルの暗号化と復号

ファイルの内容を対称暗号アルゴリズムで暗号化または復号します。

  • -aes-128-cbc/-aes-192-cbc/-aes-256-cbc/-des/-des3/-chacha20 など:
    • 使用する対称暗号アルゴリズムを指定します。AES-256-CBCやChaCha20が推奨されます。-des-des3は非推奨です。
    • 例: -aes-256-cbc
  • -d:
    • 復号化モードを指定します。このオプションがない場合は暗号化モードになります。
    • 例: -d
  • -in <入力ファイル>:
    • 暗号化または復号化する入力ファイルを指定します。指定しない場合は標準入力から読み込みます。
    • 例: -in plaintext.txt
  • -out <出力ファイル>:
    • 暗号化または復号化された結果を保存するファイル名を指定します。指定しない場合は標準出力に表示されます。
    • 例: -out encrypted.bin
  • -pass <パスワード指定方法>:
    • 暗号化/復号化に使用するパスワードを指定します。pass:, env:, file:, fd:, stdin など。パスワードから鍵とIV (初期化ベクトル) が生成されます。
    • 例: -pass pass:mysecretpassword (非推奨), -pass stdin (推奨)
  • -salt:
    • パスワードから鍵/IVを生成する際に、ランダムなソルト値を生成して使用します。ソルト値は出力ファイルの先頭に埋め込まれます。これにより、同じパスワードで暗号化しても異なる暗号文が生成され、辞書攻撃に対する耐性が向上します。デフォルトで有効です。
  • -nosalt:
    • ソルト値の使用を無効にします。非推奨です。
  • -pbkdf2:
    • パスワードから鍵/IVを生成する際に、PBKDF2鍵導出関数を使用します。これにより、パスワード推測に対する耐性が向上します。
  • -iter <回数>:
    • PBKDF2を使用する場合の繰り返し回数を指定します。回数が多いほど安全性は増しますが、処理時間が長くなります。デフォルト値は通常適切です。
  • -base64:
    • 暗号化されたバイナリデータをBase64形式でエンコードして出力します。メールやテキストファイルでの転送に適しています。復号化時には、入力がBase64であれば自動的にデコードされます。
    • 例: -base64

利用例:

  • ファイルをAES-256-CBCで暗号化 (パスワードは標準入力から):
    bash
    openssl enc -aes-256-cbc -in plaintext.txt -out encrypted.bin -pass stdin
  • 暗号化されたファイルをAES-256-CBCで復号化 (パスワードは標準入力から):
    bash
    openssl enc -d -aes-256-cbc -in encrypted.bin -out decrypted.txt -pass stdin
  • ファイルをAES-128-CBCで暗号化し、Base64エンコードして標準出力に表示 (パスワードを直接指定 – 非推奨):
    bash
    openssl enc -aes-128-cbc -in plaintext.txt -base64 -pass pass:thisisnotsecure

verify: 証明書チェーンの検証

証明書ファイルと信頼できるCA証明書リストを指定して、証明書チェーンが正しく、かつ有効であるか検証します。Webサイトの証明書がブラウザで信頼されるかどうかのチェックなどに使用されます。

  • -CAfile <信頼できるCA証明書バンドル>:
    • 信頼できるルートCAや中間CA証明書をまとめたPEM形式のファイルを指定します。このファイルに含まれる証明書が信頼の基点となります。
    • 例: -CAfile /etc/ssl/certs/ca-certificates.crt
  • -CApath <信頼できるCA証明書ディレクトリ>:
    • 信頼できるCA証明書が格納されているディレクトリを指定します。各ファイルはハッシュリンクされている必要があります (c_rehashコマンドなど)。
    • 例: -CApath /etc/ssl/certs/
  • -untrusted <追加の中間CA証明書ファイル>:
    • 検証対象の証明書チェーンを完成させるために使用する、信頼済みではない(つまりルート証明書ではない)中間CA証明書ファイルを指定します。検証対象の証明書ファイルに直接含まれていない中間証明書を手動で補う場合に便利です。ファイル内に複数の証明書を含めることも可能です。
    • 例: -untrusted intermediate.pem
  • -crlfile <CRLファイル>:
    • 証明書失効リスト (CRL) ファイルを指定します。検証対象の証明書が失効していないかチェックするために使用します。ファイル内に複数のCRLを含めることも可能です。
    • 例: -crlfile revoked.crl
  • -crl_check:
    • 証明書失効リスト (-crlfileまたは-CApathで指定) を使用して、チェーン内の各証明書が失効していないかチェックを行います。デフォルトではCRLチェックは行われません。
  • -crl_check_all:
    • -crl_checkと同様ですが、信頼点に至るまでの全ての証明書に対してCRLチェックを行います。
  • -policy <ポリシー>:
    • 証明書ポリシー検証を指定します。証明書のPolicy Constraints拡張やPolicy Mappings拡張に基づいて検証を行います。
  • -purpose <用途>:
    • 証明書が指定された用途 (例えばsslserversslclientcodesigningなど) に使用可能であるかチェックします。証明書のKey UsageやExtended Key Usage拡張属性に基づきます。
    • 例: -purpose sslserver (指定された証明書がSSLサーバー証明書として有効か確認)
  • -issuer_checks:
    • 各証明書のIssuerフィールドが、チェーン内の上位の証明書のSubjectフィールドと一致するかを厳密にチェックします。
  • -verbose:
    • 検証プロセスに関する詳細な情報を表示します。どの証明書を検証しているか、どのエラーが発生したかなどが分かります。
    • 例: -verbose
  • -show_chain:
    • 検証パスが構築された場合に、そのチェーン内の証明書情報を表示します。
  • <証明書ファイル>:
    • 検証対象となるエンドエンティティ証明書ファイルを指定します。
    • 例: server.crt

利用例:

  • ローカルのCA証明書ストアを使用して、サーバー証明書が信頼できるか検証:
    bash
    openssl verify -CApath /etc/ssl/certs/ server.crt

    成功すればOK、失敗すればエラーの詳細が表示されます。
  • 特定のCA証明書バンドルと中間CA証明書ファイルを使用して、サーバー証明書を検証:
    bash
    openssl verify -CAfile trusted_cas.pem -untrusted intermediate.pem server.crt
  • CRLを使用して証明書の失効状態を含めて検証:
    bash
    openssl verify -CApath /etc/ssl/certs/ -crl_check server.crt
  • 証明書がSSLサーバー用途として有効か確認し、検証プロセスを詳細表示:
    bash
    openssl verify -purpose sslserver -verbose -CApath /etc/ssl/certs/ server.crt

rand: 乱数生成

暗号学的に安全な擬似乱数を生成します。鍵生成やソルト値の生成などに使用されます。

  • <バイト数>:
    • 生成する乱数のバイト数を指定します。必須です。
    • 例: openssl rand 32 (32バイトの乱数を生成)
  • -out <出力ファイル>:
    • 生成された乱数を保存するファイル名を指定します。
    • このオプションがない場合、乱数は標準出力に表示されます。
    • 例: -out random.bin
  • -hex:
    • 生成された乱数を16進数文字列として表示します。出力はバイト数の2倍の長さの文字列になります。
    • 例: openssl rand -hex 16 (32文字の16進数文字列)
  • -base64:
    • 生成された乱数をBase64形式でエンコードして表示します。
    • 例: openssl rand -base64 24 (32文字のBase64文字列 – 24バイトから32文字になります)
  • -rand <シードファイル>:
    • 擬似乱数生成器 (PRNG) のシードとして使用するファイルを指定します。複数のファイルをコロン (:) で区切って指定することもできます。通常、/dev/random/dev/urandomなどのシステムエントロピー源がデフォルトで使用されるため、明示的に指定する必要は少ないですが、特定の環境でエントロピー不足が懸念される場合などに使用できます。
  • -writerand <シードファイル>:
    • PRNGの現在の状態 (シード情報) を指定したファイルに書き込みます。これにより、後で-randオプションで同じ状態から乱数を生成したり、エントロピーの状態を保存したりできます。

利用例:

  • 32バイトのランダムなバイナリデータを標準出力に表示:
    bash
    openssl rand 32
  • 16バイトのランダムなデータを16進数で表示:
    bash
    openssl rand -hex 16
  • 64バイトのランダムなバイナリデータをファイルに保存:
    bash
    openssl rand -out key.bin 64

passwd: パスワードハッシュ生成

Htpasswdファイルなどで使用される形式でパスワードのハッシュ値を生成します。主に古いシステムや特定のアプリケーションで使用されます。

  • <パスワード>:
    • ハッシュ化するパスワードを直接指定します。セキュリティ上非推奨であり、通常は指定せずに対話形式で入力します。
  • -crypt:
    • 標準のUnix crypt()関数を使用してハッシュを生成します。ソルトは自動生成されます。パスワードの最初の8文字のみが使用されるなど、古い形式です。
    • 例: openssl passwd -crypt (対話形式でパスワード入力)
  • -apr1:
    • Apache HTTP Serverのhtpasswdコマンドで使われるMD5ベースのハッシュ形式 ($apr1$...) を使用します。ソルトは自動生成されます。-cryptより安全ですが、現代の基準では十分ではありません。
    • 例: openssl passwd -apr1
  • -md5:
    • BSD系OSのMD5ベースのハッシュ形式 ($1$...) を使用します。ソルトは自動生成されます。-apr1と似ていますが、若干異なります。
  • -sha1:
    • SHA-1ベースのハッシュ形式 ($sha1$...) を使用します。ソルトは自動生成されます。
  • -a <アルゴリズム名>:
    • OpenSSL 1.1.1以降で推奨されるハッシュ指定方法です。bcrypt (Blowfishベースの強力なアルゴリズム), sha256, sha512などが指定できます。これらのアルゴリズムはソルトとストレッチングをサポートします。
    • 例: openssl passwd -a bcrypt
  • -salt <ソルト値>:
    • ハッシュ生成に使用するソルト値を明示的に指定します。通常は自動生成されるため使用する必要はありません。-crypt-apr1などの形式で指定する場合は、形式に合わせたプレフィックスを含める必要があります。
  • -stdin:
    • パスワードを標準入力から読み込みます。対話形式をスキップし、スクリプトなどからパスワードを渡す場合に便利ですが、パスワードがコマンドライン引数や履歴に残らないよう注意が必要です。
    • 例: echo "mypassword" | openssl passwd -apr1 -stdin

利用例:

  • 対話形式でAPR1形式のパスワードハッシュを生成:
    bash
    openssl passwd -apr1
  • コマンドラインからパスワードを渡してbcrypt形式のハッシュを生成 (非推奨):
    bash
    openssl passwd -a bcrypt -pass pass:MySecretPassword
  • 標準入力からパスワードを読み込んでSHA512形式のハッシュを生成:
    bash
    echo "MySecurePassword" | openssl passwd -a sha512 -stdin

version: OpenSSLのバージョン情報表示

インストールされているOpenSSLのバージョンとビルド情報を表示します。セキュリティアップデートの適用状況を確認する際に重要です。

  • -a:
    • 全てのバージョン情報、ビルドオプション、コンフィギュレーションなどを詳細に表示します。
    • 例: openssl version -a
  • -b:
    • ビルド日付のみを表示します。
  • -o:
    • ビルド時の追加オプションを表示します。
  • -f:
    • コンフィギュレーションファイルがロードされたディレクトリを表示します。
  • -p:
    • デフォルトのモジュールディレクトリを表示します。
  • -d:
    • デフォルトの証明書/CRLディレクトリを表示します。

利用例:

  • OpenSSLのバージョンのみ表示:
    bash
    openssl version
  • 全てのバージョンとビルド情報を表示:
    bash
    openssl version -a

list: サポートされているアルゴリズムやコマンドのリスト表示

OpenSSLがサポートしている様々な要素のリストを表示します。

  • ciphers:
    • サポートされている暗号スイートのリストを表示します (openssl ciphersと同等)。
    • 例: openssl list ciphers
  • digest-commands:
    • サポートされているハッシュアルゴリズム (dgstサブコマンドで使用可能) のリストを表示します。
    • 例: openssl list digest-commands
  • enc-commands:
    • サポートされている対称暗号アルゴリズム (encサブコマンドで使用可能) のリストを表示します。
    • 例: openssl list enc-commands
  • pkey-algorithms:
    • サポートされている公開鍵アルゴリズム (genpkeyなどで使用可能) のリストを表示します。
    • 例: openssl list pkey-algorithms
  • mac-algorithms:
    • サポートされているMACアルゴリズムのリストを表示します。
  • signature-algorithms:
    • サポートされている署名アルゴリズムのリストを表示します。
  • commands:
    • 利用可能な全てのサブコマンドのリストを表示します。
    • 例: openssl list commands

利用例:

  • 利用可能な全てのサブコマンドを表示:
    bash
    openssl list commands
  • dgstサブコマンドで使える全てのハッシュアルゴリズムを表示:
    bash
    openssl list digest-commands

その他の有用なサブコマンド

上記以外にも、OpenSSLには多くのサブコマンドがあります。いくつか簡単に紹介します。

  • asn1parse:
    • ASN.1エンコードされたデータを解析し、構造を表示します。証明書や秘密鍵ファイルなどがASN.1形式で格納されているため、内容のデバッグに役立ちます。
    • 例: openssl asn1parse -in server.crt -i
  • ca:
    • 簡易的な認証局 (CA) として機能し、CSRに署名したり、証明書を失効させたりします。本格的なCA運用には向きませんが、テスト環境などでの利用に便利です。OpenSSL設定ファイル (openssl.cnf) と組み合わせて使用します。
    • 例: openssl ca -in server.csr -out server.crt -policy policy_anything -config openssl.cnf
  • crl:
    • 証明書失効リスト (CRL) を作成、表示、検証します。
    • 例: openssl crl -in revoked.crl -text -noout
  • rsa / ec / dsa / dh:
    • 特定のアルゴリズム (RSA, EC, DSA, DH) の鍵ファイルを操作します。例えば、RSA秘密鍵の形式変換、公開鍵抽出、パラメータ表示などに使用されます。pkeyサブコマンドがより汎用的にこれらの操作をカバーします。
    • 例: openssl rsa -in private.key -pubout -out public.key (RSA秘密鍵から公開鍵を抽出)
  • speed:
    • 様々な暗号アルゴリズムのパフォーマンス測定を行います。
    • 例: openssl speed sha256 rsa2048

これらのサブコマンドも、特定のタスクを実行する際に非常に役立ちます。詳細なオプションは各サブコマンドのmanページ (man openssl <サブコマンド名>) を参照してください。

共通オプション

多くのOpenSSLサブコマンドで共通して使用されるオプションがいくつかあります。

  • -in <入力ファイル>:
    • 処理対象となる入力ファイルを指定します。多くのサブコマンドで利用可能です。指定しない場合は標準入力から読み込みます。
  • -out <出力ファイル>:
    • 処理結果を保存するファイル名を指定します。多くのサブコマンドで利用可能です。指定しない場合は標準出力に書き込まれます。
  • -inform <形式> / -outform <形式>:
    • 入力ファイル/出力ファイルの形式を指定します。PEM (デフォルト), DER (バイナリ形式) がよく使われます。他の形式 (P12, P7, ENGINEなど) もサポートされているサブコマンドがあります。
  • -passin <パスワード指定方法>:
    • 入力ファイル (秘密鍵など) がパスワードで保護されている場合に、そのパスワードを指定する方法を指定します。
      • pass:<パスワード>: パスワードを直接指定 (非推奨)
      • env:<環境変数名>: 環境変数から読み込む
      • file:<ファイル名>: ファイルの先頭行から読み込む
      • fd:<ファイルディスクリプタ>: ファイルディスクリプタから読み込む
      • stdin: 標準入力から読み込む (最も推奨される安全な方法の一つ)
    • 例: -passin stdin, -passin file:password.txt
  • -passout <パスワード指定方法>:
    • 出力ファイル (秘密鍵やPKCS#12ファイルなど) をパスワードで保護する場合に、そのパスワードを指定する方法を指定します。形式は-passinと同じです。
    • 例: -passout pass:newpassword, -passout stdin
  • -config <設定ファイル>:
    • OpenSSLの設定ファイルを指定します。デフォルトはシステムに依存しますが、-configで明示的に指定することで、CSRや証明書の拡張属性、CAの挙動などを詳細に制御できます。
  • -batch:
    • 対話形式の入力を抑制し、エラー発生時にすぐに終了します。スクリプトでの実行時に便利です。
  • -verbose:
    • より詳細な処理状況やデバッグ情報を表示します。特にverifys_clientなどで問題解析に役立ちます。

エラーハンドリングとデバッグ

OpenSSLコマンドの実行中にエラーが発生した場合、OpenSSLは標準エラー出力にエラーメッセージを表示します。エラーメッセージは通常、エラーが発生した場所 (ファイル、関数など) とエラーの詳細な理由を示します。

例: unable to load private key / reason: bad decrypt は、秘密鍵ファイルの読み込みに失敗し、その原因はパスワードが間違っていること (bad decrypt) であることを示唆しています。

エラーの原因を特定するためには、以下の点を確認します。

  • ファイルパスの確認: 入力ファイルや出力ファイルのパスが正しいか、ファイルが存在するか、読み書き権限があるか。
  • ファイル形式の確認: -inform/-outformオプションが適切か、ファイルの実際の形式と合っているか。PEM形式の場合、-----BEGIN ...-----のようなヘッダー/フッターが付いているか。
  • パスワードの確認: 秘密鍵などのパスワードが正しいか。-passin/-passoutオプションが適切に使用されているか。特にstdinを使用している場合は、正しくパスワードが渡されているか (改行などが含まれていないかなど)。
  • 権限の確認: CAとして証明書に署名する場合、-CAcreateserialオプションを使用するとCA証明書と同じディレクトリにシリアルファイルが作成されるため、そのディレクトリへの書き込み権限が必要です。
  • 設定ファイルの確認: -configオプションを使用している場合、設定ファイルのパスや内容 (特にセクション名や構文) が正しいか。
  • デバッグオプションの活用: s_clientverifyなどのサブコマンドには-debug-verboseオプションがあります。これらを使用すると、より詳細な処理の流れやエラー発生時の内部状態を確認でき、問題の特定に役立ちます。

OpenSSLのエラーメッセージは暗号ライブラリの内部エラーコードに基づいていることが多いため、そのままでは理解しにくい場合があります。しかし、reason: ...の部分が具体的な原因を示していることが多いため、そこを重点的に確認すると良いでしょう。また、OpenSSLのバージョンによってエラーメッセージや挙動が異なる場合があります。

実践的な利用例

これまでに解説したオプションを組み合わせて、よくあるタスクを実行するコマンド例をいくつか示します。

1. ルートCA証明書と秘密鍵の作成

“`bash

秘密鍵生成 (パスワードあり)

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -aes256 -out root_ca.key -passout stdin

自己署名ルート証明書作成 (秘密鍵、有効期間10年)

openssl req -x509 -new -nodes -key root_ca.key -sha256 -days 3650 -out root_ca.crt -subj “/CN=My Root CA/O=My Organization/C=JP” -passin stdin
``
(
-nodesはreqで秘密鍵のパスワード入力をスキップしますが、ここでは-keyに指定するroot_ca.keyが既に暗号化されているため、-passin stdinでそのパスワードを入力します。-x509`はreqサブコマンド内で自己署名証明書を作成する際に使用します。)

2. サーバー秘密鍵とCSRの作成

“`bash

秘密鍵生成 (パスワードなし)

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out server.key

CSR作成 (秘密鍵を使用, 非対話形式, SAN付き)

openssl.cnf をコピー・編集し、[ req_distinguished_name ] や [ alt_names ] セクションを適切に設定する必要があります。

例えば、alt_names セクションで subjectAltName = DNS:www.example.com, DNS:api.example.com のように指定します。

openssl req -new -key server.key -out server.csr -sha256 -subj “/CN=www.example.com/O=Example Inc./L=Tokyo/ST=Tokyo/C=JP” -config openssl.cnf -extensions v3_req
“`

3. CAとしてCSRに署名し、サーバー証明書を発行

“`bash

openssl.cnf の [ ca ] セクションと [ policy_anything ] などを設定しておきます。

CAの秘密鍵パスワードは入力が必要です。

openssl ca -in server.csr -out server.crt -days 365 -md sha256 -config openssl.cnf -batch -passin stdin
``
(この例ではopenssl.cnfの
[ ca ]セクションでcertificate=root_ca.crtprivate_key=root_ca.keyserial=serialcrlnumber=crlnumberdatabase=index.txtなどが適切に設定されていることを前提としています。serialファイルは01`と記載した状態で作成しておく必要があります。)

より簡易的なCA機能 (x509 -req -signcert) を使う場合は以下のようになります。

“`bash

CA秘密鍵、CA証明書、CSRからサーバー証明書を生成

シリアル番号を自動生成し、有効期間1年

openssl x509 -req -in server.csr -CA root_ca.crt -CAkey root_ca.key -CAcreateserial -days 365 -sha256 -out server.crt -extensions v3_req -extfile openssl.cnf -passin stdin
“`

4. 証明書チェーンの検証

“`bash

サーバー証明書、中間CA証明書、ルートCA証明書がそれぞれ server.crt, intermediate.crt, root_ca.crt として存在する場合

中間CA証明書とルートCA証明書を連結したバンドルファイルを作成

cat intermediate.crt root_ca.crt > ca-bundle.pem

server.crt が ca-bundle.pem によって信頼できるか検証

openssl verify -CAfile ca-bundle.pem server.crt
“`

5. PEM形式からPKCS#12形式への変換

“`bash

秘密鍵、サーバー証明書、中間証明書バンドルをPKCS#12にまとめる

出力ファイル bundle.p12 には新しいパスワードを設定

openssl pkcs12 -export -in server.crt -inkey server.key -certfile ca-bundle.pem -out bundle.p12 -name “My Server Cert” -passout stdin
“`

セキュリティ上の注意

OpenSSLコマンドを使用する際は、セキュリティに最大限注意を払う必要があります。

  • 秘密鍵の管理: 秘密鍵はシステムのセキュリティの根幹です。パスワードで必ず保護し、アクセス権限を厳しく制限した安全な場所に保管してください。バックアップも重要ですが、バックアップ先も同様に保護する必要があります。
  • パスワードの扱い: コマンドライン引数にパスワードを直接指定 (-pass pass:mypassword) することは避けてください。コマンド履歴やプロセスリストからパスワードが漏洩する危険があります。可能な限り-passin stdin-passin file:<ファイル名>-passin env:<環境変数名>を使用してください。ファイルや環境変数を使用する場合も、それらのアクセス権限に注意が必要です。
  • 設定ファイルの保護: OpenSSL設定ファイル (openssl.cnfなど) には、秘密鍵のパスやCAの管理情報など、機密性の高い情報が含まれる場合があります。適切なアクセス権限を設定してください。
  • 乱数生成源: 鍵生成やソルト生成には強力な乱数が必要です。OpenSSLは通常システムのセキュアな乱数源 (/dev/urandomなど) を使用しますが、仮想環境などでエントロピーが不足しがちな場合は注意が必要です。openssl randコマンドでエントロピーの状態を確認したり、外部のエントロピー源を利用したりすることも検討してください。
  • 古いアルゴリズムの使用: MD5ハッシュ、SHA-1署名、DES/3DES暗号化など、現在では安全性が低いとされる古いアルゴリズムは、特別な理由がない限り使用しないでください。鍵長も、RSAなら2048ビット以上(可能であれば4096ビット)、ハッシュ関数はSHA-256以上、対称暗号はAES-256を使用するのが現在の推奨です。
  • 証明書検証: 証明書を扱う際には、必ず発行者、有効期限、失効状態 (CRL/OCSP)、目的、SANなどを検証してください。特に、外部から取得した証明書や秘密鍵は、その正当性を慎重に確認する必要があります。

まとめ

OpenSSLコマンドは、SSL/TLS、証明書、暗号化など、現代のセキュリティ技術を扱う上で非常に強力で柔軟なツールです。その豊富な機能は膨大なサブコマンドとオプションによって提供されており、初めは圧倒されるかもしれません。

この記事では、OpenSSLの基本的なコマンド構造から始め、秘密鍵生成 (genpkey/genrsa)、CSR作成 (req)、証明書操作 (x509)、PKCS#12ファイル (pkcs12)、SSL/TLS接続テスト (s_client/s_server)、ハッシュ/署名 (dgst)、暗号化 (enc)、証明書検証 (verify)、乱数生成 (rand)、バージョン情報 (version)、リスト表示 (list) といった主要なサブコマンドについて、その重要なオプションと具体的な利用例を詳細に解説しました。

ここで紹介したオプションはOpenSSL機能のほんの一部ですが、これらを習得することで、証明書の発行・管理、SSL/TLSサーバーのトラブルシューティング、データの暗号化といった日常的または緊急性の高いタスクの多くを実行できるようになります。

OpenSSLコマンドを使いこなすための鍵は、目的とする操作に対応するサブコマンドを知り、次にそのサブコマンドの機能を制御するオプションを理解することです。慣れないうちは--helpオプション (多くのサブコマンドで利用可能) やman openssl <サブコマンド名>で詳細な情報を確認しながら作業を進めることをお勧めします。

セキュリティは絶えず進化しており、OpenSSLも定期的にアップデートされています。最新のバージョンを使用し、非推奨とされた古いアルゴリズムやオプションの使用は避けるように心がけてください。

この記事が、OpenSSLコマンドの理解を深め、日々のセキュリティ関連業務や学習の一助となれば幸いです。


コメントする

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

上部へスクロール