nginx(reverse proxy) + Let's Encrypt(wild card)
nginxをリバースプロキシとして設定 証明書は Let's Encrypt のワイルドカード証明書 を使用 証明書の更新は自動で行われるようにスクリプトを設定(予定)
証明書の取得
nginx
nginxのインストール
apt install nginx
nginxにcertbot関連の設定
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/directory は acme challenges のサーバ
--agree-tos は Term of Service への同意
他のオプションは他サイトでもよく紹介されているので割愛
-d を2つ指定していると、acme-challengeのためのTXTレコードが2つ表示される。
2つともTXTレコードを自分のDNS等に登録し完了
異常なく終了すると、
/etc/letencrypt/live/yourdomain にワイルドカード対応の証明書が作成されているはず・・・
※TXTレコードのTTLは短い設定にしておくのが良い。
後述で 証明書の自動更新においてシェルスクリプトを用いて、
外部のDNSのTXTレコードを自動更新出来るようにするが、
TTLの分 wait を入れること
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 の話↓