Tech TIPS:WindowsにOpenSSLをインストールして証明書を取り扱う(基本編)
電子証明書やSSL/TLSのための標準的なツールキット「OpenSSL」。だがWindows OSには標準でインストールされていない。Windows OSでOpenSSLを利用するのに必要なインストール手順と注意点を解説する。
対象: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バイナリのインストーラをダウンロードできる。
●どのインストーラを選ぶべきか?
各インストーラのリンクのテキストには、次のような意味がある。
これらについて、アプリケーションやミドルウェアなどから特定されているなら、それに従うだけだ。だが、特に指定がない場合はどのように選ぶべきか?
●OSのアーキテクチャは?
これは原則として「Win32」でよいだろう。32bit版Windows OSでは「Win32」の方しか実行できない一方で、64bit版Windows OSでも「Win32」は利用できるからだ。ただし、Windows ServerなどでWOW64をインストールしていない環境では「Win64」しか実行できないので、こちらを選ぶこと。
●OpenSSLのバージョンは?
本稿の執筆・更新時点で「Win32 OpenSSL」サイトからは、次のバージョンのインストーラを入手できる。
もし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のインストーラをダウンロードしたら、それを起動し、以下の手順でインストールを進める。
Win32 OpenSSLのインストーラにはデジタル署名がなされていないため、このような警告メッセージが表示される。[はい]ボタンをクリックして次へ進んだ後で「セキュリティの警告」というメッセージが表示されたら、[実行]ボタンをクリックして次へ進む。
上記はインストールウィザードの2番目に表示されるライセンス許諾の画面だ。許諾内容を読んで確認してから[I accept the agreement]を選んで次へ進む。
必要であれば、上記の画面でインストール先のフォルダを変更できる。
上記の画面では、DLLファイルの保存場所を選ぶ。デフォルトでは[The Windows system directory]が選択されている。だが、サードパーティー製ソフトウェアのDLLをみだりにWindows OSのシステムフォルダに格納することは推奨されていない。そこで[The OpenSSL binaries (/bin) directory]を選ぶ。
{Next}ボタンをクリックしていくとインストールが始まる。
上記はインストールウィザードの最後の画面だ。寄付を後回しにする場合は、このチェックを外してオフにしてから、[Finish]ボタンをクリックする。
以上でOpenSSLのインストールは完了だ。
openssl.exeにパスを通す
上記の手順でOpenSSLをインストールしただけだと、実行時にいちいちopenssl.exeやDLLの在りかをフルパスで指定しなければならない。これは面倒なので、以下の手順で実行パスの設定を変更する。
まずは[システムのプロパティ]を開く。TIPS「Windows 10でコントロールパネルの[システム]や[システムのプロパティ]を素早く開く方法」が参考になるだろう。
次に[詳細設定]タブにある[環境変数]ボタンをクリックする。
「環境変数」ダイアログが表示されたら「システム環境変数」枠で[Path]を選択してから、[編集]ボタンをクリックする。
「環境変数名の編集」ダイアログが表示されたら、[新規]ボタンをクリックして末尾に「<OpenSSLインストール先フォルダ>\bin」を追加する。
Path環境変数の設定の詳細については、TIPS「Windows 10でPath環境変数を設定/編集する」を参照していただきたい。
上記の作業が完了したら、コマンドプロンプトを起動し直してから、次のようにopenssl.exeを実行してみよう。このとき、カレントフォルダはインストール先のbinフォルダ以外にすること。
OpenSSL用に認証局(CA)の証明書ファイルを用意する
ここまでの手順だけでは、openssl.exeの実行時に「unable to get local issuer certificate」といったエラーが生じることがある。以下は、SSL/TLSのサーバにアクセスして証明書を検証・取得するコマンド「s_client」の実行例だ。
これは、ローカルコンピュータ上で認証局(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に対応できない。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】初版公開。
■この記事と関連性の高い別の記事
0 件のコメント:
コメントを投稿