Syntax Error.

[Sy] Amazon Linux にて Let's Encrypt の SSL/TLS証明書を取得して Nginx と Apache でHTTPSの設定をする手順

2016/09/18

2016年4月からいよいよ正式サービスとなった無料でSSL/TLS証明書を取得できる Let’s Encrypt を使って、 Amazon Linux (EC2インスタンス)で証明書を取得して NginxApache で設定するまでの手順をまとめました。

基本的なことはこちらのサイトに詳しく書かれているので、よーく読んでおきましょう!

⇒ Let's Encrypt の使い方 - Let's Encrypt 総合ポータル

環境

  • サーバ:AWS EC2インスタンス (t2.nano)
  • OS:Amazon Linux (AMI release 2016.03)
⇒ [Sy] Amazon Linux のバージョンを確認する方法 | Syntax Error.

1. git のインストール

git が必要になる ので、インストールされていない場合はまず入れておきましょう。

$ sudo yum install -y git

2. クライアントソフトウェア「Certbot」の取得

証明書の取得は、 GitHub 上に公開されている Certbot というソフトを使って行う ので、 Certbot を git clone で落としてきます。

(適当にディレクトリ作って移動)
$ mkdir ~/lets-encrypt
$ cd ~/lets-encrypt

(Certbotを落としてくる)
$ git clone https://github.com/certbot/certbot
Cloning into 'certbot'...
・
・
Checking connectivity... done.

(確認)
$ ls
certbot

certbotというディレクトリが作成されました。

(ここではとりあえずホームディレクトリにlets-encryptというディレクトリを作成して、そこに落としてくるようにしています。別にどこでも良いのでお好みの場所でどうぞ!)

3. 環境チェック用コマンド「certbot-auto」を実行(※ポータルの説明と異なる動きをするので要チェック)

certbotディレクトリの下に、 certbot-autoというシェルスクリプトがあるので、それを実行します。

$ cd certbot/
$ ./certbot-auto

certbot-autoを実行することで、この後必要になる環境が整っているかチェックしてくれて、 足りないパッケージをインストールしたりバージョンが低い場合はアップデートしてくれたりしてくれます。

・・・はずですが、 Amazon Linux の場合は(2016月09現在)以下のような警告メッセージが表示され、実行してくれません。

WARNING: Amazon Linux support is very experimental at present…
if you would like to work on improving it, please ensure you have backups
and then run this script again with the –debug flag!

> Amazon Linux のサポートは実験段階です。それでも実行したい場合は、バックアップしておいてください。そして、「–debug」を付けて再度実行してみてください。

コワいこと言います。当然、この記事では実行するに決まってますが、もし危険を感じた場合はちゃんと言うことにしたがってバックアップとるなり、OSをCentOS等に切り替えるなどしてください。

ちなみにぼくは3つくらい以下の手順で証明書を取得して使ってますが、特に問題は起きてません。 (が、あくまでも自己責任でお願いします!)

さて、ということで--debugを付けて再実行してみます。

$ ./certbot-auto --debug
Bootstrapping dependencies via Amazon Linux...
yum は /usr/bin/yum です
読み込んだプラグイン:priorities, update-motd, upgrade-helper
amzn-main/latest                                                                               | 2.1 kB     00:00
amzn-updates/latest                                                                            | 2.3 kB     00:00
パッケージ 1:openssl-1.0.1k-15.93.amzn1.x86_64 はインストール済みか最新バージョンです
パッケージ ca-certificates-2015.2.6-65.0.1.15.amzn1.noarch はインストール済みか最新バージョンです
パッケージ python27-2.7.10-4.122.amzn1.x86_64 はインストール済みか最新バージョンです
パッケージ python27-devel-2.7.10-4.122.amzn1.x86_64 はインストール済みか最新バージョンです
パッケージ python27-virtualenv-12.0.7-1.12.amzn1.noarch はインストール済みか最新バージョンです
パッケージ python27-pip-6.1.1-1.21.amzn1.noarch はインストール済みか最新バージョンです
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ augeas-libs.x86_64 0:1.0.0-5.7.amzn1 を インストール
・
・
・
インストール:
  augeas-libs.x86_64 0:1.0.0-5.7.amzn1                       dialog.x86_64 0:1.1-9.20080819.1.5.amzn1
  gcc.noarch 0:4.8.3-3.20.amzn1                              libffi-devel.x86_64 0:3.0.13-11.4.amzn1
  openssl-devel.x86_64 1:1.0.1k-15.93.amzn1                  python27-tools.x86_64 0:2.7.10-4.122.amzn1
  system-rpm-config.noarch 0:9.0.3-42.27.amzn1

