Web開発をしているといつも気になる事があるのですが、Webサーバーにはサーバー証明書が導入されているのでアクセスするときにはhttpsプロトコルで通信するのに、自分の使っているパソコン(以降、ローカル環境)にWebサーバーと同様の環境を作ってテストする時はサーバー証明書を導入していないのでhttpプロトコルで通信していますよね?
自分もローカル環境でテストする時はhttpプロトコルで確認している一人なんですけど、どうせならローカル環境でテストする時もhttpsプロトコルで通信したいと思い、ローカル環境のIISにOpenSSLでサーバー証明書を作って導入してみる事にしました。
今回、確認した環境はWindowsXP Pro SP3のIIS5.1です。
■全体の作業手順
1.OpenSSL、Visual C++ 2008 Redistributables、ActivePerlの
ダウンロード
2.ActivePerl、Visual C++ 2008 Redistributables、OpenSSLの
インストール
3.IISのサーバー証明書要求作成
4.OpenSSLの設定ファイル編集およびサーバー証明書作成準備
5.認証局の秘密鍵作成
6.認証局の証明書作成
7.認証局の証明書をDER形式バイナリエンコード(ブラウザインポート用)
8.IISのサーバー証明書要求に署名
9.IISにサーバー証明書インストール
10.ブラウザにDER形式認証局の証明書インポート
1.OpenSSL、Visual C++ 2008 Redistributables、ActivePerlのダウンロード
まずShining Light Productions - Win32 OpenSSLのページから
32bit版OpenSSL
Visual C++ 2008 Redistributables
をダウンロードします。
※Visual C++ 2008 Redistributables はMicrosoftのサイトに遷移しますのでそちらからダウンロードしてください
あとActivePerlが必要なので、ActiveStateのサイトからActivePerl-5.10.0.1004-MSWin32-x86-287188.msiをダウンロードします。
2.OpenSSL、Visual C++ 2008 Redistributables、ActivePerlのインストール
Active Perlからインストールします。
インストール手順は以前ご紹介したflashcast:フリーで働くITエンジニア集団のブログ: サイボウズのスケジュールをWindows Mobile(Advanced/W-ZERO3 [es])に自動同期するを参考にしてください。
次にVisual C++ 2008 Redistributables をインストールします。
ダウンロードしたvcredist_x86.exeをダブルクリックします。
セキュリティ警告ダイアログが表示されます。[実行]ボタンをクリックします。

インストール画面が表示されるので、[Next>]ボタンをクリックします。

「I have read and accept the license terms.」にチェックをして[Install>]ボタンをクリックします。

インストールが終了したら[Finish]ボタンをクリックします。

続いてOpenSSLをインストールします。
ダウンロードしたWin32OpenSSL-0_9_8i.exeをダブルクリックします。
セキュリティ警告ダイアログが表示されます。[実行]ボタンをクリックします。

インストール画面が表示されるので、[Next>]ボタンをクリックします。

「I accept the agreement」にチェックをして[Next>]ボタンをクリックします。

インストールフォルダを指定します。
デフォルトのまま(C:¥OpenSSL)[Next>]ボタンをクリックします。

スタートメニューに登録するときの名前を指定します。
デフォルトのまま(OpenSSL)[Next>]ボタンをクリックします。

OpenSSL DLLのインストール先を指定します。
デフォルトは「The Windows system directory」なのですが、ここでは「The OpenSSL binaries [/bin] directory」を選択して[Next>]ボタンをクリックします。

インストールオプションの確認をして[Install]ボタンをクリックします。

インストールが完了したら[Finish]ボタンをクリックします。

3.IISのサーバー証明書要求作成
スタートアップメニューの[スタート]-[プログラム]-[管理ツール]-[インターネット インフォメーション サービス]を選択してインターネットインフォメーションサービスの管理画面を起動します。
もしくは[スタート]-[設定]-[コントロールパネル]-[管理ツール]-[インターネット インフォメーション サービス]を選択してインターネットインフォメーションサービスの管理画面を起動します。
もしインターネットインフォメーションサービスがない場合は、コントロールパネルの[プログラムの追加と削除]から[Windowsコンポーネントの追加と削除]を選び、インターネットインフォメーションサービスをインストールしてください。
インターネットインフォメーションサービスの管理画面が起動したら、左ペインにあるツリーを[インターネットインフォメーションサービス]-[コンピュータ名(実際のコンピュータ名)]-[Web サイト]-[規定の Web サイト]の順番で展開していきます。

規定のWebサイトのプロパティ画面が開いたら、「ディレクトリ セキュリティ」タグを選択して、[サーバー証明書]ボタンをクリックします。

サーバー証明書ウィザードが起動するので、[次へ(N)>]ボタンをクリックします。

