hana_shinのLinux技術ブログ読者になるhana_shinのLinux技術ブログLinuxの技術情報を掲載しています。ネットワークをメインに掲載していきます。opensslコマンドとは?opensslコマンドは、以下のような様々な暗号化機能を実行できます。ネットワーク構成サーバとクライアントの2台構成です。図中のeth0はNICの名前です。版数CentOS版数は、サーバ、クライアントともに下記版数です。(Core)カーネル版数は以下のとおりです。opensslパッケージのインストール方法サーバ、クライアントにopensslパッケージをインストールします。opensslopensslコマンドの版数を確認します。opensslより引用したopensslの書式を以下に示します。]上記書式のcommandの部分ですが、多数のコマンドが存在します。ここでは、どのようなコマンドが存在するのかを確認する方法について説明します。コマンドの分類として、大きく以下のものがあります。標準コマンドの表示方法(list-standard-commands)標準コマンドを表示してみます。asn1parse,ca,ciphers等の標準コマンドがあることがわかります。asn1parse"と実行すると、asn1parseのマニュアルを表示することができます。メッセージダイジェストを生成するコマンドの表示方法(list-message-digest-commands)メッセージダイジェストを生成するコマンドを表示してみます。md2,md4,md5等のコマンドがあることがわかります。md2"と実行すると、md2のマニュアルを表示することができます。暗号スイートのコマンドを表示する方法(list-cipher-commands)暗号スイートのコマンドを表示してみます。aes-128-cbc,aes-128-ecb,aes-192-cbc等のコマンドがあることがわかります。暗号スイート一覧を表示する方法(list-cipher-algorithms)暗号スイート一覧を表示してみます。ハッシュ関数"の組によって構成されます。暗号スイートは、"暗号化ーハッシュ関数"の組み合わせになりました。メッセージダイジェストのアルゴリズム一覧する方法(list-message-digest-algorithms)メッセージダイジェストのアルゴリズム一覧を表示してみます。genrsaコマンドの使い方genrsaは、RSA秘密鍵を生成するコマンドです。genrsa"と実行すると、genrsaのマニュアルを参照することができます。key.-snip-ここでは、genrsaコマンドで秘密鍵を作成し、秘密鍵に対する公開鍵を作成してみます。作成した秘密鍵にパスフレーズを設定してみます。(0x10001)作成した秘密鍵(private.key)を確認します。fileコマンドで確認すると、private.keyが秘密鍵であることがわかります。key作成した秘密鍵は、他人に読まれてはいけないので、パミッションを変更します。private.key生成した秘密鍵の中身を確認してみます。BEGINとENDの間が秘密鍵になります。KEY-----次は、秘密鍵(private.key)に対する公開鍵(public.key)を作成してみます。key公開鍵(public.key)のファイルタイプを確認してみます。text最後に、秘密鍵にパスフレーズを設定します。秘密鍵をそのまま保存しておくのは良くありません。秘密鍵が盗まれると、暗号通信が全て解読できてしまうからです。秘密鍵にパスフレーズを設定して、秘密鍵を盗まれても利用できないようにしておきます。ここでは、des3で秘密鍵を暗号化してみます。des3の他にdes,idea等があります。s_clientコマンドの使い方s_clientコマンドは、TLSクライアントとして動作します。基本的な使い方connectオプションを使って、www.example.comにTLSで接続してみます。example.comはIANAが予約しているドメインです。Indication)対応サーバに接続する方法SNIはSSL/TLSの拡張仕様の一つです。1つのIPで複数のSSL/TLS証明書を保持する技術です。TLSハンドシェイク時にクライアントがアクセスしたいホスト名を伝えることで、サーバ側がIPではなくホスト名によって異なる証明書を使い分けることができます。この設定がされたホストに接続するときは、SNIに必要なホスト名の情報を”servername"オプションで指定します。首相官邸のWebサーバにアクセスしてみます。(ok)---^C以前(2018年頃)、記事を執筆した際、"servername"オプションを指定しなくても、首相官邸のWebサーバにアクセスできたのですが、"servername"オプションを指定しないと、以下のようにエラーになります。どこかのタイミングでSNI対応になったのですかね。TLSバージョンを指定してTLSサーバに接続する方法TLS1.2で接続してみます。bits^CTLS1.1で接続してみます。TLS1.1使えるのですね。証明書チェインを表示する方法(-showcerts)ルートCAに至るまでの証明書チェインを確認してみます。depth=2がルートCA、depth=1が中間CA、depth=0がwww.example.comのサーバ証明書になります。簡潔に表示する方法(-quiet)quietオプションを使うと、証明書チェインだけが表示されます。TLSメッセージのやりとりを表示する方法(-msg)msgオプションを使うと、TLSサーバとクライアントでやりとりするメッセージを表示することができます。msgオプションだけだと、メッセージが見にくいので、grepで絞り込みをしてみました。grepで絞り込んだ左端は、以下の意味になります。サーバ証明書をファイルに保存する方法サーバ(www.example.com)がクライアントに送信するサーバ証明書をファイルに保存してみます。example.pemファイルに保存したサーバ証明書を確認します。CERTIFICATE------snip-fileコマンドでサーバ証明書のファイル形式を確認をします。PEM形式であることがわかります。PEMファイルの判定処理は/usr/share/magicに記述されています。s_serverコマンドの使い方s_serverは、TLSサーバとして動作するコマンドです。事前準備(秘密鍵、サーバ証明書の作成)事前準備として、秘密鍵とサーバ証明書を作成します。秘密鍵(private.key)を作成します。(0x10001)秘密鍵をもとに証明書署名要求(server.csr)を作成します。[]:自身の秘密鍵(private.key)を使って、証明書署名要求に対して署名をします。サーバ証明書は、server.crtというファイル名で作成されます。key作成したファイルを確認します。ファイルは、それぞれ、以下のとおりです。基本的な使い方サーバ証明書(server.crt)と秘密鍵(private.key)を指定してTLSサーバを起動します。コマンドを使って、opensslプロセスがListenしているポート番号を確認します。4433番ポートでListenしていることがわかります。hana_shinのLinux技術ブログを参照してください。(LISTEN)クライアントからTLSサーバに接続するため、サーバの4433番ポートを開放します。hana_shinのLinux技術ブログを参照してください。--list-ports4433/tcpクライアントからTLSサーバに接続してみます。接続先ポート番号は4433ポートを指定します。指定したポート番号でListenする方法(-accept)opensslサーバが、デフォルトの4433番ポートではなく、11111番ポートでListenしてみます。parametersACCEPTTCPの11111番ポートを開放します。--add-port=11111/tcpsuccessポートの状態を確認します。TCPの11111番ポートが開放されたことがわかります。--list-ports11111/tcplsofコマンドを実行します。opensslプロセスがTCPの11111番ポートでLISTENしていることがわかります。(LISTEN)クライアントからサーバに接続します。WWWサーバとして動作させる方法(-WWW)テスト用のhtmlファイルを作成します。Worldサーバ証明書と秘密鍵を確認します。server.crtWWWオプションを指定して、webサーバとして起動します。parametersACCEPTcurlコマンドを使ってwebサーバにアクセスします。World"を受信していることがわかります。X509コマンドの使い方X.509は、公開鍵証明書を管理するコマンドです。事前準備として、www.example.comからサーバ証明書をダウンロードします。example.pemダウンロードしたサーバ証明書のファイルタイプを確認してみます。certificateサーバ証明書を確認してみます。27:73:54:e8サーバ証明書に登録されている、国名(C)、組織名(O)、コモン名(CN)等のサブジェクトを確認してみます。Inc./CN=www.example.orgシリアル番号を確認してみます。-serialserial=025216E1C4998E2632AA5D1DA985B43Cwww.example.orgのサーバ証明書を発行した中間CAの情報を確認してみます。Protocol)は、X.509公開鍵証明書の失効状態を取得するための通信プロトコルです。-ocsp_urihttp://ocsp.digicert.com証明書から公開鍵を取り出してみます。PEM)秘密鍵(private.key)を作成します。(0x10001)秘密鍵をもとに証明書署名要求(server.csr)を作成します。[]:PEM形式でサーバ証明書(server.crt)を作成します。outオプションで生成するファイル名を指定します。PEM形式であることがわかるように、拡張子をpemにしました。keyファイルタイプを確認します。PEM形式であることがわかります。DER)DER形式でサーバ証明書(server.der)を生成します。outオプションで生成するファイル名を指定します。DER形式であることがわかるように、拡張子をderにしました。keyファイルタイプを確認します。DER形式からPEM形式に変換する方法(-inform,-outform)ファイルタイプを確認します。dataDER形式からPEM形式に変換します。PEMファイルタイプを確認します。PEM形式に変換されたことがわかります。ciphersコマンドの使い方ciphersコマンドは、暗号スイートを表示するコマンドです。tool.暗号スイートを表示してみます。dgstコマンドの使い方dgstコマンドは、メッセージダイジェストを計算するときに使います。メッセージダイジェストとは、ハッシュ関数が生成する値です。digests-snip-テスト用のファイルを作成します。hana_shinのLinux技術ブログを参照してください。test.dat作成したテストファイルを確認します。test.datsha512コマンドを使って、テスト用ファイルのダイジェストを計算してみます。rsautlコマンドの使いかたrsautlコマンドを使って、公開鍵で暗号化したファイルを秘密鍵で復号してみます。事前準備テスト用のファイルを作成します。test.txt作成したファイルを確認します。test.txt12345678902048ビットのRSA秘密鍵を作成します。ここでは、作成した秘密鍵の暗号化はしません。(0x10001)作成した秘密鍵のファイルタイプを確認します。key作成したRSA秘密鍵に対する公開鍵を作成します。作成した公開鍵を使って、テスト用ファイルを暗号化してみます。暗号化したファイルのファイル名は、test.txt.encになります。test.txt.enc暗号化したファイルを確認します。test.txt.encというファイルが作成できたことがわかります。dataテスト用のファイルを削除します。yファイルを確認します。テスト用ファイルが削除されたことがわかります。test.txt.enc暗号化したファイルを復号します。復号するファイルのファイル名はtest.txtにします。test.txt復号したファイルの内容を確認してみます。復号できていることがわかります。首相官邸ホームページの証明書チェインを確認してみます。openssl-01openssl-02ルートCAへの証明書チェインは、以下のようになっていました。openssl-03ブラウザに表示されたルートCAまでの証明書チェインは以下のとおりです。Name)は"GlobalSign"となっていました。ルートCA証明書を確認する方法ブラウザにインストールされているルートCAの証明書を確認してみます。ここでは、"GlobalSign"のルートCAの証明書がインストールされていることを確認してみます。首相官邸ホームページにアクセスした際、webサーバから送られてくる証明書の確認方法について説明します。首相官邸のwebサーバにアクセスします。/dev/null実行結果を以下に示します。説明に必要な部分だけを引用しています。0ではじまるところがサーバ証明書、1ではじまるところが中間CA証明書です。i(issuer)は証明書の発行者、s(subject)は証明書を受け取る側を表します。首相官邸ホームページにアクセスすると、クライアントにサーバ証明書(下記0の証明書)、中間CA証明書(下記1の証明書)が送付されていることがわかります。私が業務や記事執筆で参考にした書籍を以下のページに記載します。)はてなブログをはじめよう!hana_shinさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。