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 で独自ドメインを取得する
- 証明書はLet's Encryptで無料SSL証明書を取得する
目的(ゴール)
ブラウザーでhttps://test-domain.jp でアクセスし、Webページを表示できる環境を設定する
イメージ図
※/var/www/html/index.htmlはApacheのDocument Root
手順
- EC2をパブリックサブネットへデプロイする
- EC2へSSHで接続でき、EC2へHTTPSでアクセスできるようにセキュリティグループを設定する
- EC2にApacheをインストールする
- 独自ドメインを取得する
- Let's EncryptでSSL証明書を取得する
- 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"
確認後にいったんApacheは停止させておきましょう。
#Apache の停止
systemctl stop httpd
次にWebアクセスで利用する独自ドメインを取得します。
Freenomで.tkなどの無料ドメインを取得すること形としますが本記事のメインではないため
取得方法について割愛します。
以下詳しく解説されている記事がありますのでご参考まで
「独自ドメイン」を無料で取得する方法について
以降独自ドメインの取得は完了し、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で回答
FreenomにアクセスしてDNSネームサーバに以下のようにレコード登録をしてください。
~ここからDNS認証の手順~
登録する箇所は「Name = _acme-challenge」と「Target = "TXTレコード"」です。
レコード登録後10分ほどでTXTレコードが伝播すると思います。
伝播したかどうかは以下のサイトでも確認可能です。
https://mxtoolbox.com/SuperTool.aspx
レコードの伝播が確認できたら、SSH接続の画面に戻り、Enter を押してください。
※伝播するまでにEnterを押すとエラーになり、証明書発行をやり直す必要があります。
証明書発行が成功すると以下の画面が表示されます。
~これで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 は以下のようになります。
150行目以降は特に変更していないので、割愛します。
編集が完了したら、保存してください。
次に/etc/httpd/conf.d/ssl.conf がきちんと設定されているか確認します。
#設定ファイルの文法確認
httpd -t
”Syntax OK”ならOK
最後にApacheを起動させて、設定は完了です。
systemctl start httpd
ではhttpsでアクセスして、SSLサイト化できているか確認しましょう。
https://"独自ドメイン" でブラウザーでアクセスして以下画面のように表示されればOKです。
※画像だと「保護されていない通信」ってなってますが、上手く設定ができると、この文言は表示されないです。
ハマったこと
証明書取得時のコマンドで、以下のようにワイルドカード証明書で取得・設定すると
たとえばサブドメインなしで[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でワイルドカード証明書を取得する
Apache2.4に無料SSL証明Let’s Encryptをインストール
Let’s Encryptを使ったSSL証明書の所得方法
チュートリアル: Amazon Linux 2 に SSL/TLS を設定する
突然Apacheが再起動できなくなった時のメモ