# letsencrypt ふたたび {{tag: letsencrypt, ssl}} 以前、[[/diary/2015/1124 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 * [[https://letsencrypt.org/getting-started/ Let's Encrypt 公式 Getting Started]] ## ところで すでに証明書のあるサーバで受けるドメイン増やしたいときとか増やしたやつだけ叩いて、renew はかわらずなのだろうか? まあ取り急ぎ今回は、実は開発サーバも SSL 化したので、必要になったらそっちで試してやってみよう。 そしてこれで一応 SSL証明書手に入ったので、LINE bot 書けそうである。