Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

4.7. OpenSSL の使用

OpenSSL は、アプリケーションに暗号化プロトコルを提供するライブラリーです。openssl コマンドラインユーティリティーは、シェルからの暗号化機能の使用を可能にします。これには、インタラクティブモードが含まれています。
openssl コマンドラインユーティリティーには、システムにインストールされている openssl のバージョンがサポートするコマンドに関する情報を提供する多数の疑似コマンドがあります。疑似コマンド list-standard-commandslist-message-digest-commands、および list-cipher-commands は、現在の openssl ユーティリティーで利用可能なすべての標準コマンド、メッセージダイジェストコマンド、または暗号コマンドの一覧を出力します。
疑似コマンド list-cipher-algorithms および list-message-digest-algorithms は、すべての暗号名とメッセージダイジェスト名を一覧表示します。擬似コマンド list-public-key-algorithms は、サポートされているすべての公開鍵アルゴリズムを一覧表示します。たとえば、サポートされている公開鍵アルゴリズムを一覧表示するには、次のコマンドを発行します。
~]$ openssl list-public-key-algorithms
疑似コマンド no-command-name は、指定された名前の command-name が使用可能かどうかをテストします。シェルスクリプトでの使用を目的としています。詳細は、man openssl(1) を参照してください。

4.7.1. 暗号鍵の作成および管理

OpenSSL では、公開鍵は対応する秘密鍵から派生します。したがって、アルゴリズムを決定した後の最初のステップは、秘密鍵を生成することです。以下の例では、秘密鍵を privkey.pem とします。たとえば、デフォルトのパラメーターを使用して RSA 秘密鍵を作成する場合は、次のコマンドを実行します。
~]$ openssl genpkey -algorithm RSA -out privkey.pem
RSA アルゴリズムは、以下のオプションをサポートしています。
  • rsa_keygen_bits:numbits — 生成されたキーのビット数。指定されていない場合は、1024 が使用されます。
  • rsa_keygen_pubexp:value — RSA パブリック指数値。これは、大きな 10 進数値、または 0x で始まる場合は 16 進数の値になります。デフォルト値は 65537 です。
たとえば、公開指数として 3 を使用して 2048 ビットの RSA 秘密鍵を作成するには、以下のコマンドを実行します。
~]$ openssl genpkey -algorithm RSA -out privkey.pem -pkeyopt rsa_keygen_bits:2048 \ -pkeyopt rsa_keygen_pubexp:3
128 ビット AES とパスフレーズ hello を使用して、出力される秘密鍵を暗号化するには、次のコマンドを発行します。
~]$ openssl genpkey -algorithm RSA -out privkey.pem -aes-128-cbc -pass pass:hello
秘密鍵の生成に関する詳細は、man genpkey(1) を参照してください。

4.7.2. 証明書の生成

OpenSSL を使用して証明書を生成するには、秘密鍵が利用可能である必要があります。以下の例では、秘密鍵を privkey.pem とします。秘密鍵をまだ生成していない場合は、「暗号鍵の作成および管理」 を参照してください。
認証局 (CA) に証明書に署名してもらうには、証明書を生成してから CA に送信して署名する必要があります。これは、証明書署名要求と呼ばれます。詳細は、「証明書署名要求の作成」 を参照してください。別の方法は、自己署名証明書を作成することです。詳細は、「自己署名証明書の作成」 を参照してください。

4.7.2.1. 証明書署名要求の作成

CA に送信するための証明書を作成するには、次の形式でコマンドを発行します。
~]$ openssl req -new -key privkey.pem -out cert.csr
これにより、デフォルトの PEM 形式(PEM)形式でエンコードされた cert.csr という名前の X.509 証明書が作成されます。PEM という名前は、RFC1424 で説明されている Privacy Enhancement for Internet Electronic Mail に由来しています。代替 DER 形式で証明書ファイルを生成するには、-outform DER コマンドオプションを使用します。
上記のコマンドを発行すると、証明書の distinguished name (DN) を作成するために、お客様や組織に関する情報を入力する画面が表示されます。以下の情報が必要になります。
  • 2 文字の国コード
  • 州または県の名前
  • 市または自治体
  • 組織の名前
  • 組織内のユニット名
  • ユーザー名もしくはシステムのホスト名
  • メールアドレス
