[Sy] Amazon Linux にて Let's Encrypt の SSL/TLS証明書を取得して Nginx と Apache でHTTPSの設定をする手順
2016年4月からいよいよ正式サービスとなった無料でSSL/TLS証明書を取得できる Let’s Encrypt を使って、 Amazon Linux (EC2インスタンス)で証明書を取得して Nginx や Apache で設定するまでの手順をまとめました。
※2017/10/20更新 新しく記事を書いたので、こちらを読んでみてください。
⇒ [Sy] Amazon Linux(2017.09 release) + Nginx の環境で Let's Encrypt の SSL/TLS 証明書を取得して HTTPS の設定をする手順 ⇒ [Sy] Amazon Linux(2017.09 release) + Nginx の環境で Let's Encrypt の SSL/TLS 証明書を自動更新する設定
基本的なことはこちらのサイトに詳しく書かれているので、よーく読んでおきましょう!
⇒ Let's Encrypt の使い方 - Let's Encrypt 総合ポータル環境
- サーバ:AWS EC2インスタンス (t2.nano)
- OS:Amazon Linux (AMI release 2016.03)
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
メールアドレスの入力を求められます。
Enter email address (used for urgent notices and lost key recovery)
> メールアドレスを入力してください(緊急時のお知らせ、キーをなくした場合のリカバリに使われます)
特にユーザ登録とかそういったものではないですが、 何かあった時に使う大事なメールアドレス なので、ちゃんとしたものを入力しておきましょう。
メールアドレスを入力して「了解」を選択して次へ進むと、利用規約の同意を求められます。
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 - QiitaACMEは、 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