こんにちは。
熊本事務所のSです。

先日、社内イントラネットに立てているIISサーバに対して、SSL証明書を設定する機会がありました。
今回は、そのSSL証明書の作成からIISサーバへ設定するまでの手順を紹介します。

SSL証明書を発行できる認証局はいくつかありますが、今回はLet’s Encryptを選択しました。
Let’s Encryptの主な特徴は以下の通りです。
・無料で証明書を発行できる。
・HTTPによるドメイン認証に対応している。
・DNSによるドメイン認証に対応している。

今回SSL証明書は、外部に公開しない社内用サーバに適用する必要がありました。
このため、認証局からのドメイン所有確認でHTTPによる認証方法では、
認証局から社内用サーバにはアクセスできないため認証に失敗します。
DNSについてはAmazon Route 53に設定済みだったため、DNSによる認証方法を選択することで、
今回のケースでも証明書を作成することができました。

今回の証明書の作成には、ブラウザ上で発行手続きが完結する「SSLなう!」(https://sslnow.ml/)
という無料のオンラインサービスを使用しました。

「SSLなう!」はサブドメインにも対応するために必要な、ワイルドカード証明書の取得にも対応しています。

以降は、この「SSLなう!」を使用した証明書の作成から、IISサーバの設定手順までを説明していきます。
※ セキュリティ面等を考慮してスクリーンショット内の実際のアドレスやトークン等の箇所には、ぼかし加工を掛けています。


【1】SSL証明書の作成

  1. Let’s Encrypt へ登録します。
    「SSLなう!」上でLet’s Encryptへ登録します。
    次回も同一の端末で「SSLなう!」を利用する場合は、ブラウザに保存された署名鍵が自動で
    読み込まれるため、再登録は不要です。
    ※署名鍵はブラウザのローカルストレージに保存されるようになっているため、使用するブラウザや  
    端末を変えた場合は改めて登録が必要です。
  1. 次に証明書発行を希望するドメイン名を入力し、[トークンを取得]ボタンを押すと、トークンの取得に
    成功します。
ドメイン名を入力
トークン取得成功
  1. チャレンジトークンの取得が完了したら、ドメイン名の所有確認のステップで「dns-01」を選択します。
    ここに表示されたTXTレコード欄の内容を次のDNS設定で使用します。
  1. 今回ドメインのDNSサーバーにはAmazon Route 53を使用していますので、次の設定をします。
    FQDN欄に記載の名前のレコードセットをRoute 53に作成し、タイプに[TXT – テキスト]を選択、
    「SSLなう!」のTXTレコード欄に記載の内容をコピーして、レコードセットを保存します。
  1. 今回設定したレコードセットのTTL値は300となっていました。
    このため、DNSに反映されるまでは最長で5分かかりますので、念のため5分間待ちます。
  2. その後、「SSLなう!」のドメイン名の所有確認で[確認]ボタンを押し、確認が成功するまで待ちます。
    何度か自動で再試行された後、確認に成功します。
  1. ドメインの所有確認成功後、新規に証明書を発行する場合はSSL秘密鍵を生成し、内容をコピーして
    ファイル名”privkey.pem”で保存します。
    ※今回は、既にサーバーに設定済みの証明書の更新作業のため、前回取得時にバックアップ済みの
    SSL秘密鍵の内容をペーストしました。
  1. [証明書発行申請]ボタンを押すと証明書の発行に成功します。
  1. 証明書の発行に成功したら、発行されたそれぞれの証明書の内容をコピーして保存します。

ここまでの手順で、証明書の作成が完了しました。
続いて、IISサーバへの設定手順を説明していきます。


【2】IISサーバの設定

今回、SSL証明書を設定したWebサーバーは、Windows Server 2012 R2に付属している
Version 8.5のIIS(Internet Information Services)です。
※以降に掲載している画面は、IISのバージョンによっては表示などが異なる場合があります。

IISが対応している証明書ファイルは、秘密鍵と公開鍵(証明書)をまとめたPKCS#12(pfx)形式の
ファイルのみです。
このため、IISにSSL証明書をイントールするためには、PEM形式の秘密鍵と証明書を合わせて、
.pfxファイルに変換する必要があります。

  1. OpenSSLコマンドを使用して秘密鍵とサーバ証明書を合成し、PKCS#12(pfx)形式の
    SSL証明書ファイルを作成します。
    OpenSSLのエクスポートコマンド実行時は、証明書をサーバーにインポートする際に必要となるパスワードの入力を促されるため、ここで入力したパスワードは忘れないように控えておきます。
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out server.pfx
Enter Export Password:
Verifying - Enter Export Password:

※OpenSSLコマンドはWindowsには標準では入っていません。
 予めWin32/Win64 OpenSSLのダウンロードサイトから取得、インストールしておきます。
 https://slproweb.com/products/Win32OpenSSL.html
 URLがWin32となっていますが、同ページ内で64-bit環境向けのインストーラーもダウンロードできます。

  1. 証明書を設定するWebサーバのIISマネージャのサーバー証明書画面でインポートを選択します。
  2. 証明書のインポート画面で、証明書ストアに[Webホスティング]を選択し、
    作成したserver.pfx証明書ファイルを選択、証明書エクスポート時に設定したパスワードを入力して
    インポートします。
証明書のインポート画面
  1. IISマネージャで、[https]のサイト バインドの編集画面を開きます。
  2. SSL証明書に先ほどインポートした証明書を選択します。
サイト バインドの編集画面
  1. 最後にIISを再起動して、設定完了です。

【3】クライアントの設定

Webサーバーに設定したSSL証明書が正しく機能しているか確認するためには、
証明書に登録されているドメイン名でWebサーバにアクセスする必要があります。

社内ネットワークにはDNSは設置していないため、証明書のURLにアクセスするために
各端末でhostsファイルに証明書のドメインサフィックスを登録してもらいました。
※hostsファイルを編集する際にはアプリを管理者権限で実行する必要があります。

クライアント端末から、証明書に登録されているドメイン名を含むURLでアクセスすることで、
ブラウザの警告等は表示されず、正常にhttpsで接続できました。


【4】まとめ

今回はWebサービスを利用したこともあって、
比較的簡単に無料でSSL証明書を作成して、問題なく利用することが出来ました。

ただし、Let’s Encryptの証明書は定期的な更新を前提としているため、
有効期限が発行日から90日となっている点に注意が必要です。

このため、Let’s Encryptで証明書を作成する場合は、定期的に手動で証明書を更新するか、
証明書更新の自動化を検討する必要があります。

今回、自動化までは行いませんでしたが、機会があれば証明書更新の自動化もやってみたいと思います。