vol.68 常時SSL化のススメ Let's EncryptでWebサイトを暗号化

f:id:BOEL:20170623115606j:plain

モバイルを中心にインターネットに接続できる機器の飛躍的な増加により、多くの人がインターネットから情報を取得するようになりました。
利用者母数の圧倒的増加によって、ユーザーを狙った悪意ある攻撃などが激化する中、それらの攻撃からユーザーを保護するためかつ、
検索エンジンのWebサイト評価に暗号化の有無も考慮されるようになり、より信頼性の高いサイトであるというアピールをするためにも常時SSLというキーワードをみることが多くなりました。

今まではフォームなど個人情報、機密情報をやり取りするページだけに取り入れられていた暗号化通信。
かつてはフォームなど暗号化されるページは特別扱いで実装を進めていました。
現在ではむしろ暗号化が当たり前、導入していないWebサイトは脆弱性がある、とみなされるような動きに急速に変化しています。
ブラウザ上でも、暗号化されていないメールフォームなどでは「保護されていません」などと警告が出るようになり、ユーザーに警戒感を促すような形となっています。

暗号化というと、難しい・値段が高いなどといった敷居の高い印象を持つことが多いかと思います。
しかし、「Let's Encrypt」を使えば、これらをまとめて解決してくれます。
簡単かつ無料でWebサイト暗号化(SSL化)を実現することができます。
SSLのことについてと、Webサーバーで実装する方法についてを解説していきます。(Webサーバーで実装する方法は本TIPSではNginxでの実装方法となります)

SSLとは

SSLは「Secure Sockets Layer」の略称で一般的に暗号化する意味で使われる言葉です。
現在SSLという規格そのものは古くなっており、実際はTLS(Transport Layer Security)が使われていることがほとんどです。暗号化する=SSLと一般認識が広がっているためか、TLS化とはいわず、SSL化といったり表記することが多いです。

言葉の一般的認識と、実際に使われている技術名称に乖離があり少しややこしいですが、現在、暗号化規格で最も新しいものはTLS1.2となります。
技術的にSSL(SSL1.0 SSL2.0 SSL3.0)の規格は古く、脆弱性が確認されているため、基本的に現状最新の主要Webブラウザでは利用することができません。
もし古い規格で暗号化を実装するとブラウザから警告が発せられ、安全でないサイトとみなされてしまいます。

SSL化する」とは、Webサイトを閲覧するとき、サーバーとユーザー間のやり取りを暗号化することを指します。
暗号化することによって悪意あるユーザーからの改ざんから保護し、万が一データが盗聴されていても暗号化されているため解読できず、盗聴した情報を正しく読み取ることができないため、情報が守られます。

 

Let's Encryptとは

Let's EncryptはHTTPS通信(SSL/TLSプロトコルを用いた暗号化通信)を普及させるために立ち上がったプロジェクトです。
運営はInternet Security Research Group
(略称:ISRG)はアメリカの公益法人で、インターネットを介した安全な通信を行う際の障壁を減らすことを使命としています。
普及させることが目的のため、ドメインを所有している人であれば誰でも無料で利用することが可能です。また極力、更新の自動化、簡略化することを目指しているため、インストールしてからコマンドを数行実行するだけでかんたんに実装することが可能になっています。

参考サイト
https://letsencrypt.jp/about/

 

サーバーに設定する方法

Let's Encryptの導入は専有サーバー、VPSクラウドなどを利用している場合はサーバー内でセットアップして使うことができます。
共用サーバーでも一部、インストールが可能な場合があったり、無料独自SSLとしてサービス提供している場合もあります。
今回はCentOS7、Nginxの場合でセットアップを進めていきます。(Apacheでも導入可能です。)
Nginxですでに基本設定が済んでおり、httpで稼働中のサイトがある状態で導入を進めます。
※導入にあたって独自ドメインを取得していることを前提とします。

インストールにあたって、Gitを使います。
Gitをインストールしていない場合はまずGitをインストールしましょう。
最新版ではないですが、yumコマンドでインストールできるのでインストールしていない場合はこちらでインストールしましょう。


$ sudo yum install git
	

Let's Encryptをインストールします。


$ git clone https://github.com/letsencrypt/letsencrypt.git
	

インストールしたディレクトリへ移動します。


$ cd letsencrypt
	

下記コマンドで証明書の発行ができます。


$ ./letsencrypt-auto certonly --webroot --webroot-path ドキュメントルートパス -d ドメインネーム
	

ドメインのルートディレクトリがboelexample.com、ドメインネームがboelexample.comの場合


$ ./letsencrypt-auto certonly --webroot --webroot-path ~/boelexample.com -d boelexample.com
	
	

このコマンドであればWebサーバーを停止することなく実行できます。
完了するとルートディレクトリに.well-knownディレクトリが生成されます。こちらは無視してもらって構いません。
セキュリティ向上のため、Diffie-Hellmanを生成し設定します。


