Let's Encrypt で SSL 化しました

Posted on 2018-10-20 in zakki

概要

SSL 化をします。

概要 ( もうちょっと細かく )

Let's Encrypt(LE) を使用して SSL 化をします。この環境は AWS Lightsail なので、SSL 化を行うなら ACM でもよいのですが、ACM は ELB か CloudFront か API Gateway にしか SSL 証明できない ( と聞いた )。EC2 単体にはできず、Lightsail もご多分に漏れず該当するので、まずは LE を使用します。ACM は他の機会にね。

環境

  • Ubuntu 16.04
  • Docker 18.06.1-ce

構成

Client--80:80--nginx(front)--8080--nginx(back)--html

80:80443:443 にします。

公式と手順

公式

自社のところでも使っててフフッってなる。

  • ( 事前 )DNS 設定 ( 名前解決できないといけない。)
  • ( 事前 )FW 設定 (TCP80 と 443 が通らないといけない。)
  • certbot のインストール
  • certbot のテスト
  • 証明書取得
    • WebRoot の確認
    • メールアドレスの確認
    • ドメイン名の確認
  • ( 事後 )Web サーバ (apache/nginx) の編集
  • ( 事後 )pelican の ssl 化

リバースプロキシとコンテナ

リバースプロキシだと WebRoot が「んっ?」となります。WebRoot = DocumentRoot にするのですが、リバースプロキシには配信している静的ファイルはないので困ってしまいます。

Let's Encrypt Auto-Renewal for Nginx Reverse Proxies

打開策。ninja ドメインだ。リバースプロキシ側の conf ファイルに /.well-known の location 設定を追加する (+ 確認用の indexHTML)。記事内に出てくる rancher はコンテナ管理プラットフォーム (https://www.rancher.co.jp/) だそうで。

設定メモ

.well-known の作成と確認

  • .well-known ディレクトリの作成と確認 HTML の作成
sudo mkdir -p ~/docker-test/proxy/html/.well-known
sudo echo "test" > ~/docker-test/proxy/html/.well-known/test.html
  • リバースプロキシ (.well-known の設定 )
    server {
        ( 中略 )
        location /.well-known {
            root /usr/share/nginx/html/;
        }
        ( 中略 )
    }
  • 確認

http://mkr-note.net/.well-known/test.html で test と表示される。

( 今はありません。)

certbot

  • certbot インストール (Ubuntu 16.04)

sudo apt -y install letsencrypt

ちょっと「ん?」って思ったところ。インストールはいいとして、certbot コマンドが動かない。find で探してもないので letsencrypt コマンドで進める。( それでも問題なかった。)

  • 証明書の発行

sudo letsencrypt certonly --webroot -w ~/docker-test/proxy/html/ -d mkr-note.net

表示されたウインドウ内の質問に対して、公式を参考に回答する。

SSL 用修正

  • nginx(front)

ssl_certificate の設定を悩み中。

生成された鍵を指定するのですが、最初にこんなエラーが出たので。 生成された鍵のディレクトリは複数あって参考ブログだと live にしていたのだけど、それ対象にしたらエラー発生。ちなみに live は、archive に配置している鍵の symlink が入っている。

たぶん、権限をちょっと弄れば終わりそうですが。めんどくさ心が勝ってしまったので直接 archive 指定にしている。( ので鍵名のお尻に「1」がついてる。)

これはあとで直すかも。自動更新のときにギャーギャー言いそうなので。

(2018/11/4) 追記

直しました。docker-compose.yml で指定している volume のマウントを若干修正しました。ここまでマウントすんのもどうなの?って思うけど。

volumes:
    ( 中略 )
    - /etc/letsencrypt:/etc/nginx/letsencrypt:rw

(2018/11/4) 追記ここまで

    nginx: [emerg] BIO_new_file("/etc/nginx/certs/fullchain.pem") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/nginx/certs/fullchain.pem','r')error:2006D080:BIO routines:BIO_new_file:no such file)
    server {
        listen 80;
        listen [::]:80;
        server_name mkr-note.net;
        return 301 https://$server_name$request_uri;
    }
    server {
        listen 443 ssl;
        listen [::]:443;
        server_name mkr-note.net;
        # archive
        ssl_certificate /etc/nginx/certs/fullchain1.pem;
        ssl_certificate_key /etc/nginx/certs/privkey1.pem;
        # live
        #ssl_certificate /etc/nginx/certs/fullchain.pem;
        #ssl_certificate_key /etc/nginx/certs/privkey.pem;
        ( 中略 )
        location /.well-known/ {
            root   /usr/share/nginx/html/;
        }
    }
  • docker-compose (nginx(front))

ポートフォワードと、ボリュームマウントを追加。

    ports:
      - "443:443"
    volumes:
      - ( 証明書を生成したディレクトリ ):/etc/nginx/certs/
  • Pelican

pelicanconf を修正。

    #SITEURL = 'http://mkr-note.net'
    SITEURL = 'https://mkr-note.net'