2016/05/09

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-autorenew 付けて実行するだけ。

# ./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 書けそうである。

サイト内検索