*

無料で使えるLet’s EncryptをGCEに設定しよう

公開日: : 投稿者: GCE

無料で使えるSSL証明書発行サービス Let’s Encrypt とは?

2015年12月3日、無料の SSL証明書発行サービスである Let’s Encrypt がパブリックベータになりました。
SSLとは、Webサイトにアクセスする時に通信を暗号化する為の技術です。同時に自分の提供しているWebサイトが本当に自分が提供しているということを証明する役割も持っています。
維持費が年間数千円から数万円程になり、スタートアップや趣味でWebサービスを運用している人にとっては高価だと思います。しかしこれから紹介する Let’s Encrypt というサービスは無料でSSL証明書を発行することができます。

さてその Let’s Encrypt がなぜ無料でサービス提供できるのでしょうか。調べていると、 Let’s Encrypt は実のところドメインで認証するタイプのSSL証明書(DV SSL証明書と呼ばれています)発行ツールに分類されます。
ご存知の通り、証明書は DV SSL証明書の他に、EV SSL証明書、OV SSL証明書があります。
これらの証明書は、そのWebサイトを運営する個人・組織の実体を確認してからでないと発行できないものです。しかし DV SSL証明書は人の手間が発生せず自動でできる為、無料で利用できます。
信用度合いは劣ってしまいますがスタートアップや趣味には最適ですね。
今回は、 Let’s Encrypt の仕組みを紹介し、実際に使ってみて GCE ( Google Compute Engine ) のインスタンスに乗せている Webページを SSL化してみたいと思います。

Let’s Encrypt の仕組み

Let’s Encrypt は Python で組まれている The Let’s Encrypt Client (以下LEクライアントという)をコマンドラインから実行して証明書を発行します。
このアプリケーションは、Git でソースを取得します。
LEクライアントは自動でSSL証明書を発行することができますが、それを実現しているのが ACMEという、SSL化したいサーバと Let’s Encrypt 認証局間をお互いやりとりして証明書の作成を自動化する為のプロトコルです。

下図は、LEクライアントを実行した時の自分のWebサーバと Let’s Encrypt 認証局とのやりとりを図示したものです。

leclientsystem

まず、LEクライアントを実行すると秘密鍵とサーバ証明書を作成します。
LEクライアントは Let’s Encrypt 認証局にサーバ証明書(CSR)を送信します。
認証局でサーバの所有者を確認する為のランダムな文字列を生成して返します。
その文字列をLEクライアントが受け取りテキストファイルに出力します。出力先は、/tmp/.well-known/acme-challenge ディレクトリの中です。
ここでWebサーバ側から認証チャレンジを行いますと、http://www.apps-gcp.jp/.well-known/acme-challenge/WZigT4P…(略)にアクセスし、文字列を照合します。
認証チャレンジで成功すれば、LEクライアントから中間証明書が生成されます。

ACMEを使い自動で発行するには、 SSL化したい WebサーバにLEクライアントをインストールする必要がありますが、リモートサーバの環境設定を変更したくないという方がいるかと思います。
その方々には、ローカル環境にて証明書を作成しリモートサーバにアップロードすること(後述しますがLEクライアントをマニュアルモードで実行する)も可能です。
今回は、その方々向けにマニュアルモードでSSL化したいと思います。
LEクライアントをマニュアルモードで実行すると、認証チャレンジ用のテキストファイルを手で作る必要があります。

Google Compute Engine インスタンスに乗せているWebページをSSL化してみる

ここではローカル環境に The Let’s Encrypt Client をインストールし、リモート環境にあるWebサーバとして本サイト(www.apps-gcp.com)をどのようにSSL化するのかをスクリーンショット付きで紹介します。
リモート環境に The Let’s Encrypt Client をインストールして、「Let’s Encrypt の仕組み」で紹介したやり方も可能ですが、リモートサーバにpythonをインストールしたくないという方向けにローカルで証明書作成、リモートに証明書をアップロードという流れで進めていきます。

ローカル環境
OSバージョン: Ubuntu 14.04 LTS
Pythonのバージョン: 2.7.6

リモート環境
OSバージョン: CentOS release 6.7 (Final)
GCEのインスタンスにapacheを入れてwebサーバを立ち上げています。