「証明書の新規作成」を選択して[次へ(N)>]ボタンをクリックします。

「証明書の要求を作成して後で送信する」を選択して[次へ(N)>]ボタンをクリックします。

証明書の登録名とビット長の指定をします。
デフォルトのままで[次へ(N)>]ボタンをクリックします。

組織と部門名を入力します。
ここでは組織を「yasu corp」、部門を「system」として[次へ(N)>]ボタンをクリックします。

一般名を入力します。
ここでは「yasu」として[次へ(N)>]ボタンをクリックします。
※この一般名にはWebページにアクセスするときに指定するFQDN(完全修飾ドメイン名)を入力するようにしてください。
(https://FQDN(完全修飾ドメイン名)/...)
もしくはここで入力した一般名でローカルPCのIPアドレスを逆引きできるようにDNSやhostsファイルを設定するようにしてください。
なぜか?は最後にネタ明かしします。

国を選択、都道府県と市区町村を入力します。
ここでは国を「JP(日本)」、都道府県を「tokyo」、市区町村を「koutouku」として[次へ(N)>]ボタンをクリックします。

証明書の要求ファイル名を指定します。
ここでは「C:certreq.txt」として[次へ(N)>]ボタンをクリックします。

入力内容を確認して[次へ(N)>]ボタンをクリックします。

ウィザードが完了したら[完了]ボタンをクリックします。

4.OpenSSLの設定ファイル編集およびサーバー証明書作成準備
環境変数のPathに以下のパスを追加します。
C:\OpenSSL;C:\OpenSSL\bin;
サーバー証明書作成用作業フォルダを作成します。
ここでは C:\OpenSSL\bin\PEM\yasu というフォルダを作成します。
OpenSSLの設定ファイルを編集します。
C:\OpenSSL\bin直下にopenssl.cfgファイルがあるので、それをC:\OpenSSL\bin\PEM\yasuにコピーします。
C:\OpenSSL\bin\PEM\yasu\openssl.cfgファイルをメモ帳などテキストエディタで開き、以下の箇所を修正します。
■修正前
[37~39行目]
dir = ./demoCA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
[43行目]
new_certs_dir = $dir/newcerts # default place for new certs.
[50~51行目]
private_key = $dir/private/cakey.pem# The private key
RANDFILE = $dir/private/.rand # private random number file
■修正後
[37~39行目]
dir = . # Where everything is kept
certs = $dir # Where the issued certs are kept
crl_dir = $dir # Where the issued crl are kept
[43行目]
new_certs_dir = $dir # default place for new certs.
[50~51行目]
private_key = $dir/cakey.pem# The private key
RANDFILE = $dir/.rand # private random number file
C:OpenSSLbinPEMyasu に中身が空っぽのテキストファイル index.txt と01と書いた serial ファイルを作成します。
■index.txt のイメージ(空っぽです)

■serial のイメージ

手順3.IISのサーバー証明書要求作成で作成したサーバー証明書要求ファイル C:certreq.txt をC:\OpenSSL\bin\PEM\yasu フォルダに移動します。
C:\OpenSSL\bin\PEM\yasu フォルダには
certreq.txt
index.txt
openssl.cfg
serial
の4つのファイルが保存されているはずです。

5.認証局の秘密鍵作成
スタートアップメニューの[ファイル名を指定して実行(R)]を選択し、cmd と入力して[OK]ボタンをクリックします。
コマンドプロンプトが起動しますので、認証局の秘密鍵を作成します。
cd OpenSSLbinPEMyasu
openssl genrsa -out .cakey.pem 1024
Loading 'screen' into random state - done
Generating RSA private key, 1024 bit long modulus
.....................................................................++++++
......................++++++
e is 65537 (0x10001)
これでC:\OpenSSL\bin\PEM\yasu フォルダにはcakey.pemというファイルが作成されましたね。
これが認証局の秘密鍵になります。

6.認証局の証明書作成
認証局の証明書を作成します。
openssl req -new -x509 -config .openssl.cfg -key .cakey.pem -out .cacert.pem
Loading 'screen' into random state - done
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:tokyo
Locality Name (eg, city) []:koutouku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:yasu corp
Organizational Unit Name (eg, section) []:system
Common Name (eg, YOUR name) []:yasu
Email Address []:
cacert.pem というファイルが作成されました。

7.認証局の証明書をDER形式バイナリエンコード(ブラウザインポート用)
手順6で作成した認証局の証明書をブラウザにインポートする為、DER形式にバイナリエンコードします。
openssl x509 -inform pem -outform der -in .cacert.pem -out ca.der
ca.der というファイルが作成されました。
手順10で使うのでそれまで大切に保管してください。

8.IISのサーバー証明書要求に署名
IISの証明書要求ウィザードで出力したファイルに署名を行い、サーバー証明書を作成します。
openssl ca -config .openssl.cfg -days 3650 -out .server_.cer -infiles .certreq.txt
Using configuration from .openssl.cfg
Loading 'screen' into random state - done
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Dec 26 08:08:00 2008 GMT
Not After : Dec 24 08:08:00 2018 GMT
Subject:
countryName = JP
stateOrProvinceName = tokyo
organizationName = yasu corp
organizationalUnitName = system
commonName = yasu
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
86:2A:62:50:DE:54:CE:CA:72:5C:8B:55:ED:DA:FE:AD:0D:74:80:21
X509v3 Authority Key Identifier:
keyid:4D:0B:4E:34:FB:81:88:5F:40:9F:18:0A:26:EA:44:9F:F6:DD:B4:F6
Certificate is to be certified until Dec 24 08:08:00 2018 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
openssl x509 -in .server_.cer -out .server.cer
以下7ファイル作成されました。
server_.cer
.rnd
01.pem
index.txt.attr
index.txt.old
serial.old
server.cer
server.cer ファイルがIISにインストールするサーバー証明書ファイルになります。

9.IISにサーバー証明書インストール
手順3同様、インターネットインフォメーションサービスの管理画面から規定のWebサイトのプロパティ画面を開き、「ディレクトリ セキュリティ」タグを選択して、[サーバー証明書]ボタンをクリックします。
サーバー証明書ウィザードが起動するので[次へ(N)>]ボタンをクリックします。

「保留中の要求を処理し、証明書をインストールする(P)」を選択して[次へ(N)>]ボタンをクリックします。

サーバー証明書ファイルを入力します。
[参照]ボタンをクリックしてC:\OpenSSL\bin\PEM\yasu\server.cer ファイルを選択し、[次へ(N)>]ボタンをクリックします。

証明書の内容を確認して[次へ(N)>]ボタンをクリックします。

ウィザードが完了したら[完了]ボタンをクリックします。

これでIISにSSLを導入する事ができました。
10.ブラウザにDER形式認証局の証明書インポート
このままだとhttpsプロトコルでページアクセスする度にセキュリティ警告

が表示されてしまうので、手順7で作成した証明書をクライアント側にインポートしてセキュリティ警告が表示されないようにします。
手順7で作成したca.der ファイルを選択して右クリックし、[証明書のインストール]を選択します。
すると証明書インポートウィザードが起動するので[次へ(N)>]ボタンをクリックします。

「証明書をすべて次のストアに配置する(P)」を選択し、[参照]ボタンから「信頼されたルート証明機関」を選択して[次へ(N)>]ボタンをクリックします。

[完了]ボタンをクリックします。

証明書をインストールしようとするとセキュリティ警告が表示されますが、[はい(Y)]ボタンをクリックします。

[OK]ボタンをクリックします。

これでhttpsプロトコルでローカル環境のWebページにアクセスしてもセキュリティ警告が表示されなくなります。
試しに規定のWebサイトのホームディレクトリ直下に適当なテストページを作り、ブラウザのアドレスに「https://yasu/test.html」のような形でアクセスしたところセキュリティ警告が表示されずにhttpsプロトコルでアクセスできるようになりました。
※最初ブラウザに証明書をインポートした後、セキュリティ警告が表示されない事を確認する為に「https://localhost/test.html」のようにFQDN(完全修飾ドメイン名)をlocalhostでやっていたのですが、何度やっても警告が表示されてしまいました。証明書のストア先を変更したりして試してもダメで途方にくれていたのですが、まさかの手順3.IISのサーバー証明書要求作成のところで入力した「一般名」にFQDN(完全修飾ドメイン名)を入力する必要がある事を知らずに全然別の適当な名前を入力していたのでアクセスしたページのFQDN(完全修飾ドメイン名)が信頼されておらずセキュリティ警告が出続けていました。
いやぁ、これで1時間近くはまったはまった・・・(汗
また今回はこちらのページに非常にお世話になりました。
IIS + OpenSSL:.knowledge - frog.raindrop.jp
WindowsXPで試しましたが、Windows2000、WindowsServer2003、WindowsVista、WindowsServer2008のIISでもサーバー証明書要求ファイルを作り、OpenSSLでサーバー証明書を作ってインストールすれば、IISのWebページにhttpsプロトコルでアクセスできると思います。
またOpenSSLは今回Windows用のものをダウンロード・インストールして使いましたが、OpenSSLはマルチプラットフォーム対応(LinuxやSolaris、Macなど)されていますので手順5〜8までは他OSのOpenSSLでも代用できると思います。
ローカル環境にセキュアなWebサーバ環境を安く構築したい時にとっても有効です。
ちょっと手順が長いですけど頑張って導入してみてください。