$ sudo openssl dhparam -out /etc/ssl/private/dhparam.pem 2048
	
	

証明書のインストールが完了したらNginxの設定を進めます。
最低限必要な設定は以下になります。


server { listen 80; server_name boelexample.com; #常にhttpsでの通信を行う場合、httpへのアクセスをリダイレクトさせる設定をする rewrite ^ https://$server_name$request_uri? permanent; } server{ listen 443 ssl; server_name boelexample.com; ssl_certificate /etc/letsencrypt/live/boelexample.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/boelexample.com/privkey.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets on; ssl_dhparam /etc/ssl/private/dhparam.pem; #プロトコルの指定(TSLのみでSSLを許可しない) ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #暗号化スイートの指定 ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; ssl_prefer_server_ciphers on; #rootディレクトリの指定(現在HTTPで設定しているルートディレクトリと変更する必要なし) root /home/user/boelexample.com; }

設定が完了したらnginxをreloadします。


$ sudo nginx -t
$ sudo systemctl reload nginx
	

Webブラウザで設定したドメインページにアクセスしてみましょう。
これで設定は完了です。

 

参考サイト
http://qiita.com/ww24/items/9fa19594b4e3a8eb9b6f
http://qiita.com/pugiemonn/items/e317a686728b018dca5a
https://gist.github.com/koudaiii/735ef14b83ee31ac0967

 

SSL化の注意点

環境のSSL化をすませて、いざWebサイトを表示すると、警告が発せられる場合があります。
この場合、ブラウザの警告だけでなくWebサイトが正しく表示されない状態になります。
Webサイト上でファイルの読み込み、特にCDN等の外部ファイルの読み込みで適切な設定がされていない場合があります。
良くあるミスのポイントをまとめました。

JSやCSSの読み込み部分でhttp://から始まる絶対パスでファイル取得を指定している
→サーバー内部から読み込んでいるファイルは相対パス、もしくはhttps://から始まる絶対パスに変更しましょう。

画像のsrc属性の記述がhttp://から始まる絶対パスでファイル取得を指定している
→JS、CSSと同様でファイルは相対パス、もしくはhttps://から始まる絶対パスに変更しましょう。

CSS内のパスがhttp://から始まる絶対パスでファイル取得を指定している
→見落としがちなのですが、CSS内でWebフォント、background-imageのなどを絶対パスで読み込んでいる場合、同様の警告が出ます。相対パスhttps://で始まるパスに変えましょう。

 

証明書の認証レベル

証明書には認証の種類があります。DV、OV、EVの3種類です。
自身の運営しているサイトをSSL化したい、という目的であればDV(ドメイン認証)で問題ないです。
OVやEVは通信の暗号化と同時にそれを運営している組織(企業)の実在性の証明が伴います。
あくまでユーザーに対してそのWebサイトが信頼に足るものか、という信頼性の部分であり、それぞれの暗号強度の差を示すものではありません。
DVの暗号強度が弱い、EVは暗号強度が強いといった解釈にはならないため注意が必要です。
認証局によってはこれらのレベルで暗号強度を分けている場合もあります。

 

DV(Domain Validation)

ドメイン認証です。ドメインを所有していれば誰でも発行できる証明書で、Let's Encryptもこちらにあたります。
簡単・無料もしくは低価格で発行できるものです。
ドメインを持っていれば誰でも取得できてしまうため、企業の実在性などは証明できず、暗号化通信は実現できますがWebサイトの信頼性に関して確かな証明することはできません。
(このドメインは信頼できる、という証明にはなりますがそのドメインを運用している人・団体・組織の実体は証明されないため、なりすましなどのリスクがあります)

 

OV(Organization Validation)

企業認証です。企業の実在性を電話で確認し、存在を証明するものです。
こちらは企業の実在性がインターネット以外の手段で確認されるため、この認証を取得することでユーザに企業サイトが本物であることの証明ができます。
電話で担当者への認証が行われるため、詐欺目的のフィッシングサイト運営者が仮に申請しても証明書を発行することができません。
また、こちらは個人で発行することはできません。

 

EV(Extended Validation)

企業認証OVをさらに厳格に行うものです。共通の統一基準のもと厳しく審査され、その企業が偽物でないことをより高い信頼性で示すことができます。
EV認証を取得すると、ブラウザのアドレスバーに企業名が表示されます。

 

参考サイト
http://knowledge.sakura.ad.jp/beginner/2988/

 

まとめ

Let's EncryptとSSLを解説していきました。
現在ブラウザによってはSSLでないページは安全ではないとみなす評価に変わってきており、将来的にはWebサイトはは全て暗号化で構築すべき、ということになっていくのではないでしょうか。
今までは導入に手間やお金・技術面などの課題が残り、さまざまな方向でどうしても敷居の高い印象がありましたがLet's Encryptはそれらの課題をクリアし、導入に対してかなり敷居を下げたように思います。
以前よりずっと気軽に導入できるようになったSSLを是非この機会に導入してみてはいかがでしょうか。