Amazon EC2(Windows OS)で構築したWebサーバ(IIS)のSSL設定

以前にAmazon EC2(CentOS)でSSLサイトをApacheを使って構築する記事を書きましたが、Windows(IIS)版の記事を書いてなかったので、お試しがてら記事にします。GUIで操作できる分、コマンド操作に慣れていない方はこっちの方がしっくりくるかもです。

# 前提条件

- 利用するEC2 AMI はWindows Server2019とします。
- SSL証明書はwin-acme(旧Let'sEncrypt)で無料のものを発行します。
- 利用するドメインはFreenomなどで取得済みとします。
- VPCのセキュリティグループおよびEC2側のFWでHTTPおよびHTTPS通信を許可します。

# 今回のゴール
https://xxxx.xxx でアクセスしてWebサイトが表示されること。

# 構築手順
① EC2（WinsowsOS）をパブリックサブネットにデプロイする
② EC2にログインして、IISをインストールする
③ FreenomにEC2のグローバルIPをAレコードで登録する
④ IISでHTTP（ポート80通信）を設定する
⑤ Let's Encrypt でSSL証明書を発行し、HTTPS（ポート443通信）を設定する
⑥ Webアクセス時に表示させるHTMLファイルを作成する
⑦ ブラウザーからhttps://xxx.xxx でアクセス試験

# 実際にやってみた
①については割愛します。②から初めていきます。EC2にRDPしてサーバマネージャから「役割と機能の追加」からIISをインストールしていきます。
基本的にはWebサーバ（IIS）の役割追加を選択したら、あとはデフォルトのままの「次へ」を押していくだけです。
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/1150f1e6-29bc-7ebb-dffb-f6d2c7bda515.png)

![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/65f25bb5-59cb-3075-4293-2ee6e3eefb81.png)
対象サーバ（操作しているサーバ)を選択して、「サーバの役割」でWebサーバ（IIS）にチェックを入れてください。あとはインストールまで「次へ」を押していくだけです。
![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/5df43431-20c4-d0c4-36ed-3f8ebb3b2b7e.png)
![スライド4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/0d5c6f2e-df7c-dad2-a532-1b49230d83ff.png)
![スライド5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/46e0d567-4c12-91a6-0bfc-4728d7a12ca6.png)
10分程度でインストールが完了します。IISはインストールしてもサーバを再起動する必要はないです。
インストール完了後、IISの設定は「サーバマネージャ」-「ツール」-「IISマネージャ」からできます。
![スライド6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/41fd0bb3-7105-35f7-f8cf-e5d6087b8a71.png)