req(1) man ページでは、PKCS# 10 証明書要求と生成ユーティリティーについて説明しています。証明書の作成プロセスで使用されるデフォルト設定は、/etc/pki/tls/openssl.cnf ファイルに含まれます。詳細は、openssl.cnf (5) の man ページを参照してください。

4.7.2.2. 自己署名証明書の作成

366 日間有効な自己署名証明書を生成するには、以下の形式でコマンドを発行します。
~]$ openssl req -new -x509 -key privkey.pem -out selfcert.pem -days 366

4.7.2.3. Makefile を使った証明書の作成

/etc/pki/tls/certs/ ディレクトリーには、make コマンドを使用して証明書を作成するのに使用できる Makefile が含まれています。使用説明書を表示するには、次のようにコマンドを発行します。
~]$ make -f /etc/pki/tls/certs/Makefile
または、ディレクトリーに移動し、以下のように make コマンドを実行します。
~]$ cd /etc/pki/tls/certs/
~]$ make
詳細は、make(1) の man ページを参照してください。

4.7.3. 証明書の確認

CA によって署名された証明書は、信頼できる証明書と呼ばれます。したがって、自己署名証明書は信頼できない証明書になります。verify ユーティリティーは、同じ SSL および S/MIME 機能を使用して、通常の操作で OpenSSL が使用する証明書を検証します。エラーが見つかった場合は報告され、他のエラーを報告するためにテストを続行しようとします。
PEM 形式の複数の個別の X.509 証明書を検証するには、次の形式のコマンドを発行します。
~]$ openssl verify cert1.pem cert2.pem
証明書チェーンを確認するには、リーフ証明書が cert.pem にあり、信頼しない中間証明書を untrusted.pem に直接連結する必要があります。信頼できるルート CA 証明書は、/etc/pki/tls/certs/ca-bundle.crt または cacert.pem ファイルに一覧表示されているデフォルト CA に含まれている必要があります。次に、チェーンを確認するために、次の形式でコマンドを発行します。
~]$ openssl verify -untrusted untrusted.pem -CAfile cacert.pem cert.pem
詳細は、man verify(1) を参照してください。
重要
MD5 ハッシュアルゴリズムを使用した署名の検証は、このアルゴリズムの強度が不十分であるため、Red Hat Enterprise Linux 7 では無効になっています。SHA 256 などの強度の高いアルゴリズムを常に使用するようにしてください。

4.7.4. ファイルの暗号化および暗号化解除

OpenSSL でファイルを暗号化(および復号化)するには、pkeyutl または enc の組み込みコマンドのいずれかを使用できます。pkeyutl では、RSA キーを使用して暗号化と復号化を実行しますが、enc では対称アルゴリズムが使用されます。

RSA 鍵の使用

プレーンテキスト と呼ばれるファイルを暗号化するには、以下のコマンドを実行します。
~]$ openssl pkeyutl -in plaintext -out cyphertext -inkey privkey.pem
キーと証明書のデフォルトの形式は PEM です。必要に応じて、-keyform DER オプションを使用して DER キー形式を指定します。
暗号エンジンを指定するには、以下のように -engine オプションを使用します。
~]$ openssl pkeyutl -in plaintext -out cyphertext -inkey privkey.pem -engine id
ここで、id は、暗号化エンジンの ID です。エンジンの可用性を確認するには、次のコマンドを発行します。
~]$ openssl engine -t
プレーンテキスト と呼ばれるデータファイルに署名するには、次のようにコマンドを発行します。
~]$ openssl pkeyutl -sign -in plaintext -out sigtext -inkey privkey.pem
署名されたデータファイルを検証してデータを抽出するには、次のようにコマンドを発行します。
~]$ openssl pkeyutl -verifyrecover -in sig -inkey key.pem
DSA 鍵などを使って署名を検証するには、次のようなコマンドを発行します。
~]$ openssl pkeyutl -verify -in file -sigfile sig -inkey key.pem
pkeyutl(1) の man ページでは、公開鍵アルゴリズムユーティリティーについて説明しています。

シンメトリックアルゴリズムの使用

