2018年7月19日木曜日

WindowsにOpenSSLをインストールして証明書を取り扱う(基本編):Tech TIPS - @IT

http://www.atmarkit.co.jp/ait/articles/1601/29/news043.html

Tech TIPS:WindowsにOpenSSLをインストールして証明書を取り扱う(基本編)

電子証明書やSSL/TLSのための標準的なツールキット「OpenSSL」。だがWindows OSには標準でインストールされていない。Windows OSでOpenSSLを利用するのに必要なインストール手順と注意点を解説する。

2018年05月16日 05時00分 公開
[島田広道デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象:OpenSSL(Windows OS)

 SSL/TLS対応のWebサイトを構築したり、セキュアな通信路を必要とするアプリケーションをセットアップしたりする場合、電子証明書(以下、単に「証明書」)を取り扱う機会がよくある。

 対象プラットフォーム/アプリケーションがUNIX/Linux系の場合、証明書に関する作業手順の多くは「OpenSSL」を用いた方法で説明されている。OpenSSLとはSSL/TLSのツールキットおよび暗号化ライブラリのデファクトスタンダードで、UNIX/Linux系で多用されている。

 Windows OSにも証明書を取り扱うためのコマンドや役割・機能は備わっている。だが、OpenSSLとは使い方が全く異なるため、例えばOpenSSL向けの作業手順書しかない状況では役に立たない。

 そのような場合は、Windows OS用のOpenSSLをセットアップし、Windows OSでもOpenSSLを使えるようにすればよい。本稿では、Windows上でopenssl.exeを実行して証明書を操作できるようにするという前提で、そのインストール手順や注意点を説明する。

Windows OS用のOpenSSLのインストーラをダウンロードする

 OpenSSL公式サイトでは、OpenSSLのソースファイルのみが配布されている。そこからWindows用にコンパイルするのは(開発者でない限り)ハードルが高いので、次のWebサイトで配布されているインストーラを利用する。

 このページの「Download Win32 OpenSSL」というセクションにある表で、以下のいずれかのリンクをクリックすると、コンパイル済みのWindows OS用OpenSSLバイナリのインストーラをダウンロードできる。

Windows用OpenSSL「Win32 OpenSSL」のインストーラのダウンロードページWindows用OpenSSL「Win32 OpenSSL」のインストーラのダウンロードページ

●どのインストーラを選ぶべきか?

 各インストーラのリンクのテキストには、次のような意味がある。

  • 冒頭の「Win32」「Win64」: OSのアーキテクチャ
  • OpenSSL v」に続く数値とアルファベット: OpenSSLのバージョン
  • Light」: エンドユーザー向けに最低限のツールのみパッケージ化した軽量版インストーラ。これがない場合は開発用ライブラリファイルなどが付属し、そのサイズも大きい

 これらについて、アプリケーションやミドルウェアなどから特定されているなら、それに従うだけだ。だが、特に指定がない場合はどのように選ぶべきか?

●OSのアーキテクチャは?

 これは原則として「Win32」でよいだろう。32bit版Windows OSでは「Win32」の方しか実行できない一方で、64bit版Windows OSでも「Win32」は利用できるからだ。ただし、Windows ServerなどでWOW64をインストールしていない環境では「Win64」しか実行できないので、こちらを選ぶこと。

●OpenSSLのバージョンは?

 本稿の執筆・更新時点で「Win32 OpenSSL」サイトからは、次のバージョンのインストーラを入手できる。

  • Ver.1.0.2: Long Term Support(LTS)版。2019年末までサポートされる
  • Ver.1.1.0: Ver.1.0.2の次のバージョン。Ver.1.1.1の正式リリースから1年後にサポート終了予定

 もしLinuxディストリビューションとの互換性を重視するなら、Ver.1.0.2の方がよいだろう。主要なLinuxディストリビューションではデフォルトでVer.1.0.2がインストールされるからだ(本稿の執筆・更新時点)。

 一方、新しい機能を重視するなら、Ver.1.1.0(あるいは間もなく正式リリース予定のVer.1.1.1)の方がよいだろう。実際、TIPS「OpenSSLでSSLサーバ証明書の有効期間を自動的に確認して更新漏れを防ぐ」では、Ver.1.1.0にはあってVer.1.0.2にはない機能を用いて有効期間を調べている。

 Ver.1.0.2より前のバージョンは、既にサポートが終了しているため、今からインストールするのは避けた方がよい。

●「Light」の有無は?

 これは原則として「Light」付き、すなわち軽量版を選ぶとよいだろう。(openssl.exeではなく)OpenSSLのライブラリを使ってアプリやサービスを開発する場合のみ、「Light」の付かない方を選べばよい。

WindowsにOpenSSLをインストールする

 Windows用OpenSSLのインストーラをダウンロードしたら、それを起動し、以下の手順でインストールを進める。

OpenSSLをWindowsにインストールする(1/5)OpenSSLをWindowsにインストールする(1/5)

 Win32 OpenSSLのインストーラにはデジタル署名がなされていないため、このような警告メッセージが表示される。[はい]ボタンをクリックして次へ進んだ後で「セキュリティの警告」というメッセージが表示されたら、[実行]ボタンをクリックして次へ進む。

OpenSSLをWindowsにインストールする(2/5)OpenSSLをWindowsにインストールする(2/5)

 上記はインストールウィザードの2番目に表示されるライセンス許諾の画面だ。許諾内容を読んで確認してから[I accept the agreement]を選んで次へ進む。

OpenSSLをWindowsにインストールする(3/5)OpenSSLをWindowsにインストールする(3/5)

 必要であれば、上記の画面でインストール先のフォルダを変更できる。

OpenSSLをWindows OSにインストールする(4/5)OpenSSLをWindows OSにインストールする(4/5)

 上記の画面では、DLLファイルの保存場所を選ぶ。デフォルトでは[The Windows system directory]が選択されている。だが、サードパーティー製ソフトウェアのDLLをみだりにWindows OSのシステムフォルダに格納することは推奨されていない。そこで[The OpenSSL binaries (/bin) directory]を選ぶ。

 {Next}ボタンをクリックしていくとインストールが始まる。

OpenSSLをWindowsにインストールする(5/5)OpenSSLをWindowsにインストールする(5/5)

 上記はインストールウィザードの最後の画面だ。寄付を後回しにする場合は、このチェックを外してオフにしてから、[Finish]ボタンをクリックする。

 以上でOpenSSLのインストールは完了だ。

openssl.exeにパスを通す

 上記の手順でOpenSSLをインストールしただけだと、実行時にいちいちopenssl.exeやDLLの在りかをフルパスで指定しなければならない。これは面倒なので、以下の手順で実行パスの設定を変更する。

 まずは[システムのプロパティ]を開く。TIPS「Windows 10でコントロールパネルの[システム]や[システムのプロパティ]を素早く開く方法」が参考になるだろう。

 次に[詳細設定]タブにある[環境変数]ボタンをクリックする。

openssl.exeにパスを通す(1/3)openssl.exeにパスを通す(1/3)

 「環境変数」ダイアログが表示されたら「システム環境変数」枠で[Path]を選択してから、[編集]ボタンをクリックする。

openssl.exeにパスを通す(2/3)openssl.exeにパスを通す(2/3)

 「環境変数名の編集」ダイアログが表示されたら、[新規]ボタンをクリックして末尾に「<OpenSSLインストール先フォルダ>\bin」を追加する。

openssl.exeにパスを通す(3/3)openssl.exeにパスを通す(3/3)

 Path環境変数の設定の詳細については、TIPS「Windows 10でPath環境変数を設定/編集する」を参照していただきたい。

 上記の作業が完了したら、コマンドプロンプトを起動し直してから、次のようにopenssl.exeを実行してみよう。このとき、カレントフォルダはインストール先のbinフォルダ以外にすること。

openssl.exeが実行できるか確認するopenssl.exeが実行できるか確認する

OpenSSL用に認証局(CA)の証明書ファイルを用意する

 ここまでの手順だけでは、openssl.exeの実行時に「unable to get local issuer certificate」といったエラーが生じることがある。以下は、SSL/TLSのサーバにアクセスして証明書を検証・取得するコマンド「s_client」の実行例だ。

CA証明書を用意していない場合に生じるopenssl.exeのエラーの例CA証明書を用意していない場合に生じるopenssl.exeのエラーの例

 これは、ローカルコンピュータ上で認証局(Certificate Authority、CA)の証明書が見つからない、ということを示している。

●「unable to get local issuer certificate」というエラーが生じる理由

 OpenSSLに限らず、証明書が正しいものかどうかを検証する過程では、証明書の発行元であるCAの証明書が必要になる。これは一般的に、検証中に(リモートのサイトではなく)ローカルコンピュータ上で参照できる必要がある。

 Windows OSでもCAの証明書はローカルコンピュータに保存されている。証明書管理ツール「certmgr.msc」「certlm.msc」で表示できる「証明書ストア」の[信頼されたルート証明機関]-[証明書]などに格納されているのが、CAの証明書だ。

 しかしOpenSSLはこのWindows OS標準の証明書ストアを参照せず、かつ配布されているOpenSSLのインストーラにもCAの証明書は含まれていない。

●配布されているCAの証明書ファイルを入手する

 そのため、別途CAの証明書を用意する必要がある。その手軽な方法としては、OpenSSLでそのまま利用できる形式で配布されているCA証明書ファイルを入手することが挙げられる。例えば、指定したURLのサイトからデータをダウンロードするコマンドラインツール「curl」の配布元サイトでは、「cacert.pem」という名前でCA証明書ファイルを提供している。

 このWebページの冒頭にある「cacert.pem」というリンクをクリックすると、このファイルがダウンロードできる。それを適当なフォルダに保存しておき、openssl.exeを実行する際に、その在りかをオプションで指定すればよい。例えば前述のs_clientコマンドの場合、「-CAfile <cacert.pemのフルパス>」というオプションを指定する。

用意したCA証明書を指定してopenssl.exeを実行したときの例用意したCA証明書を指定してopenssl.exeを実行したときの例

 ただし、この方法では社内プライベートCAに対応できない。cacert.pemに記載されているのは一般に広く利用できるCAだけだからだ。この問題の解消方法については、別途解説したい。

openssl.exeの基本的な使い方

 openssl.exeの基本的な書式は次の通りだ。

openssl <コマンド> <オプションパラメーター>

 この<コマンド>だけでも48個以上あり、付随するオプションも多数存在する。詳細は別稿で解説するとして、以下では、証明書に関わる基本的な書式の例を挙げるだけに止めておく。

●証明書の要求を作成する

 以下のコマンドラインを実行すると、「www.example.jp」という共通名(Common Name)の証明書要求が生成され、「www_example_jp.csr」というファイルに保存される。同時にその秘密鍵も「www_example_jp.key」に保存される。

C:\temp>openssl req -new -newkey rsa:2048 -nodes -out www_example_jp.csr -keyout www_example_jp.key -sha256 -subj "/C=JP/ST=Tokyo/L=Setagaya-ku/O=Example Corp./OU=System Management Division/DC=example/DC=jp/CN=www.example.jp"
Generating a 2048 bit RSA private key
.....+++
........................................+++
writing new private key to 'www_example_jp.key'
-----

●証明書の形式を変換する

 以下のコマンドラインを実行すると、PKCS12形式の証明書ファイル「example.pfx」からPEM形式の証明書ファイル「example.pem」が変換・生成される。example.pemには、暗号化されていない秘密鍵とルート証明書、中間証明書、サーバ証明書など一式が含まれる。

C:\temp>openssl pkcs12 -in example.pfx -nodes -out example.pem -info
Enter Import Password:
MAC:sha1 Iteration 2000
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2000
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2000
Certificate bag
Certificate bag
Certificate bag

 PEM形式へ変換する方法については、TIPS「Windows上で、証明書や秘密鍵をPEM形式に変換してエクスポートする」を参照していただきたい。

設定ファイル「bin\openssl.cfg」の編集・修正が必要な場合も

 OpenSSLでは、コマンドラインで指定するオプションの他、設定ファイル「openssl.cfg」でも各種指定ができる。デフォルトでは、OpenSSLをインストールしたフォルダのbinサブフォルダに格納される。そのパスは環境変数「OPENSSL_CONF」で指定できる。

 注意すべきは、コマンドラインオプションとopenssl.cfgのどちらか一方でしか指定できない設定項目があることだ。例えば証明書の発行に利用するCAの詳細についてはopenssl.cfg、証明書の検証時に参照するローカルのCA証明書についてはコマンドラインオプション(-CAfileや-CApath)で、それぞれ指定する必要がある。

 また、デフォルトのopenssl.cfgは改行コードが(Windows標準の)CRLFではなくLFになっているせいで、メモ帳では正しく編集できないことがある(Windows 10 April 2018 Updateでは編集可能)。秀丸エディタやVisual Studio Codeなど、LFの改行コードに対応したテキストエディタで編集する必要がある。

OpenSSLの脆弱(ぜいじゃく)性に要注意!

 OpenSSLではしばしば脆弱性が発覚し、更新版がリリースされることがよくある。

 上記の手順でWindows OSにインストールしたOpenSSLについても、脆弱性が解消された更新版がリリースされたら、速やかに更新すべきだ。

 それには、単に更新版のインストーラを実行して再インストールすればよい。自動的に旧版を上書きする形でアップグレードが行われる。ただし、カスタマイズしたopenssl.cfgも上書きされてしまうので、必要なら事前にバックアップしておき、アップグレード後、カスタマイズした箇所を新たなopenssl.cfgに書き戻す必要がある。

■更新履歴

【2018/05/16】OpenSSL Ver.1.0.2/1.1.0およびWindows 10の情報を反映しました。スクリーンショットを一新しました。CA証明書の取り扱いについて追記しました。

【2016/01/29】初版公開。

「Tech TIPS」のインデックス

0 件のコメント:

コメントを投稿