痛風とシステム障害を恐れるエンジニアのブログ

趣味のことだったり仕事に関することだったりを徒然なるままに。webとかオープン系の会社で働いてます。お仕事の依頼お待ちしておりまーす。

レッツLet's Encrypt

昨今HPのhttps化についての話題が多いので、今回管理しているサイトをhttps化しました。
昔は証明書の発行やらなんやらで年間ン万円してたのですが、今は随分と環境が変わってきましたねぇ。

タイトルにもあるように今回はLet's Encrypt を利用しています。

letsencrypt.org

今回の作業は全部rootユーザで行っています。
まずはファイルを一式持ってきます。

# git clone https://github.com/letsencrypt/letsencrypt

そして以下のコマンドを実行です。
必要なライブラリなどを持ってきてくれます。

./letsencrypt-auto --help

そして証明書等々の作成です。
すでにwebサーバ(Nginx)が動いてる状況だったので、webrootプラグインを利用しています。

./letsencrypt-auto certonly --webroot -w {ドキュメントルート} -d {ドメイン}

同意を求められたりメアドの入力を求められると思います。それらに素直に従いましょう。
そうするとファイルが出来上がるはずです。
たぶん、/etc/letsencrypt/live/{ドメイン}の下辺り。
そのファイルをwebサーバに読み込ませます。

nginxの場合は
serverブロックの下に記述しています。

server {
    listen      443 ssl;
    ssl_certificate /etc/letsencrypt/live/{domain}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/{domain}/privkey.pem;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;

重要なのは443のlisten portの設定をすることですね。私はうっかり忘れてました。

もう一つ設定を追加します。
これまで通りhttp ほにゃららにアクセスがあった場合に強制的にhttpsにリダイレクトしてあげます。
serverブロックを分けて

server {
    listen 80;
    server_name  {ドメイン};
    return 301 https://$host$request_uri;
}

と言った感じにします。
これでhttp://〜〜でブックマークに登録してた人たちも自動的にhttps通信に切り替わります。

忘れないようにFirewallの設定も行っておきます。

# firewall-cmd --list-all

# firewall-cmd --permanent --add-service=https

# firewall-cmd --reload

証明書の有効期限は短いので定期的に更新して上げる必要があります。
cronに仕込めば良いと思います。

0 0 1 * * /letsencrypt/letsencrypt-auto certonly --webroot -w {ドキュメントルート}-d {ドメイン} --renew-by-default && nginx -s reload

上記の例では証明書の更新とnginxの設定再読み込みを行っています。
もしかしたらnginxの再読み込みいらないかも???(未確認)