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 にします。

公式と手順

https://letsencrypt.jp

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

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

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

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

https://tom.busby.ninja/letsencrypt-nginx-reverse-proxy-no-downtime/

打開策。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」がついてる。)

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

(11/4)追記

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

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

(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'