4.8. 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 が利用可能かどうかをテストします。シェルスクリプトでの使用を目的としています。詳細については、openssl(1) の man ページを参照してください。

4.8.1. 暗号鍵の作成と管理

OpenSSL では、公開鍵は対応する秘密鍵から生成されます。このため、アルゴリズムを決定した後に最初に行うことは、秘密鍵の生成になります。以下の例では、秘密鍵を privkey.pem とします。たとえば、デフォルトのパラメーターを使用して RSA 秘密鍵を作成するには、以下のコマンドを実行します。
~]$ openssl genpkey -algorithm RSA -out privkey.pem
RSA アルゴリズムは以下のオプションに対応しています。
  • rsa_keygen_bits:numbits — 生成される鍵のビット数です。指定されない場合は、1024 が使われます。
  • rsa_keygen_pubexp:value — RSA 公開指数の値です。これは大きな十進数か、0x で始まる場合は十六進数にすることができます。デフォルト値は 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
秘密鍵の生成に関する詳細については、genpkey(1) の man ページを参照してください。

4.8.2. 証明書の生成

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

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

CA に提出する証明書を作成するには、コマンドを以下の形式で実行します。
~]$ openssl req -new -key privkey.pem -out cert.csr
これで、デフォルトの privacy-enhanced electronic mail (PEM) 形式でエンコードされた cert.csr と呼ばれる X.509 証明書が作成されます。PEM という名前は、Privacy Enhancement for Internet Electronic Mail に由来し、RFC 1424 で説明されています。別の DER 形式で証明書ファイルを生成するには、-outform DER コマンドオプションを使用します。
上記のコマンドを発行すると、証明書の識別名 (DN) を作成するために、ユーザー自身と組織の情報が求められます。以下の情報が必要になります。
  • 2 文字の国コード
  • 州または県の名前
  • 市または自治体
  • 組織の名前
  • 組織内の部署名
  • ユーザー名もしくはシステムのホスト名
  • Email アドレス
req(1) man ページでは、 PKCS# 10 証明書要求とユーティリティーの生成について説明されています。証明書作成プロセスで使用されるデフォルト設定は、/etc/pki/tls/openssl.cnf ファイル内にあります。詳細については、openssl.cnf(5) man ページを参照してください。

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

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

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

/etc/pki/tls/certs ディレクトリーには Makefile が格納されており、これに make コマンドを使用すると証明書が作成できます。使用方法を確認するには、以下のコマンドを実行します。
~]$ make -f /etc/pki/tls/certs/Makefile
または、ディレクトリーに移動して以下のように make コマンドを実行することもできます。
~]$ cd /etc/pki/tls/certs/
~]$ make
詳細については、make(1) man ページを参照してください。

4.8.3. 証明書の検証

CA 署名がされている証明書は、信頼できる証明書と呼ばれます。このため、自己署名証明書は、信頼されない証明書になります。検証ユーティリティーは、OpenSSL が通常の工程で使用するものと同じ SSL および S/MIME 機能を使用します。エラーが見つかると報告され、他のエラーを見つけるためにテストを継続する試みがなされます。
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
詳細については、verify(1) man ページを参照してください。

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

OpenSSL でファイルを暗号化 (および復号化) する場合は、pkeyutl または enc 組み込みコマンドを使用できます。pkeyutl では、暗号化および復号化を実行するために RSA 鍵が使用されますが、enc では、シンメトリックアルゴリズムが使用されます。

RSA 鍵の使用

ファイル plaintext を暗号化するには、以下のコマンドを実行します。
~]$ 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
plaintext という名前のデータファイルに署名するには、以下のコマンドを実行します。
~]$ 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
aes-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.8.5. メッセージダイジェストの生成

dgst コマンドは、十六進数形式で提供されたファイルのメッセージダイジェストを作成します。このコマンドは、デジタル署名および検証にも使用できます。メッセージダイジェストコマンドの形式は以下のとおりです。
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
詳細については、dgst(1) man ページを参照してください。

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

passwd コマンドは、パスワードのハッシュを計算します。コマンドラインでパスワードのハッシュを計算するには、以下のコマンドを実行します。
~]$ openssl passwd password
デフォルトでは、-crypt アルゴリズムが使用されます。
BSD アルゴリズム 1 に基づく MD5 を使用して、標準入力からパスワードのハッシュを計算するには、以下のコマンドを実行します。
~]$ openssl passwd -1 password
-apr1 オプションが BSD アルゴリズムの Apache バリアントを指定します。
salt xx を使用してファイルに保存されているパスワードのハッシュを計算するには、以下のコマンドを実行します。
~]$ openssl passwd -salt xx -in password-file
パスワードは標準出力に送信され、出力ファイルを指定する -out オプションはありません。-table は、パスワードハッシュの表とそれに対応するクリアテキストのパスワードを生成します。
詳細およびその他の例については、sslpasswd(1) の man ページを参照してください。

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

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

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

あるアルゴリズムにおけるシステムの演算速度をテストするには、以下のコマンドを実行します。
~]$ openssl speed algorithm
ここでの algorithm は、使用する予定の対応アルゴリズムのいずれかになります。利用可能なアルゴリズムを一覧表示するには、openssl speed と入力してタブを押します。

4.8.9. OpenSSL の設定

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