経験知ロゴ

【AWS】AMIMOTO(HTTP/2)でLet’s Encryptを使い無料SSL証明を取得して設定する方法

※本ページはプロモーションが含まれています

Letsencrypt

AWSで独自ドメインを設定する方法」の続きです。

Let's Encrypt」というサービスが今まで有料だったSSL証明書を無料で発行してくれるようになりました。2016年1月現在正式サービスの前段階のオープンベータなので、仕様や設定の仕方が変わるかもしれませんが、現段階での設定方法を紹介します。

※独自ドメインでサーバにアクセスできる状態でないと設定できないので、独自ドメイン設定ができていない場合は独自ドメインを設定してから行って下さい。
Apacheで設定する場合はこちらの記事がさんこうになります。
Let’s EncryptならWebサイトを無料でhttps化できてすごい | jMatsuzaki

SSHで接続

ターミナルを開き、「$」の後にSSHコマンドを入力。
キーペアで作成(AWSでAMIMOTOのインスタンスを作成する方法)したpemファイルが必要になるのでパスを調べておく。面倒臭い場合はターミナルにドラッグアンドドロップすればフルパスが入力される。

$ ssh -i 

と入力した後(iの後ろは半角のスペースがある)pemファイルをドラッグアンドドロップ。
pemファイルをドラッグ&ドロップ

このようにパスが入力される。環境によってパスは違うので注意。
パスが入力される

パスの後にスペースを開け、「ec2-user@」の後に「Elastic IP」アドレスを入力。

全体像はこのようになる。

$ ssh -i pemのパス ec2-user@☓☓☓.☓☓☓.☓☓☓.☓☓☓

Enterを押し接続開始。

「Are you sure you want to continue connecting (yes/no)? 」と聞かれたら「yes」と入力しEnter。

Warning: Permanently added '52.68.246.255' (RSA) to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0640 for '/Users/admin/Documents/AWS/amimoto.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /Users/admin/Documents/AWS/amimoto.pem
Permission denied (publickey).

エラーが出た。パーミッションが0640じゃダメとのこなので、パーミッションを変更する。

ターミナルに

$ chmod 600 

と入力し、先程のようにpemファイルをドラッグアンドドロップしパスを入力しEnter。

$ chmod 600 /path/to/pem

エラーが表示されなければパーミッションの設定完了。

再びSSHでの接続を試す。キーボードの「↑」キーを数階押せば先ほど入力したコマンドが表示されるのでその状態でEnter。

入れた

      ___         _            __
     / _ | __ _  (_)_ _  ___  / /____
    / __ |/  ' \/ /  ' \/ _ \/ __/ _ \
   /_/ |_/_/_/_/_/_/_/_/\___/\__/\___/

 https://aws.amazon.com/amazon-linux-ami/2015.09-release-notes/

 Nginx: 1.9.9, HipHop VM: 3.9.1, Percona MySQL: 5.6.27

 amimoto     http://www.amimoto-ami.com/
 digitalcube https://en.digitalcube.jp/

14 package(s) needed for security, out of 35 available
Run "sudo yum update" to apply all updates.

ログインに成功したらrootのパスワードを設定

[ec2-user@ip-☓☓☓-☓☓ ~]$ sudo passwd

新しいパスワードを入力。(入力中カーソルは動かないがちゃんと入力されている)。もいちど入力する。

ユーザー root のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

Let’s Encrypの設定

Let’s Encrypの設定は、Dockerを使ったり、Let’s Encrypが提供しているプラグインを使って設定します。

それらのほとんどは、サーバを一旦停止しないとSSL証明書の取得ができません。

Let’s Encrypは3ヶ月で証明書の期限が切れてしまうので、2・3ヶ月に一度サーバを停止させるのは面倒です。

しかし、Let’s Encrypが提供するwebrootプラグインを使えばサーバを止めることなく、cronによる自動更新できるようになります。

先程のターミナルに戻り、rootになる。

$ sudo su

ホームディレクトリ(今回の環境ではec2-user)にLet’s Encrypをgithubからインストール。

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

「letsencrypt」というフォルダが作成されるので中に入る。

# cd letsencrypt

「letsencrypt-auto」コマンドを使う。「./letsencrypt-auto –help」でインストールされていない必要なパッケージをインストールしてくれるが、Amazon Linux で行う場合は「–debug」をつけろとのことなので、「–debug」を付けて再実行。

# ./letsencrypt-auto --help --debug

いろいろインストールされるが、

Creating virtual environment...
Updating letsencrypt and virtual environment dependencies.....Command "/root/.local/share/letsencrypt/bin/python2.7 -c "import setuptools, tokenize;__file__='/tmp/pip-build-NaIG6i/cffi/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-MkV8Rh-record/install-record.txt --single-version-externally-managed --compile --install-headers /root/.local/share/letsencrypt/include/site/python2.7/cffi" failed with error code 1 in /tmp/pip-build-NaIG6i/cffi

というエラーが表示される。

pythonのバージョンを最新にすると解決する。「sudo -i」で環境変数を読み込むようにし、各アップデートを実行。その後「exit」で戻る

# sudo -i
# pip install --upgrade pip
# pip install --upgrade virtualenv
# exit

python27をインストール。