依存性関連をインストールしました:
  cpp48.x86_64 0:4.8.3-9.109.amzn1                         gcc48.x86_64 0:4.8.3-9.109.amzn1
  glibc-devel.x86_64 0:2.17-106.167.amzn1                  glibc-headers.x86_64 0:2.17-106.167.amzn1
  kernel-headers.x86_64 0:4.4.15-25.57.amzn1               keyutils-libs-devel.x86_64 0:1.5.8-3.12.amzn1
  krb5-devel.x86_64 0:1.13.2-12.40.amzn1                   libcom_err-devel.x86_64 0:1.42.12-4.40.amzn1
  libgomp.x86_64 0:4.8.3-9.109.amzn1                       libmpc.x86_64 0:1.0.1-3.3.amzn1
  libselinux-devel.x86_64 0:2.1.10-3.22.amzn1              libsepol-devel.x86_64 0:2.1.7-3.12.amzn1
  libverto-devel.x86_64 0:0.2.5-4.9.amzn1                  mpfr.x86_64 0:3.1.1-4.14.amzn1
  zlib-devel.x86_64 0:1.2.8-7.18.amzn1

完了しました!
Creating virtual environment...
Installing Python packages...
Installation succeeded.
Requesting root privileges to run certbot...
  /home/ec2-user/.local/share/letsencrypt/bin/letsencrypt --debug
Version: 1.1-20080819
Version: 1.1-20080819
No installers are available on your OS yet; try running "letsencrypt-auto certonly" to get a cert you can install manually

いろいろとインストールされて、無事完了したようです。

ただ、 この先はポータルにあった手順とはちょっと違ってきます。

ポータルでは、このタイミングでTUI画面(青い背景に灰色のポップアップのやつ)が表示される、とありますが、 Amazon Linux だと出てきません。

先ほどのメッセージの最後を読んでみると、

No installers are available on your OS yet; try running “letsencrypt-auto certonly” to get a cert you can install manually

> Amazon Linux で有効なインストーラはまだありません; 手動で証明書をインストールする場合は、”letsencrypt-auto certonly” を実行してみてください。

といったことが書かれています。ということで指示にしたがって進めます。

4. 「letsencrypt-auto」で証明書を取得する

では証明書を取得します。

その前に、もし 既にWebサーバ(Nginx, Apacheなど)を起動済みであれば、一旦停止しておく必要があります。

(webrootというオプションを使えば、Nginxの場合は停止しなくても良かったりしますが、ちょっとややこしくなるのでまた別の記事で書きます)

(Nginxの場合)
$ sudo service nginx stop
Stopping nginx:                                            [  OK  ]

(Apacheの場合)
$ sudo service httpd stop
Stopping httpd:                                            [  OK  ]

さて実行してみましょう。

今回は、例えば以下の3つのドメイン(サブドメイン)で使える証明書を一つにまとめて取得するパターンでやってみます。

  • example.com
  • www.example.com
  • dev.example.com

この場合は、次のようなコマンドになります。-dオプションと適用したいドメインをセットにして、複数ある場合はそれを繰り返します。

$ ./letsencrypt-auto certonly --standalone -d example.com -d www.example.com -d dev.example.com

実行すると、まず以下の様な表示が出てきて、

Requesting root privileges to run certbot...
  /home/ec2-user/.local/share/letsencrypt/bin/letsencrypt certonly --standalone -d example.com -d www.example.com -d dev.example.com
Version: 1.1-20080819
Version: 1.1-20080819

メールアドレスの入力を求められます。

Let's Encrypt メールアドレス入力

Enter email address (used for urgent notices and lost key recovery)

> メールアドレスを入力してください(緊急時のお知らせ、キーをなくした場合のリカバリに使われます)

特にユーザ登録とかそういったものではないですが、 何かあった時に使う大事なメールアドレス なので、ちゃんとしたものを入力しておきましょう。

メールアドレスを入力して「了解」を選択して次へ進むと、利用規約の同意を求められます。

Let's Encrypt 利用規約の同意

Please read the Terms of Service at
(利用規約のURL)
You must agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory

> 利用規約を確認してください。
(利用規約のURL)
ACMEサーバに登録することに同意する必要があります。
https://acme-v01.api.letsencrypt.org/directory

利用規約のURLはその時によって変わるみたいなので、画面に出てきたURLにアクセスして利用規約を確認してください。

その下の ACMEサーバ という聞きなれない言葉ですが、調べてみたら Let’s Encrypt で使われているプロトコル(決まりごと)のようです。詳しく知りたい方は、下記URLが参考になりましたので読んでみると良いです。

⇒ ACME - Qiita

ACMEは、 Automatic Certificate Management Environment の略とのことなので、自動で証明書を発行したり管理したりするためのプロトコルというところでしょうか。

まぁ何にせよ、これに同意しないと先には進めないので、ここは「Agree(同意する)」を選択して次へ進みます。

その後数秒待っていると、以下のようなメッセージがターミナルに出てきます。

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will expire on 2016-12-12. To obtain a new or tweaked version of this certificate in the future, simply run letsencrypt-auto again. To non-interactively renew *all* of your certificates, run “letsencrypt-auto renew”
- If you like Certbot, 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/live/example.com/fullchain.pem に証明書と中間証明書が保存されています。証明書の期限は 2016-12-12 です。将来的に、この証明書の新規もしくは微調整されたバージョンのものを入手するには、「letsencrypt-auto」を再実行してください。非対話的に証明書をすべて更新したい場合は、「letsencrypt-auto renew」を実行してください。