1. ローカル環境にて GIT CLONE でリポジトリを呼び出し letsencrypt に移動します。

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

2. 依存関係を解決する為以下のコマンドを打ちパッケージのインストールします。

# ./letsencrypt-auto –server \ https://acme-v01.api.letsencrypt.org/directory –help

3. 依存パッケージをインストールしたらマニュアルモード (–manual) で実行します。

$ ./letsencrypt-auto certonly –manual

4. 暫くしますと「ドメイン名を入れてください」とTUIの画面が表示されますのでSSL化したいサイトURLを入れます。
以下の例では、本サイト(www.apps-gcp.com)を入れました。カンマ又はスペースで区切り、複数指定することもできます。

lec_cli2

5. 「letsencrypt をサーバではないマシン上でマニュアルモードで動かしている場合は、OKを選択してください」とTUIの画面が表示されますので「Yes」を選択します。

lec_cli1

以下のように、「リモート環境のWebのルートディレクトリに指定された名前のテキストファイルを作成し、指定した文字列を入れて保存せよ」と表示されます。以下の例では、http://www.apps-gcp.com/.well-known/acme-challenge/NogWYZiohzgT4P..(中略)
にアクセスした時に「NogWYZiohzgT4P..(中略)..kgn5auaR_r3」という文字列が出力されるようにファイルを配置せよという意味になります。

