Amazon EC2(Linux)で構築したWebサーバ(Apache)のSSL設定

# Amazon EC2(Linux)で構築したWebサーバ(Apache)のSSL設定
最近のWebサイトは常時SSL対応が当たり前になりつつあり、HTTPのサイトはブラウザーで「安全でないサイト」と警告が出てるようになってます。企業のHPも個人のブログもHTTPSサイトでないとSEOにも影響があるらしいので、必須となりつつあるHTTPS化(SSL化)について、Amazon EC2(Linux)にApacheをインストールしてWebページを公開することを想定して、お試し構築していきます。

#環境と前提
 - Amazon EC2(Linux)にApache(ver 2.4)をインストールして、Webサーバとして利用
 - EC2はパブリックサブネットへデプロイする
 - ドメインは[Freenom](https://my.freenom.com) で独自ドメインを取得する
 - 証明書はLet's Encryptで無料SSL証明書を取得する

# 目的（ゴール）
ブラウザーでhttps://test-domain.jp でアクセスし、Webページを表示できる環境を設定する

# イメージ図
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/2dbe1eb5-4cd5-4324-45ae-4140d81a78bf.png)

　　※/var/www/html/index.htmlはApacheのDocument Root

# 手順
 1. EC2をパブリックサブネットへデプロイする
 2. EC2へSSHで接続でき、EC2へHTTPSでアクセスできるようにセキュリティグループを設定する
 3. EC2にApacheをインストールする
 4. 独自ドメインを取得する
 5. Let's EncryptでSSL証明書を取得する
 6. ApacheでSSL証明書を適用する


# 実際にやってみた
　1.と2.については各所に丁寧な解説記事がありますので割愛しますので3.より進めます。
　まずEC2へSSH接続してApacheを設定します

    #Rootにユーザ切替
    sudo su root
    #最新バージョンに更新
    yum-y update
    #Apacheのインストール
    yum -y install httpd
    #SSL化するためのオプションモジュールをインストール
    yum install -y mod_ssl
    # Apache を起動
    systemctl start httpd

　これでApacheのインストールは完了です。
　次にhttpでアクセスがあった際に表示させるDocumentRootのデフォルトページを作成します。

    #DocumentRootに移動
    cd /var/www/html
    #index.html という名前の空のファイルを作成
    touch index.hmtl
    # index.html の中身を記述
    vi index.html
    #insert mode で以下を記述し、保存して閉じる
    <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>
    
　念のためEC2インスタンスのグローバルIPアドレスでアクセスした際に設定したページが表示されるか確認しておきましょう。この時点はまだSSL通信はできないので、httpでアクセスしましょう。
    
    http://"Instance IPaddress"

下記にように表示されればOKです。
![httpアクセス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/e98d23b3-2fb5-fa86-cba1-1af24fc5939d.png)


確認後にいったんApacheは停止させておきましょう。

    #Apache の停止
    systemctl stop httpd

