nginx(reverse proxy) + Let's Encrypt(wild card)

nginxをリバースプロキシとして設定 証明書は Let's Encrypt のワイルドカード証明書 を使用 証明書の更新は自動で行われるようにスクリプトを設定(予定)

証明書の取得

nginx

nginxのインストール
apt install nginx
nginxにcertbot関連の設定

blog.ymyzk.com

vim /etc/nginx/conf.d/default.conf
server {
    listen 80;
    listen [::]:80;

    server_name yourdomain.com;

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/letsencrypt;
    }

    location = /.well-known/acme-challenge/ {
        return 404;
    }
}

certbot

certbot のインストール

Ubuntu 18.04 では標準レポジトリで acme challenge が出来る certbot が入るので apt でインストールします。 別に git clone しても問題なし。

apt install certbot

certbot の実行

*.yourdomain.com(サブドメインなし)とyourdomain.com(サブドメインなし)で証明書を取得する。
予め、サブドメインなしのyourdomain.comのAレコードは、certbotを実行するIPアドレスを引けるように設定しておくこと。
-d の順番に注意 先に指定したほうがコモンネームとなる。(※要出典)

certbot certonly --manual --preferred-challenges dns-01 \
--server https://acme-v02.api.letsencrypt.org/directory --agree-tos  \
--manual-public-ip-logging-ok \
-d *.yourdomain.com \
-d yourdomain.com \
-m your_mail_address

certonly は証明書の取得のみ
--manual は対話的に実行する場合、もしくはシェルスクリプトをフックする場合
--preferred-challenges dns-01 は、今回 wildcard証明書 を取得するために必要(後述)
--server https://acme-v02.api.letsencrypt.org/directoryacme challenges のサーバ
--agree-tos は Term of Service への同意
他のオプションは他サイトでもよく紹介されているので割愛

qiita.com

-d を2つ指定していると、acme-challengeのためのTXTレコードが2つ表示される。
2つともTXTレコードを自分のDNS等に登録し完了

異常なく終了すると、
/etc/letencrypt/live/yourdomain にワイルドカード対応の証明書が作成されているはず・・・

※TXTレコードのTTLは短い設定にしておくのが良い。
後述で 証明書の自動更新においてシェルスクリプトを用いて、
外部のDNSのTXTレコードを自動更新出来るようにするが、
TTLの分 wait を入れること

www.geekpage.jp

nginx に証明書の設定、及びredirectの設定

vim /etc/nginx/conf.d/default.conf

nginx の設定を変更する。
80 http へのアクセスは全て 301 で 443 https へリダイレクトをかける。

server {
    listen 80;
    listen [::]:80;

    server_name yourdomain.com;

    #location ^~ /.well-known/acme-challenge/ {
    #    root /var/www/letsencrypt;
    #}

    #location = /.well-known/acme-challenge/ {
    #    return 404;
    #}
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/geraniales.com/fullchain.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/geraniales.com/chain.pem;
    ssl_certificate_key /etc/letsencrypt/live/geraniales.com/privkey.pem;
    ssl_session_timeout 10m;
    ssl_session_cache shared:SSL:50m;

    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers EECDH+AESGCM+AES128:EECDH+AESGCM:EECDH+AES128:EECDH+AES256;
    ssl_prefer_server_ciphers on;

    add_header Strict-Transport-Security max-age=15768000;

    ssl_stapling on;
    ssl_stapling_verify on;

    resolver 1.1.1.1 1.0.0.1;

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/letsencrypt;
    }

    location = /.well-known/acme-challenge/ {
        return 404;
    }
}

dhparam.pem が無い環境があったりしたのでその場合は下記のコマンドを

openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

ssl_ciphers の話↓

oflow.me

参考

www.eastforest.jp

gist.github.com