関連記事
Let's Encryptを使ったSSL証明書の導入手順
この記事の動画版はこちら(画像クリックでYoutubeに飛びます)
今回は、Let's Encryptを使ったSSL証明書の導入手順を解説していきたいと思います。
クラウドサーバに、実際にターミナルで接続して実践していきますので、サーバー構築のスキルを学んでいきたいと考えている方は是非参考にしてみてくださいね。
なお、「SSL証明書とは何か?」「SSL化を行うメリット」といったSSLの基本的な知識については、別の記事で解説しているのでそちらも併せて学習してみてください。
概要
今回、SSL化を行うサーバーですが、AWSのEC2インスタンスに「Amazon Linux2」を立ち上げ
ApacheをインストールしてWebサーバーとしてアクセス出来るようにしています。
以下のように、VirtualHostを設定しているので「http://sample.senseshare.jp/」というURLにアクセスすると、Apacheのデフォルトページが表示されるようになっています。
VirtualHostの設定
<VirtualHost *:80> DocumentRoot "/var/www/html" ServerName "sample.senseshare.jp" </VirtualHost>
EC2インスタンスの作成方法や、VirtualHostの設定方法についてはそれぞれ別の記事で説明しているので参考にしてみてくださいね。
現在、このサーバーはSSLの設定を行っていないため、
httpでしかアクセスすることが出来ません。
このサーバーをSSL化していきましょう!
SSL化を行う手順3ステップ
①SSL証明書を取得して設置する。
②Webサーバーの設定でhttpsに対応させる。
③http⇒httpsのリダイレクト設定を行う。
これらの設定を順番に行っていきます。
Let's Encryptとは?
まずは、SSL証明書を取得します。
SSL証明書は「認証局」と呼ばれる第三者機関によって発行される電子証明書です。
「このドメインはちゃんと実在しており、管理者も定められているよ」ということを、第三者機関が確認・証明してくれるものであり、通常は、証明機関から年単位で有償で購入する形になるのですが、Let's Encryptというサービスを使うとSSL証明書を無料で取得することが出来ます。
Let's Encryptは「世界中のWebサイトのSSL化をもっと広める」というミッションのもと、様々なスポンサーの支援を受けて、SSL証明書を無料で提供してくれています。
今回は、この「Let's Encrypt」を使用してSSL証明書を取得します。
事前準備(コモンネームの確認)
SSL証明書を取得するにあたり、まずは取得対象のコモンネームを決めます。
コモンネームとは、URLのこの部分のことで、
SSL証明書は、このコモンネーム単位で取得します。
例えば「www.senseshare.jp」と「senseshare.jp」はドメインは同じでも、別のコモンネームとなりますので、SSL証明書もそれぞれ別に取得する形になります。
ちなみに、今回は使用しませんが「ワイルドカード証明書」というドメイン単位でまとめて取得する方法もあります。
SSL証明書を取得する際に、Let's Encriptによってドメインのアクセスチェックが行われますので、まずはコモンネームのURLにブラウザで正常にアクセス出来ることを確認しておきましょう。
URLに正常にアクセス出来ないと証明書の取得に失敗してしまいます。
これで、事前準備はOKです。
certbotのインストール
では、実際にSSL証明書を取得していきます。
Let's Encryptには「certbot」という、証明書の取得や更新を自動で行ってくれるBOTプログラムが用意されています。
このプログラムを使うと、先程ご紹介した「3つの手順」を全て自動で行ってくれますので、まずはこれをインストールします。
SSL化を行う手順3ステップ
①SSL証明書を取得して設置する。
②Webサーバーの設定でhttpsに対応させる。
③http⇒httpsのリダイレクト設定を行う。
サーバーにターミナルで接続し、これら4つのコマンドを順番に実行していきます。
sudo wget -r --no-parent -A 'epel-release-*.rpm' https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/
sudo rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-*.rpm
sudo yum-config-manager --enable epel*
sudo yum install -y certbot python2-certbot-apache
4つ目のコマンドを実行後、このように「Complete!」と表示されればOKです。
これで、SSL証明書を取得するための「certbot」というプログラムがインストール出来ました。
SSL証明書の取得
それでは、実際にSSL証明書を取得するため、以下のコマンドを実行していきます。
sudo certbot
Enter email addressと聞いてきますので、連絡先メールアドレスを入力してEnterを押します。
Let's Encryptのサービス利用規約が表示されるので、確認してYesの「Y」キーを入力し、Enterを押します。
運営からのお知らせメールを受け取るかどうかを聞かれますので、Yesの「Y」または、Noの「N」を入力してEnterを押します(どちらを選択してもOKです)
最後に、SSL証明書を取得するコモンネームがリストアップされますので、問題なければそのままEnterを押します。
実行後、このように「Congratulations!」と表示されればSSL証明書の取得は成功です。
ちなみに、取得したSSL証明書はこちらのフォルダに保存されています。
/etc/letsencrypt/live/コモンネーム/
これらが、取得したSSL証明書の関連ファイル群になります。
Apacheの再起動
これで、SSL証明書関連の設定が完了しましたので、こちらのコマンドを実行して、設定ファイルに間違いが無いかどうかテストします。
sudo service httpd configtest
「Syntax OK」と表示されればOKです。
こちらのコマンドでApacheを再起動します。
systemctl restart httpd
これで、SSL証明書が有効になりました。
443ポートの解放
通常のhttpでは、通信は「80番」という通信ポートを使用するのに対し、httpsの通信は「443番」という通信ポートを使用します。
サーバーの設定によっては、443ポートが閉じられていることがありますので、その場合は解放するようにしましょう。
EC2の場合は「インバウンドルール」に「HTTPS」のルールを追加すればOKです。
表示確認
URLにアクセスして画面が正常に表示されるか確認してみましょう。
このように鍵マークが付いていればSSL証明書は正常に設定されています。
鍵マークをクリックすると、証明書の情報を確認することが出来ます。
証明書の自動更新設定
なお、Let's EncryptのSSL証明書の有効期限は3ヵ月となっており、3か月毎に更新作業が必要なのですが、忘れてしまうこともあるため、更新プログラムをCRONに登録して自動で更新させる設定を行っておきましょう。
最後に、その方法をご説明します。
certbotを定期的に実行させるために、CRONを使用します。
CRONについては、こちらの記事でもご説明しているので併せて学習してみてください。
以下のコマンドでCRONの編集モードに入り
sudo crontab -e
このように設定します。
00 1,13 * * * root certbot renew --no-self-upgrade
毎日「1時0分」と「13時0分」にrootユーザー権限でcertbot renewという命令を実行します。
これにより、SSL証明書の有効期限切れが近くなっていた場合は、自動的に更新作業を行ってくれます(実行時に有効期限が切れていない場合は自動的にスキップされます)
CRONの設定を書いたら、こちらのコマンドで適用します。
sudo systemctl restart crond
以上で、SSL証明書の設定作業は全て完了です。