次にWebアクセスで利用する独自ドメインを取得します。
Freenomで.tkなどの無料ドメインを取得すること形としますが本記事のメインではないため
取得方法について割愛します。
以下詳しく解説されている記事がありますのでご参考まで
[「独自ドメイン」を無料で取得する方法について](https://www.japan-secure.com/entry/site_that_you_can_get_a_free_domain.html)
以降独自ドメインの取得は完了し、AレコードにEC2インスタンスもIPアドレスが登録できた想定で進めます。

続いて、Let'sEncryptでSSL証明書を取得していきます。

再びEC2へSSHで接続して

    #Certbotをインストール
    sudo amazon-linux-extras install epel　
     (※ yum -y install epel-release でコマンド実行すると上記で実行するよう怒られる)
    yum -y install certbot
    #Certbotがインストールできたか確認
    certbot --version
     →certbot 1.5.0　のようにVersion表示が出ればOK
    #証明書発行（DNS認証でSSL証明書を取得）
    certbot certonly --manual \
    --server https://acme-v02.api.letsencrypt.org/directory \
    --preferred-challenges dns \
    -d "独自ドメイン" \
    -m "自身のメールアドレス" \
    #Enterを押すと利用規約に同意するか？、ソースIPアドレスを記録することに同意するか？等を確認されるので、Yesで回答
　　以下画面が表示されるまで進めてください。
    ![DNS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/17ee5a5c-8271-e89e-8844-838ed0397f9c.png)

　FreenomにアクセスしてDNSネームサーバに以下のようにレコード登録をしてください。
　～ここからDNS認証の手順～
　![Freenom画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/2733d6b6-a272-004b-e952-9d78ccb9eb9b.png)
　登録する箇所は「Name = _acme-challenge」と「Target = "TXTレコード"」です。
　レコード登録後10分ほどでTXTレコードが伝播すると思います。
　伝播したかどうかは以下のサイトでも確認可能です。
　https://mxtoolbox.com/SuperTool.aspx

　レコードの伝播が確認できたら、SSH接続の画面に戻り、Enter を押してください。
　※伝播するまでにEnterを押すとエラーになり、証明書発行をやり直す必要があります。
　
　証明書発行が成功すると以下の画面が表示されます。
　![認証成功.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/28ee20e6-885e-7759-e428-cf32015f722b.png)
　～これでDNS認証の完了～
では実際に証明書が格納されているか確認してみましょう。

    #SSL証明書のディレクトリ内を確認
    ls -l /etc/letsencrypt/live/"独自ドメイン"
    # 以下のように表示されればOKです。
    total 4
    lrwxrwxrwx 1 root root  40 Jul 16 13:03 cert.pem -> ../../archive/"独自ドメイン"/cert1.pem
    lrwxrwxrwx 1 root root  41 Jul 16 13:03 chain.pem -> ../../archive/"独自ドメイン"/chain1.pem
    lrwxrwxrwx 1 root root  45 Jul 16 13:03 fullchain.pem -> ../../archive/"独自ドメイン"/fullchain1.pem
    lrwxrwxrwx 1 root root  43 Jul 16 13:03 privkey.pem -> ../../archive/"独自ドメイン"/privkey1.pem

続いて、取得したSSL証明書をApacheに適用していきます。
SSL通信の設定は「/etc/httpd/conf.d/ssl.conf」に記述されているので、ここに加筆、修正していきます。

    # /etc/httpd/conf.d/ssl.conf を編集
    vi /etc/httpd/conf.d/ssl.conf
    
    :set number で行数を表示
    100行目：SSLCertificateFile /etc/pki/tls/certs/localhost.crt をコメントアウトさせて、以下を追記
    SSLCertificateChainFile /etc/letsencrypt/live/rabbit-system.tk/fullchain.pem

    107行目：#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key をコメントアウトさせて、以下を追記
    SSLCertificateKeyFile /etc/letsencrypt/live/rabbit-system.tk/privkey.pem

編集後、/etc/httpd/conf.d/ssl.conf　は以下のようになります。
![ssl.conf１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/24fcedfa-bb3a-a233-bb77-08d108306f40.png)
![ssl.conf2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/d381564c-d6d2-c891-6a58-1e370f9160da.png)
![ssl.conf3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/2386a964-2bb9-1b2b-b17a-0c0f1df855a3.png)
150行目以降は特に変更していないので、割愛します。
編集が完了したら、保存してください。

次に/etc/httpd/conf.d/ssl.conf がきちんと設定されているか確認します。

    #設定ファイルの文法確認
    httpd -t
    ”Syntax OK”ならOK

最後にApacheを起動させて、設定は完了です。

    systemctl start httpd

ではhttpsでアクセスして、SSLサイト化できているか確認しましょう。
https://"独自ドメイン" でブラウザーでアクセスして以下画面のように表示されればOKです。
![https画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/72fcee66-1a3e-fcea-3362-ad402041f38f.png)
※画像だと「保護されていない通信」ってなってますが、上手く設定ができると、この文言は表示されないです。

# ハマったこと
証明書取得時のコマンドで、以下のようにワイルドカード証明書で取得・設定すると
たとえばサブドメインなしで[https://test-domain.tk] にアクセスした際に
証明書エラーが表示されます。

    -d *.test-domain.tk　　→https://test-domain.tk でアクセスすると証明書エラー
    -d test-domain.tk　　　→https://test-domain.tkでアクセスOK
[*.test-domain.tk]と[test-domin.tk]は別ものという扱いになるからのようです。
まぁ、test-domin.tk の証明書も取得して設定すればいいのですが。

色々なサイトに「/etc/httpd/conf/httpd.confにvirtual hostを追記する」とか、「DocumentRoot とServerNameを云々とか」書いてあり、設定をいじってしまうと設定終盤でApacheを起動させた際にエラーになってしまうことがありました。
（Apacheの古いversionを設定する際の情報？）
今回想定環境のApache 2.4系では不要ですので、/etc/httpd/conf.d/ssl.conf だけをきちんと設定してあげればOKです。

あと証明書類の設定を/etc/httpd/conf.d/ssl.confに追加する際に何故か
100行目や107行目などに追記すると反映されないことがあったので、面倒くさければ
先頭に追記して、元の行だけ「＃」で消してやりましょう。


# おわりに
SSL化がデフォルトになりつつあるご時世ですし、無料でSSL証明書が取得できるというのは中小企業及び個人事業でWebページを持ちたい方にとってはうれしい限りですね。

# 参考にしたページ
[Let’s Encryptでワイルドカード証明書を取得する](https://ssilab.co.jp/blog/tech-blog/tech-blog-child/lets-encrypt_wildcard)
[Apache2.4に無料SSL証明Let’s Encryptをインストール](https://www.novelworks.jp/blog/aws/lets-encrypt_20140614)
[Let’s Encryptを使ったSSL証明書の所得方法](https://hacknote.jp/archives/48033/)
[チュートリアル: Amazon Linux 2 に SSL/TLS を設定する](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/SSL-on-amazon-linux-2.html)
[突然Apacheが再起動できなくなった時のメモ](https://kiraba.jp/post-46oaixen/)