IT業界ではセキュリティに対する意識が年々高まっています。
ショッピングサイトをはじめとした多くのWebサービスは誕生日やクレジットカード情報のやりとりが発生しますし、個人ブログではグーグルアドセンスやAmazonアソシエイトなどの広告ツールが当たり前のように使われている状況です。
上記のような広告配信ツールは、ユーザーの興味に応じた商品やサービスの広告を表示するため、Cookieや検索履歴、閲覧履歴など、サイトへのアクセスに関する情報を取得します。
通信が暗号化されていないと盗聴やなりすまし、データ改ざんのリスクがあり、ユーザーは安心してWebサービスを利用することができなくなってしまいます。
そのような背景から、サービスを提供する側は、ユーザーが安全にWebサイトへアクセスできるよう配慮する必要があります。
そこで今回は、Certbotを使ってSSL証明書を発行し、HTTP通信を暗号化します。
独自ドメインとDNSの設定が必要となりますので、↓こちらの記事で事前に設定を済ませましょう。
AWS Route 53を使って独自ドメインのWebページを表示させてみよう
HTTP通信を暗号化するには次のファイルが必要となります。
SSL証明書はサーバについての情報と、サーバの公開鍵、証明書を発行した認証局の情報が署名されているファイルです。
サーバの公開鍵はクライアントとの通信を「暗号化」する際に使用し、署名は「なりすまし」を防ぐために使います。
署名は、証明書を発行するCAと呼ばれる第三者機関が、CSRの情報を元に行います。
中間CA証明書は、SSL証明書を発行する認証局またはその配下にある別の認証局によって署名されたファイルです。必須ではありませんが、セキュリティレベルの向上を理由に、中間CAを1つい上用いる階層構造とる認証が現在は主流となっています。
SSL証明書の発行には、次のような手順が踏まれます。
この間にドメイン所有者の実在性の確認などが行われ、ランクの高い証明書の場合は発行までに10日間ほどかかる場合もあります。
これらの作業を手で行うのは非常に大変ですが、ランクの低い証明書であれば、Certbotを使って自動化が可能です。
Certbotは無料かつ自動でSSL証明書を発行できるツールです。
CSRとKEYファイルの作成からWebサーバーの設定まで自動で行ってくれます。
さらにCronと組み合わせることで、証明書の更新作業までも完全に自動化することが可能です。
証明書の署名と発行はLet’s Encryptと呼ばれる認証局によって行われます。
AWSにも AWS Certificate Manager と呼ばれる証明書管理サービスが存在しますが、 ELB または Cloud Front の使用が前提となっています。
ELB などは個人用途で利用するには料金的に少しハードルが高いため、このアカデミーコンテンツではCertbotを選択しました。
それではCertbotを使って証明書を発行しましょう。
EC2インスタンスへSSHし、Dockerコンテナにログイン後、yumコマンドでインストールします。
1 |
yum -y install certbot |
インストール後、次のコマンドで証明書を発行します。
1 |
certbot --apache certonly |
Apacheの設定が自動で検出され下記のようにドメインがリストアップされるので、対象のものを選択します。
発行された証明書は /etc/letsencrypt/live/ ディレクトリの配下に置かれます。
発行したSSL証明書を設定します。
conf.d配下にconfファイルを新規作成し、
1 |
vi /etc/httpd/conf.d/vhost-ssl.conf |
次の内容を追加してください。
1 2 3 4 5 6 7 |
<br />DocumentRoot "/var/www/html/" ServerName YOUR_DOMAIN_NAME SSLEngine on SSLCertificateFile /etc/letsencrypt/live/YOUR_DOMAIN_NAME/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/YOUR_DOMAIN_NAME/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateChainFile /etc/letsencrypt/live/YOUR_DOMAIN_NAME/chain.pem |
ブラウザで対象のURLヘアクセスすると、HTTPS化されたことが確認できます。
Webサイトに当てられている証明書の情報をより詳しく調べたい時が、私たちにはあります。
そのような時、Google Chromeであれば次のように情報を確認することができます。
もちろんコマンドラインから確認することもできます。
コマンドラインから確認するにはOpensslコマンドを使います。
下記はAvintonのホームページを対象にopensslコマンドを実行しています。
1 |
openssl s_client -connect www.avinton.com:443 -showcerts |
SSL暗号化通信ができるようになりました。しかし今の設定では、暗号化されていないhttpのURLもネット上に存在していることになります。
httpとhttps両方のURLが存在していると、Wユーザーはどちらが正規のURLなのか混乱してしまいますし、アクセス解析が困難になります。また、Webサイトへのアクセスが2分化するため、SEOにも悪影響が出るでしょう。
http://~の設定を削除しても良いですが、その場合はhttpのURLをお気に入りに登録してくれたユーザーを置き去りにすることになります。
そこで、httpのURLからhttpsのURLへリダイレクトする設定を追加します。
ポート80番で設定したVirtualHostに下記を追記します。
1 2 |
RewriteEngine On RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L] |
RewriteEngine On … リダイレクト機能のON
RewirteRule A B [Option] … AからBへリダイレクトさせるための記述
ここで設定しているRewriteRuleは301リダイレクトと呼ばれ、リダイレクト元のURLが存在しないことを示します。
この設定により、 http://~ へアクセスすると、 https://~ へリダイレクトされます。
Certbotを用いたSSL証明書の発行とVirtualHostの設定、そしてリダイレクトの設定についてまとめました。
Webサービスを公開する時は、ユーザーが安全にWebサービスを利用できるよう通信を暗号化しましょう。
社員の成長を導きながら、AIやビッグデータなどの最先端技術をプロジェクトに活用していくことが私たちのビジョンです。Avintonの充実した技術研修でスキルアップを図り、あなたのキャリア目標を一緒に達成しませんか?