てっくらのーとは、触れた技術のメモと日常の記録が少し合わさった個人のサイトです。
Let's Encrypt で SSL 化しました
概要
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:80
を 443: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'