# yum install python27-virtualenv

これで再び実行するとヘルプがちゃんと表示される。

次に証明書を取得する。ルートフォルダを調べるために、nginxの設定ファイルを覗く。

# vi /etc/nginx/conf.d/default-ssl.conf

「root」に設定されているパスがルートディレクトリになる。

server {
    listen      443 default ssl http2;
    server_name _;
    root        /var/www/vhosts/i-045708da7f38287ce;
    index       index.html index.htm;
    …

「/var/www/vhosts/インスタンスID」がルートフォルダになっている。

設定ファイルを閉じるにはキーボードの「esc」を押した後に

:q

を入力し「Enter」で閉じることができる。

次に、webrootを使って証明書を取得。
「-w」の後に先程しらべたrootパスを。
「-d」の後にSSL証明書を取得したいドメインを。
「-m」の後に自分のe-mailアドレスを。(自分のドメインのアドレスでなくてもOK。僕はgmailのアドレスを登録)
最後に「–agree-tos」をつけると利用規約に同意したことになる。利用規約は「Policy and Legal Repository – Let's Encrypt – Free SSL/TLS Certificates」で。

実行するコマンドはこのようになる。

# ./letsencrypt-auto certonly --webroot -w /var/www/vhosts/インスタンスID -d example.com -m example@example.com --agree-tos

実行するとまたもやエラーが。

Failed authorization procedure. example.com (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://example.com/.well-known/acme-challenge/yT2tp1omt98AWriKT9G0EwGxHb9VQlG8aKqmKxINEmY [52.68.246.255]: 403

IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to example@example.com.
 - The following errors were reported by the server:

   Domain: example.com
   Type:   urn:acme:error:unauthorized
   Detail: Invalid response from http://example.com/.well-
   known/acme-challenge/yT2tp1omt98AWriKT9G0EwGxHb9VQlG8aKqmKxINEmY
   [52.68.246.255]: 403
 - Your account credentials have been saved in your Let's Encrypt
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Let's
   Encrypt so making regular backups of this folder is ideal.

SSL証明書を取得するのに必要な一時ファイル「http://example.com/.well-
known/acme-challenge/yT2tp1omt98AWriKT9G0EwGxHb9VQlG8aKqmKxINEmY」にアクセス出来ないとのことなので、nginxの設定を見直す。

AMIMOTOの初期設定では全てのフォルダへのアクセスが遮断されているので、「.well-known」以下のディレクトリはアクセスできるようにする。

遮断を設定しているファイルを開く

# vi /etc/nginx/drop

この中の

location ~ /\. { deny all; access_log /dev/null; log_not_found off; }

の部分が全てのアクセスを一旦遮断しているので、この上に

location ~ /.well-known { allow all; }

セキュリティ的には「allow all;」よりLet’s EncryptのIPアドレス「66.133.109.36」の方が良いのだが、IPアドレスが変わる可能性もあるので「allow all;」にした。

nginxを再起動。

# service nginx restart

再び取得すると今度は成功。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your
   cert will expire on 2016-04-14. 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

次に、SSL証明書をnginxに設定する。

sslが設定されている「default-ssl.conf」を開く。

# vi /etc/nginx/conf.d/default-ssl.conf

「ssl_certificate」と「ssl_certificate_key」を下記のように書き換える。「ドメイン名」は先ほど登録した自分のドメイン名に置き換える。

ssl_certificate     /etc/letsencrypt/live/ドメイン名/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;

nginxを再起動。

# service nginx restart

セキュリティグループの設定

AMIMOTOの独自のセキュリティグループではhttps通信に使うポートが開かれていないので、セキュリティグループにHTTPSを追加する。

EC2のダッシュボード」にアクセスし、左メニューの「セキュリティグループ」をクリック。セキュリティグループの「グループ名」が「WordPress Powered AMIMOTO…」を選択し、「インバウンド」タブをクリックし「編集」をクリック。
セキュリティグループの設定

「インバウンドルールの編集」が開くので、「ルールの追加」をクリック。新しい行が追加されるので、追加されたタイプをクリックし、「HTTPS」を選択肢保存。
インバウンドルールの編集

これでセキュリティグループの設定が完了。

httpsのURLで独自ドメインにアクセスするとAMIMOTOの設定が表示される。
AMIMOTOの設定画面

これでhttps付きの独自ドメインでアクセスすることができる。

cronで証明書を自動更新

Let’s Encryptの証明書の再取得のコマンドは取得時のコマンドと同じ。

取得コマンドを書いたシェルスクリプトを作成し、cronを設定すればイケるはず。

Let’s Encryptは1週間に5回までしか証明書を取得できず、証明書取得に手こずったので上限に達してしまったので今試せないので後日試します。

おわりに

証明書の取得と設定にメッチャハマりました。。。

Let’s Encryptはオープンベータということなので、Pythonのバージョンなども柔軟に対応してくれるとありがたいです。AWSのPythonのバージョンも見なおして欲しいかな。

次はWordPressのインストールです。
AWS+AMIMOTOでWordPressをインストールする方法 | 経験知

こちらの記事も要チェック!

役に立ったらこの記事のシェアをお願いします

ブログのフォロー・RSS購読は下記ボタンから