Make sure your web server displays the following content at
http://www.apps-gcp.com/.well-known/acme-challenge/NogWYZiohzgT4P..(略) before continuing:
NogWYZiohzgT4P..(中略)..kgn5auaR_r3
If you don’t have HTTP server configured, you can run the following
command on the target server (as root):
mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge
cd /tmp/letsencrypt/public_html
printf “%s” NogWYZiohzg..(中略)..kgn5auaR_r3 > .well-known/acme-challenge/NogWYZiohz..(略)
# run only once per server:
$(command -v python2 || command -v python2.7 || command -v python2.6) -c \
“import BaseHTTPServer, SimpleHTTPServer; \
s = BaseHTTPServer.HTTPServer((”, 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \
s.serve_forever()”
Press ENTER to continue

 

6. ここでリモート環境にsshでログインし、特定のパスに、指定された文字列を書き写したファイルを作成します
(本来であれば上の 5 で書かれた通りのコマンドを実行すればファイルを作成することができますが、今回はサーバの環境設定を変更しないという前提で作業している為、pythonもインストールせずファイルを手作業で作ります)。

webのルートディレクトリに.well-known/acme-challengeディレクトリを作成します。

# mkdir -p /{webページのルートディレクトリ}/.well-known/acme-challenge
# cd /{webページのルートディレクトリ}
# printf “%s” NogWYZiohzg..(中略)..kgn5auaR_r3 > .well-known/acme-challenge/NogWYZiohz..(略)

 

7. 再びローカル環境に戻り、エンターキーを押して認証チャレンジを実行します。認証チャレンジが成功すると、以下のように「Congratulations!」と祝われます。ここで Let’s Encrypt による証明書の作成が完了となります。

Press ENTER to continue
IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/www.apps-gcp.com/fullchain.pem. Your cert
will expire on 2016-03-17. To obtain a new version of the
certificate in the future, simply run Let’s Encrypt again.
– If you like Let’s Encrypt, please consider supporting our work by:Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

ローカル環境の /etc/letsencrypt/archives/www.apps-gpc.com/ディレクトリに証明書ができているのを確認します。
以降はそれぞれの環境に応じてSSL化の設定をしてください。

8. 以降はApacheにおける例です。cert.pem、chain.pem、privkey.pem の3つのファイルをリモートサーバにアップロードします。
SSL証明書を置いておくディレクトリを作りそこに設置します。下の例では、/etc/letsencrypt/archives/www.apps-gpc.com/ディレクトリに設置しました。

# ls /etc/letsencrypt/archives/www.apps-gpc.com/
cert.pem chain.pem fullchain.pem privkey.pem

 

9. リモートサーバにある ssl設定ファイルを開き、アップロードしたPEMファイルのパスをそれぞれ書いて保存します。

# vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/letsencrypt/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/chain.pem

 

10. 続いてapacheの設定ファイルを開き、SSLの設定を有効にします。
httpsでのアクセスができるようにVirturalHostで443番ポートをリスニングするように書いて保存します。

# vim /etc/httpd/conf/httpd.conf
NameVirtualHost *:80
NameVirtualHost *:443
ServerAdmin root@www.apps-gpc.com
DocumentRoot /var/www/html
ServerName www.apps-gpc.comSSLEngine on
SSLCertificateFile /etc/letsencrypt/www.apps-gpc.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/www.apps-gpc.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/www.apps-gpc.com/chain.pemServerAdmin root@www.apps-gpc.com
DocumentRoot /var/www/html
ServerName www.apps-gpc.com

 

11. httpdの設定をリロードします。これで Let’s Encrypt による SSL化が完了です。

$ service httpd reload

実際に GoogleChromeブラウザからhttpsでアクセスすると、緑色の鍵マークがアドレスバーに表示されました。
下のスクリーンショットは、www.apps-gcp.com をSSL化した例ですが、鍵マークをクリックすると「Let’s Encrypt Authority X1」が確認しているという旨が書かれています。

ssl1

Let’s Encrypt の制限

SSL証明書は発行すると、年単位で有効期限を迎えますが、Let’s Encrypt は発行してから90日後に有効期限を迎えます。
有効期限を過ぎる前に新しく再発行しましょう。また、パブリックベータではSSL証明書の発行回数に制約があります。
1IPアドレスあたりの発行回数が3時間あたり10回まで、ドメイン名毎の発行回数が1週間につき5回までです。
制限を超えない為に間違えないようにしましょう。

まとめ

Let’s Encrypt というサービスがオープンベータとなり、我々も試してみました。
Let’s Encrypt は無料であり、ACMEを使って手軽に設定ができる DV SSL証明書発行ツールです。
銀行のような信頼性を要求されるサービスには向かいないかもしれませんが、スタートアップや趣味でWebサービスを運用している人にとって第三者が保証しているSSLが無料で使えるというのは大変嬉しいですね。

昨今、Google が SEOの評価基準の一つにページが SSLに対応しているかどうかを追加すると発表しました。
http://googlewebmastercentral-ja.blogspot.jp/2015/12/indexing-https-pages-by-default.html

この無料化の流れと SEOの評価基準の一つに加えられたことが相まって SSL化対応しているページが増えそうです。
今はまだ対応していませんが、自動で証明書を更新することができるとさらにコストカットできて嬉しいですね。
興味のある方はぜひEncryptしてみましょう。

関連記事

2016/03/30 GCE vs AWS vs Azure ベンチマーク

2016/03/30 GCE vs EC2 vs Azureベンチマーク 本シリー

記事を読む

GCE-S3のベンチマークを計測してみた

GCE(アジアリージョン)⇔S3(東京)で速度検証してみました。 やってみたのは、以下の2パターン

記事を読む

2014/11/20 GCE vs AWS ベンチマーク

さて、始まりました、待望のシリーズ! ワールドワイドなクラウドIaaS界の2大巨頭である2つの

記事を読む

2016/08/12 GCE vs AWS vs Azure ベンチマーク

2016/08/12 GCE vs EC2 vs Azureベンチマーク 本シリー

記事を読む

2015/02/25 GCE vs AWS ベンチマーク

2015/02/25 GCE vs AWS ベンチマーク 本シリーズでは定期的にGCEと

記事を読む

2016/05/09 GCE vs AWS vs Azure ベンチマーク

2016/05/09 GCE vs EC2 vs Azureベンチマーク 本シリ

記事を読む

東京リージョン内でのGAE・GCS・GCE間の通信はこのくらいだった

11月8日に Google Cloud Platform にて待ちに待った日本リージョンがリ

記事を読む

[GoogleAPI千本ノック] Google Compute Engine API を試してみた

こんにちは。GoogleのAPIを隔週で片っ端から紹介する、GoogleAPI千本ノック 第二回目

記事を読む

GCEのファイアウォールで日本のIP限定化

ファイアウォールで日本に対してのみサービスをしたくないですか? 表記の通りですがそんな声に

記事を読む

【Disk I/O比較】Google Compute Engine vs Amazon EC2

みなさんこんにちわ。 世間でIaaSといえば、もっぱらAmazon AWS EC2とういうような状

記事を読む

PAGE TOP ↑