letsencrypt ふたたび
以前、letsencrypt を試して このブログのドメインを SSL 対応してみたのですが、いろいろあってまともに運用してなかったので、あっという間に90日過ぎて証明書が expire という残念な状態だったのですが、letsencrypt のベータも取れたし大型連休を利用してまともな運用状況にもっていきましょうということをやってみるけどまともかどうかはわかりませんがとにかくやってみるぞっと。
環境
- CentOS 6
- SCL + python2.7
- SSL を受けるwebサーバは nginx
- 証明書の新規取得、更新時に止めない
- サブドメインたくさん
- letsencrypt-auto 0.5.0
初回起動
CentOS6 なので python2.7 のため、まずは SCL をフックします。
scl enable python27 bash
python -V; # Python 2.7.5
以前の実行内容はチャラにして進めたいので、初回起動からはじめます。letsencrypt は ~/.local と /etc/letsencrypt を作成するので、まずはそれを削除してリセット。
rm -rf ~/.local
rm -rf /etc/letsencrypt
letsencrypt 自体も最新のを clone しなおします。
git clone https://github.com/letsencrypt/letsencrypt
以下のコマンドで改めて letsencrypt 実行環境周りを整えます
./letsencrypt-auto --help
DNS の設定
SSL化するドメインは自分の web サーバに Aレコードでアクセスが向くようにしておきます。
nginx の事前設定
letsencrypt の ACME認証フローでは /.well-known/acme-challenge
以下にリクエストがくるので、手元の nginx でよしなにレスポンスを返却する設定を書きつつ、開発サーバなどで BASIC 認証をかけてたりする場合は、letsencrypt のアクセスの場合、解除できるように設定。
ドキュメントルート
mkdir /var/www/letsencrypt
なんか適当にこんな感じのを書いておく。
location ^~ /.well-known/acme-challenge {
auth_basic off;
default_type "text/plain";
root /var/www/letsencrypt;
}
let's letsencrypt
ちなみに、前からあったか記憶がないのですが、letsencrypt のサーバ側で letsencrypt-auto
コマンドの実行回数に制限が入ったようなので、テスト段階では --test-cert
を付けて、letsencrypt 側のステージングサーバとやりとりするようにします。んで、もろもろ整ったら --test-cert
なしで実行すると。
./letsencrypt-auto certonly --webroot -w /var/www/letsencrypt -d bayashi.net -d img.bayashi.net
Checking for new version...
Requesting root privileges to run letsencrypt...
/root/.local/share/letsencrypt/bin/letsencrypt certonly --webroot -w /var/www/letsencrypt -d bayashi.net -d img
.bayashi.net
Version: 1.1-20080819
Version: 1.1-20080819
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/bayashi.net/fullchain.pem. Your cert will
expire on 2016-08-02. 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/archive/* -> /etc/letsencrypt/live/{DOMAIN}/*.pem
複数ドメインで証明書を生成しても、SAN なのでできあがるのは 1セット。たぶん一番最初に書いたドメイン名のディレクトリに証明書がおかれるっぽい。
nginx での SSL 設定
SSL 用は別ファイルにしてる。
ssl.conf
listen 443 ssl;
ssl on;
ssl_certificate /etc/letsencrypt/live/bayashi.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/bayashi.net/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!aNULL!eNull:!EXPORT:!DES:!3DES:!MD5:!DSS;
ssl_prefer_server_ciphers on;
ssl_dhparam /path/to/dhparam.pem;
nginx reconf
して適用。
Strict-Transport-Security(HSTS)
ヘッダは、まだちょっと吐かず、80 を 443 にリダイレクトしてお茶を濁す。
port:80 を port:443 にリダイレクト
server {
server_name bayashi.net;
listen 80;
return 301 https://$host$request_uri;
}
証明書の更新
letsencrypt の証明書は 90 日で expire するが、更新は letsencrypt-auto
に renew
付けて実行するだけ。
# ./letsencrypt/letsencrypt-auto renew
Checking for new version...
Requesting root privileges to run letsencrypt...
/root/.local/share/letsencrypt/bin/letsencrypt renew
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/bayashi.net.conf
-------------------------------------------------------------------------------
The following certs are not due for renewal yet:
/etc/letsencrypt/live/bayashi.net/fullchain.pem (skipped)
No renewals were attempted.
証明書の期限が 30日過ぎると更新されるみたいなので、今は何も起きない(skipped)。
取り急ぎ、2ヶ月過ぎたら手で叩いてみて、よさげなら cron 登録もしてみる。
see also
ところで
すでに証明書のあるサーバで受けるドメイン増やしたいときとか増やしたやつだけ叩いて、renew はかわらずなのだろうか? まあ取り急ぎ今回は、実は開発サーバも SSL 化したので、必要になったらそっちで試してやってみよう。
そしてこれで一応 SSL証明書手に入ったので、LINE bot 書けそうである。