次に③のFreenomにEC2へのグローバルIPのAレコードの登録をやっていきます。[Freenom](https://my.freenom.com/)にログインして、「Manage Freenom DNS」をクリックし、以下のようにDNSにAレコードを登録します。

![スライド7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/aa0dc3b2-1235-48e6-517f-ae7144ad5e77.png)

しばらくするとDNSレコードが伝播していき、http://"取得したドメイン" でアクセスするとEC2にルーティングされるようになります。
レコードが伝播しているかはコマンドプロンプトでnslookupコマンドで確認できます。

    nslookup "取得したドメイン"

    名前:   "取得したドメイン"
    Address:   EC2のグローバルIP

上記のように表示されればOKです。

次に④のIISの設定をしていきます。EC2にhttpアクセス（ポート80宛通信）があったときにWebサイトを表示させる（Webサイトをバインド）ようにします。
IISマネージャにアクセスして、「Default Web Site」で右クリックし、「バインドの編集」を選択します。サイトバインド編集画面で「追加」を選択し、ホスト名のところに取得したドメインを記載します。その他のIPアドレス、ポート番号は編集しなくてもOKです。あとはAWS セキュリティグループでHTTPアクセスが許可されていれば、http://"取得したドメイン" でアクセス出来るようになっています。
エラーになる場合はIISを再起動させましょう。


![スライド8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/7a50f49a-f316-7d8e-3e5c-61be2ada00e3.png)

続いて本記事のメインである⑤のSSLサイト化（SSL証明書発行および証明書の適用）を行います。
まずSSL証明書を発行するwin-acme(旧Let's Encrypt）をインストールするために、Windows Server のインターネットセキュリティ設定を変更します。
※デフォルト設定のままだとexeファイルやデータのDLができない仕様のため

サーバマネージャの「IE セキュリティ強化構成」が有効になっているので、これをAdministratorグループはオフにします。これでexeファイルなどのDLができるようになります。
![スライド9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/7f23b6a9-30ee-0c4e-34e6-5dfd7dc0563d.png)

続いてhttps://www.win-acme.com/ からツール一式をDLします。
![スライド10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/9821cf3c-d7b8-10e4-7c61-8758f46af411.png)

DLして、解凍すると中に「wacs」という名前のファイルがあるので、管理者権限で実行します。
実行するとコマンドプロンプトの画面になります。
表示される内容に従い、以下のように入力していきます。



     A simple Windows ACMEv2 client (WACS)
     Software version 2.1.17.1065 (release, pluggable, standalone, 64-bit)
     Connecting to https://acme-v02.api.letsencrypt.org/...
     Scheduled task not configured yet
     Please report issues at https://github.com/win-acme/win-acme

     N: Create certificate (default settings)
     M: Create certificate (full options)
     R: Run renewals (0 currently due)
     A: Manage renewals (0 total)
     O: More options...
     Q: Quit

     Please choose from the menu: n

     Running in mode: Interactive, Simple

      Please select which website(s) should be scanned for host names. You may
      input one or more site identifiers (comma-separated) to filter by those
      sites, or alternatively leave the input empty to scan *all* websites.

     1: Default Web Site (1 binding)

     Site identifier(s) or <Enter> to choose all: 1

     1: "④でWebサイトバインドしたドメイン" (Site 1)

      Listed above are the bindings found on the selected site(s). By default all
      of them will be included, but you may either pick specific ones by typing the
      host names or identifiers (comma-separated) or filter them using one of the
      options from the menu.

     P: Pick bindings based on a search pattern
     A: Pick *all* bindings

     Binding identifiers(s) or menu option: a

     1: "④でWebサイトバインドしたドメイン" (Site 1)

     Continue with this selection? (y*/n) - yes

     Target generated using plugin IIS: "④でWebサイトバインドしたドメイン"

     ["④でWebサイトバインドしたドメイン"] Authorizing...
     ["④でWebサイトバインドしたドメイン"] Authorizing using http-01 validation (SelfHosting)
     ["④でWebサイトバインドしたドメイン"] Authorization result: valid
     Requesting certificate [IIS] Default Web Site, (any host)
     Store with CertificateStore...
     Installing certificate in the certificate store
     Adding certificate [IIS] Default Web Site, (any host) @ 2021/5/11 23:34:24 to store 
    WebHosting
     Installing with IIS...
     Adding new https binding *:443:"④でWebサイトバインドしたドメイン"
     Committing 1 https binding changes to IIS
     Adding Task Scheduler entry with the following settings
     - Name win-acme renew (acme-v02.api.letsencrypt.org)
     - Path C:\Users\Administrator\Documents\win-acme.v2.1.17.1065.x64.pluggable
     - Command wacs.exe --renew --baseuri "https://acme-v02.api.letsencrypt.org/"
     - Start at 09:00:00
     - Random delay 02:00:00
     - Time limit 02:00:00
     Adding renewal for [IIS] Default Web Site, (any host)
     Next renewal scheduled at 2021/7/5 23:34:16
     Certificate [IIS] Default Web Site, (any host) created
これで⑤のSSL証明書を発行し、HTTPS（ポート443通信）の設定が完了です。
上記完了後に再度サイトバインドの設定画面を見ると以下のようにhttpsが自動的にバインドされています。
![スライド11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/28e916a4-8d22-e771-0420-e3a923669149.png)

あとは⑥のhttpsアクセスがあったときに表示させるWebサイト（htmlファイル）を作成して、ウェブルートのフォルダに格納しておきましょう。

htmlファイルの内容は下記参照してください。

    <html lang="ja">
    <head>
     <meta charset="utf-8">
     <title>test-page</title>
    </head>
       <body>
        <h1>Hellow  world!
        <br>This is Test!<?br>
        </h1>
      </body>
    </html>

ウェブルートのフォルダはデフォルトでは「C:\inetpub\wwwroot」なので、ここに上記のhtmlファイルをいれておきます。
![スライド12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/faeefb41-6b68-81f0-6c14-9ea3e8acf05b.png)

https://"取得したドメイン"/index.html でアクセスすると以下のようにSSL化してWebサイトが表示されます。
![スライド13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/06fd2404-de5a-8e87-3f06-420dbf65e8af.png)
　※今回はxxx.tk というドメインで取得しています

# おまけ
ついでに以下も設定してみました。
① Basic認証
　どういう機能かというとWebページを閲覧するのにIDとPWを入力して、ユーザ認証をする機能です。　
　htmlファイルを格納しているフォルダのアクセス権を付与されているユーザのID/PWで認証します。
　![スライド16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/269275a6-c9eb-515f-86ad-936b65fb7d9f.png)
　設定方法はIISをインストールした「サーバの役割と機能の追加」でWebサーバの役割の中から基本認証をインストールし、
![スライド14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/a736b4a4-3712-66df-37cd-1205c2d13762.png)
　IISマネージャの「認証」を選択し、匿名認証を「無効」にして、基本認証を「有効」にすればOKです。
![スライド15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/7753aa6e-6b1e-70c0-0015-412eb060c5aa.png)



② HTTPリダイレクト
　どういう機能かというとhttpでアクセスした場合に別サイトへリダイレクトする機能です。リダイレクトするサイトはサイトバインドされていないものでもＯＫですが一般的な使い方としてはhttp://abcd-xxx.com にアクセスしてきたら https://abcd-xxx.com/index.hmtl にリダイレクトさせるという方法かなと思います。

設定方法はIISをインストールした「サーバの役割と機能の追加」でWebサーバの役割の中からHTTPリダイレクトをインストールし、
![スライド17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/920fdb5d-37b3-cd40-9dbf-962fc2355bae.png)
以下のようにリダイレクト先を記述する形になります。
![スライド18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/d083657f-4f7c-da68-eb86-32d002e5651e.png)

# おわりに
ApacheでSSLサイトを作るよりWindows(IIS)の方が作業自体は簡単な気がします。
またLinuxでは自身でCron設定しないといけなかったSSL証明書の更新ですがWindows(IIS)ではwin-acmeが自動的にタスクスケジューラに登録して更新してくれるみたいです。
ちょっとしたHP運用や試験環境を作るときに簡単にSSL化サイトが作れます。ありがたやぁ～ありがたやぁ～...d('ω')

# 参考にしたWebページ
https://www.ipentec.com/document/software-iis-ssl-certificate-using-win-acme
https://www.ipentec.com/document/software-iis-ssl-certificate-using-lets-encrypt
https://extan.jp/?p=2076
https://webbibouroku.com/Blog/Article/iis-basic