console.lealog();

@leader22のWeb系に関する勉強めもブログですのだ

Let's Encryptでサブドメインをまとめてhttpsにする

この記事はなんたらAdventCalendarとは関係のないただのメモです。

このへんの分野はあんまり強くないものの、手探りでやってみてなんとかできたのでその学びを。
基本的にはこのリンクを参考にしたけども、内容を理解するまでにいろいろ壁があったので・・。

Let's Encryptで複数サブドメインの証明書を発行して自動更新を設定する - Qiita

環境は、

nginxのバージョンは後であげた。

はじめに

そもそも気になってたことなので改めて書いておきます。

うちのVPSだと、

  • lealog.net
  • www.lealog.net
  • labs.lealog.net
  • ikasu.lealog.net

この4つがまとめてhttps化できました。

というわけでざっくり手順

  • certbot いれる
  • acme-challenge用のlocationを作る
    • 既存のserver設定でそのlocationにアクセスできるようにする
  • 証明書の発行
  • server設定
    • httpsの有効化
    • http -> httpsにリダイレクトするように

こういうのは大枠からつかんでいくに限る(˘ω˘ )

certbotをいれる

ユーザーガイド - Let's Encrypt 総合ポータル

ここにある手順に則るだけなんですが、CentOS 6.xだとこれが最初の難関です。

途中の処理でPython2.7↑が必要になるけど、CentOS 6.xだと入ってないのでそこをなんとかする必要があります。

CentOS 6 で発生するエラーの対処法 - Let's Encrypt 総合ポータル

これによると、最新のcertbotだと問題ない的なことが書いてますが、ダメでした。
なので、このリンクにある旧解決策とやらを実施。

  • SCLは、システムに入ってて簡単にアップデートできないソフトを、別途インストールして実行できる仕組み(ざっくり
  • SCLが使えるようになると、後はいつもどおりyumでいれる
  • いれたソフトを`enable`状態にしたシェルを起動して後のことをやる

って感じですかね。
ちなみにPython3.3でも動いた。

certbot-auto -h

でエラーでずにヘルプが見れるようになればOK。

acme-challengeできるように

Let's Encrypt を支える ACME プロトコル - Block Rockin’ Codes

前提知識はコレ。

証明書を発行するために、Let's Encrypt氏をそのドメインで受けてるサーバーに一度お招きする感じ?

location ^~ /.well-known/acme-challenge {
    default_type "text/plain"; # 念のため
    root /var/www/letsencrypt; # 実際はどこでもいいぽい?
}

こんな設定を用意する。
設定だけじゃなくて、ディレクトリもちゃんと作る。

そして、今まで通りの`server`設定の中で読む。

server {
  listen 80;
  server_name foo.example.com;

  include /path/to/↑のconf;
}


これで、`http://foo.exampe.com/.well-known/acme-challenge/xxxxxxx`に通るようになるはず。
nginxの設定をreloadするのをお忘れなく。

次の証明書をつくるステップで、実際にリクエストが飛ぶ。

証明書をつくる

certbot-auto certonly --webroot -w /var/www/letsencrypt -d foo.example.com -d bar.example.com

`-w`に渡すパスは、さっき用意したディレクトリ。
`-d`でhttpsにしたいドメインを列挙。

↑の設定が正しくできてて、Let's Encrypt氏を無事に招くことができれば証明書ができる。
`/etc/letsencrypto/live/`配下に、ドメインごとにいろいろできあがってるはず。

nginxにhttpsの設定

server {
    listen  80;
    server_name foo.example.com;

    # 今までの設定はまるっと移動して、リダイレクト設定だけにする
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name foo.example.com;

    # 今までの設定はこっちに
    # さっきのacme-challenge用のincludeも忘れずに
    # ssl_**の設定は、nginxのバージョンによって色々違うので割愛
}

もう`http`で受ける必要がないなら80番はいらんけど、また更新する時とか、世に出回ってしまったリンクとかあると思うので残す。

各種ssl_**ディレクティブの設定は、以下の記事とかを参考に。

もろもろ設定したらnginxをreloadして、無事にアクセスできればhttps化done!

証明書の更新

証明書の期限が3ヶ月なので、定期的に更新しないといけない。
cronでやってもいいし、期限が迫るとメールがくるらしいのでその都度手動でも。

certbot-auto renew

その後またnginxをreloadする。

新しいドメインhttpsで作るとき

基本的に同じ。

  • まずはhttpでサーバーたてる
  • 証明書つくる
  • httpsに移行する

これでServiceWorkerもWebRTCも試し放題じゃー

はじめてのrenew

20170216: 追記
はじめて手動でrenewしたけど一瞬だった。

# 久々なのでとりあえずヘルプ
certbot-auto -h

# そしてらアップデートが走った

# 問題なさそうだったので更新
certbot-auto renew

# nginxの再起動もお忘れなく

一瞬だった。
DevToolsのSecurityペインから`View certificate`したら更新されてるのがわかる。