Skip to Content

Let's Encryptで取得したワイルドカード証明書をNginxに設定

概要

Let’s Encryptで取得したワイルドカード証明書をNginxに設定する

前回ワイルドカード証明書を取得した続きです
EC2とRoute53でLet’s Encryptのワイルドカード証明書取得 | infraya.work

結論

一般的な証明書を導入する手順と同じ

作業の流れ

ワイルドカード証明書をNginxに設定

前回、ワイルドカード証明書をLet’s Encryptから取得するために、
LEGOを実行するだけのEC2インスタンス(LEGOサーバ)を構築しました

証明書を適用する対象はZabbix5.0の検証用に構築済みのサーバを流用します
NginxはZabbixのインストール手順 通りに設定されたものです
Zabbixサーバは社内からのアクセスのみを想定して、セキュリティグループは特定のグローバルIPのみの通信に制限しています
Let’s EncryptのHTTP-01チャレンジ場合、80番ポートをオープンにしないといけないため証明書の取得ができない状態です
そのため、ZabbixサーバからDNS-01チャレンジで証明書取得するのが証明書更新の自動化を考えると無難な構成になります
今回はLet’s Encyrptで取得したワイルドカード証明書が機能するか検証したいため、
LEGOサーバで取得した証明書をZabbixサーバに置いて設定します

Zabbixサーバのセキュリティグループ

自宅のグローバルIPから下記の通信を許可

  • SSH
  • HTTP
  • HTTPS

ワイルドカード証明書を対象のサーバへコピー

取得した証明書をLEGOサーバから手動でコピーして、検証用のZabbixサーバのホームディレクトリ直下に置きました

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ pwd
/home/ubuntu/certificates

$ ll
total 20
drwx------ 3 ubuntu ubuntu 4096 May 28 02:28 ./
drwxr-xr-x 5 ubuntu ubuntu 4096 May 28 01:17 ../
drwx------ 2 ubuntu ubuntu 4096 May 28 01:16 .lego/
-rw------- 1 ubuntu ubuntu 1648 May 28 01:16 _.abashiri.city.issuer.crt
-rw------- 1 ubuntu ubuntu  236 May 28 01:16 _.abashiri.city.json

LEGOサーバからローカルPCへコピーし、ローカルPCからZabbixサーバへコピーする
scp Tips すぐ忘れるオプション | infraya.work

注意

Let’s Encryptの証明書の有効期限は3か月です
手動コピーだと都度手作業が発生してしまい運用がつらいだけです

Nginxの証明書設定

下準備

  1. 証明書保存用のディレクトリを作成
  2. 証明書と秘密鍵をディレクトリに移動

さきほどホームディレクトリ直下に証明書のあるディレクトリをコピーしてきました
/home/ubuntu/certificates

1
2
3
$ sudo mkdir -p /etc/nginx/ssl/_.abashiri.city
$ sudo mv ./certificates/_.abashiri.city.crt /etc/nginx/ssl/_.abashiri.city/
$ sudo mv ./certificates/_.abashiri.city.key /etc/nginx/ssl/_.abashiri.city/

Zabbix5.0のNginxのコンフィグを見ていきます
/etc/nginx/conf.d/zabbix.conf/etc/zabbix/nginx.confのシンボリックリンクになっていました

1
less /etc/nginx/conf.d/zabbix.conf

zabbix.abashiri.cityを80番ポートで受ける設定が入っています

1
2
3
4
5
6
server {
        listen          80;
        server_name     zabbix.abashiri.city;

        root            /usr/share/zabbix;
        --- 省略 ---

以下の設定を行いました

  • 80番ポートで受け付けたらhttpsへリダイレクト
  • TLS暗号して443番ポートで受けつける
  • TLS1.0/1.1は使わない
  • 証明書と秘密鍵のパスを指定
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
server {
        listen          80;
        server_name     zabbix.abashiri.city;
        return 301      https://$host$request_uri;
}

server {
        listen          443 ssl;
        server_name     zabbix.abashiri.city;
        ssl_protocols   TLSv1.2 TLSv1.3;
        ssl_certificate     /etc/nginx/ssl/_.abashiri.city/_.abashiri.city.crt;
        ssl_certificate_key /etc/nginx/ssl/_.abashiri.city/_.abashiri.city.key;

        root    /usr/share/zabbix;
        --- 省略 ---

設定変更後、設定を反映させます

1
sudo nginx -s reload

WEBブラウザからアクセス

https://zabbix.abashiri.cityへアクセス
Let’s Enctyptで取得したワイルドカード証明書は問題なく使えることが確認できました

証明書は*.abashiri.cityになっています

感想

検証用Zabbixサーバへの接続を暗号化したかったのでやってみた
Let’s Enctyptで証明書さえ取得できれば後は一般的な作業と同じ
証明書更新は自動化しないと無理があるので今回の方法では残念な感じ
Zabbixサーバで定期的にLEGOを実行してDNS-01チャレンジで証明書を取得するのが早いが、
これならワイルドカード証明書である必要はなくなってくる…
ELB, CloudFrontなしにEC2インスタンス単体で暗号化を実現するには手軽でとてもよい

参考

nginx の設定をレビューするときの観点をまとめてみた - Cybozu Inside Out | サイボウズエンジニアのブログ
ついにTLS 1.0/1.1の無効化が決定!影響や確認・対応方法とは? | さくらのSSL