利用可能な対称暗号化アルゴリズムを一覧表示するには、-l などのサポート対象外のオプションを指定して enc コマンドを実行します。
~]$ openssl enc -l
アルゴリズムを指定するには、その名前をオプションとして使用します。たとえば、aes-128-cbc アルゴリズムを使用するには、以下の構文を使用します。
openssl enc -aes-128-cbc
a es-128-cbc アルゴリズムを使用して plaintext という名前のファイルを暗号化するには、以下のコマンドを入力します。
~]$ openssl enc -aes-128-cbc -in plaintext -out plaintext.aes-128-cbc
前の例で取得したファイルを復号化するには、次の例のように -d オプションを使用します。
~]$ openssl enc -aes-128-cbc -d -in plaintext.aes-128-cbc -out plaintext
重要
enc コマンドは AEAD 暗号を適切にサポートせず、ecb モードは安全とは見なされません。最適な結果を得るには、cbccfbofb、または ctr 以外のモードを使用しないでください。

4.7.5. メッセージダイジェストの生成

dgst コマンドは、提供されたファイルまたはファイルのメッセージダイジェストを 16 進数形式で生成します。また、このコマンドは、デジタル署名や検証にも使用することができます。message digest コマンドの形式は次のとおりです。
openssl dgst algorithm -out filename -sign private-key
ここで、algorithm は、md5|md4|md2|sha1|sha|mdc2|ripemd160|dss1 のいずれかになります。執筆時点では、SHA1 アルゴリズムが推奨されます。DSA を使った署名や検証が必要な場合は、-rand オプションで指定したランダムデータを含むファイルと一緒に dss1 オプションを使用する必要があります。
sha1 アルゴリズムを使用してデフォルトの Hex 形式でメッセージダイジェストを生成するには、次のコマンドを実行します。
~]$ openssl dgst sha1 -out digest-file
秘密鍵 privekey.pem を使用してダイジェストに電子署名を行うには、以下のコマンドを実行します。
~]$ openssl dgst sha1 -out digest-file -sign privkey.pem
詳細は、man dgst(1) を参照してください。

4.7.6. パスワードハッシュの生成

passwd コマンドは、パスワードのハッシュを計算します。コマンドラインでパスワードのハッシュを計算するには、次のようにコマンドを発行します。
~]$ openssl passwd password
デフォルトでは、-crypt アルゴリズムが使用されます。
MD5 ベースの BSD アルゴリズム 1 を使用して、標準入力からパスワードのハッシュを計算するには、以下のコマンドを実行します。
~]$ openssl passwd -1 password
-apr1 オプションは、BSD アルゴリズムの Apache バリアントを指定します。
注記
openssl passwd -1 password コマンドは、FIPS モードが無効になっている場合にのみ使用してください。そうでない場合は、コマンドは機能しません。
ファイルに保存されているパスワードのハッシュを計算し、salt xx を使用するには、以下のコマンドを実行します。
~]$ openssl passwd -salt xx -in password-file
パスワードは標準出力に送られ、出力ファイルを指定する -out オプションはありません。-table は、対応するクリアテキストパスワードを含むパスワードハッシュのテーブルを生成します。
詳細および例は、man sslpasswd(1) を参照してください。

4.7.7. ランダムデータの生成

シードファイルを用いて、ランダムなデータを含むファイルを生成するには、次のコマンドを実行します。
~]$ openssl rand -out rand-file -rand seed-file
ランダムデータプロセスをシードする複数のファイルは、コロン()をリスト区切り文字と て使用して指定できます。
詳細は、man rand(1) を参照してください。

4.7.8. システムのベンチマーキング

特定のアルゴリズムのシステムの計算速度をテストするには、次の形式でコマンドを発行します。
~]$ openssl speed algorithm
ここで、algorithm は、使用する予定のサポートされているアルゴリズムの 1 つになります。利用可能なアルゴリズムを一覧表示するには、openssl speed と入力し、Tab を押します。

4.7.9. OpenSSL の設定

OpenSSL には、マスター設定ファイルと呼ばれる /etc/pki/tls/openssl.cnf 設定ファイルがあり、OpenSSL ライブラリーにより読み取られます。また、アプリケーションごとに個別の設定ファイルを用意することも可能です。設定ファイルには、[ section_name ] のようなセクション名を持つセクションが多数含まれています。最初の [ section_name ] までのファイルの最初の部分は、デフォルトのセクションと呼ばれることに注意してください。OpenSSL が設定ファイルで名前を検索する場合、名前付きセクションが最初に検索されます。すべての OpenSSL コマンドは、コマンド内で代替の設定ファイルを指定するためのオプションが使用されていない限り、マスター OpenSSL 設定ファイルを使用します。設定ファイルの詳細は、config (5) の man ページで説明されています。
2 つの RFC は、証明書ファイルの内容を説明しています。以下のとおりです。