正式サービスになったので、有効期間が伸びるかなーと期待しましたが、そうでもないようです。 3ヶ月で切れてしまうので気をつけてください。

とはいえ忘れてしまいそうですし、cronを使って自動更新する方法についてまた別の記事で書きたいと思います。

証明書の取得は以上で終わりですが、 証明書の場所、更新時の動き、NginxとApacheでの設定例 についても触れておきます。

あ、 Webサーバを止めていて動かす必要がある場合は忘れずに起動しておきましょう。

(Nginxの場合)
$ sudo service nginx start
Starting nginx:                                            [  OK  ]

(Apacheの場合)
$ sudo service httpd start
Starting httpd:                                            [  OK  ]

(おまけ)証明書の場所&更新時の動き

Let’s Encrypt で取得した証明書は、/etc/letsencrypt/archive/ディレクトリ配下にドメインまたはサブドメインごとに別ディレクトリに分けられて格納されていきます。

今回は以下の3つで使える証明書を作成した場合を想定しています。

  • example.com
  • www.example.com
  • dev.example.com

この場合、example.comドメイン(ホスト名なし)とそのサブドメイン2つという場合ですが、次のようにexample.comディレクトリ配下に証明書が作成されます。

(root権限じゃないと証明書のあるディレクトリに入れないので)
$ sudo su
# cd /etc/letsencrypt/archive/example.com/
# ls -al
合計 24
drwxr-xr-x 2 root root 4096  9月 12 11:20 .
drwx------ 3 root root 4096  9月 12 11:20 ..
-rw-r--r-- 1 root root 1818  9月 12 11:20 cert1.pem
-rw-r--r-- 1 root root 1647  9月 12 11:20 chain1.pem
-rw-r--r-- 1 root root 3465  9月 12 11:20 fullchain1.pem
-rw-r--r-- 1 root root 1704  9月 12 11:20 privkey1.pem

ファイルが4つありますが、それぞれの内容は以下のとおりです。

  • cert1.pem:サーバ証明書
  • chain1.pem:中間証明書
  • fullchain1.pem:サーバ証明書+中間証明書
  • privkey1.pem:秘密鍵

各ファイルについている「1」という数字ですが、これは今後更新していくとcert2.pemのように 連番で新しい証明書等が作成されるようになっています。

で、 いちいち更新する度に Apache や Nginx の設定ファイルをいじるのも大変なので、/etc/letsencrypt/live/ディレクトリ配下に次のように各ファイルのシンボリックリンクが用意されていて、証明書を更新したら自動で最新のファイルに参照先が切り替わるようになっています!

このちょっとした心づかい嬉しいですねー!

# cd /etc/letsencrypt/live/example.com/
# ls -al
合計 8
drwxr-xr-x 2 root root 4096  9月 12 11:20 .
drwx------ 3 root root 4096  9月 12 11:20 ..
lrwxrwxrwx 1 root root   47  9月 12 11:20 cert.pem -> ../../archive/example.com/cert1.pem
lrwxrwxrwx 1 root root   48  9月 12 11:20 chain.pem -> ../../archive/example.com/chain1.pem
lrwxrwxrwx 1 root root   52  9月 12 11:20 fullchain.pem -> ../../archive/example.com/fullchain1.pem
lrwxrwxrwx 1 root root   50  9月 12 11:20 privkey.pem -> ../../archive/example.com/privkey1.pem

なので次のおまけ2で説明するように、 Webサーバの設定ファイルにはこちらのlive配下のシンボリックリンクを使うと、以降ファイル名をいちいち変えなくてもよくなるのでおすすめです。

(おまけ2)NginxとApacheでの証明書設定例

ここではメインの設定ファイルとなるnginx.confまたはhttpd.confへの設定例を書きますが、適用する環境に合わせて変更するファイルは適宜置き換えて読んでください。

Nginx で Let’s Encrypt の証明書を設定する

/etc/nginx/nginx.confを編集します。

$ sudo vim /etc/nginx/nginx.conf

・
・
・
server {
    listen  443;
    server_name  example.com;
    root  /var/www/html;

    ssl on;
    ssl_certificate  /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ・
    ・
    ・
}
・
・
・

反映は、リロードまたは再起動で行います。

$ sudo service nginx rload

or

$ sudo service nginx restart

Apache で Let’s Encrypt の証明書を設定する

/etc/httpd/httpd.conf(または/etc/httpd/conf/httpd.conf)を編集します。

$ sudo vim /etc/httpd/httpd.conf

・
・
・
<VirtualHost *:443>
  ServerName example.com
  DocumentRoot /var/www/html

  <Directory "/var/www/html">
    Options FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>

  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW

  SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

  DirectoryIndex index.php index.html
</VirtualHost>
・
・
・

(Apache 2.4.8以降の場合は、証明書の設定が以下のようになります)
  SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

   ↓

  SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

反映は、再起動で行います。

$ sudo service httpd restart

関連する記事