XserverのVPSサーバー(Ubuntu)に無料のSSL証明書を設定するために、Let’s Encryptをインストールしてみたいと思います。
certbotのインストール
証明書を取得するためのクライアントツール python3-certbot-nginx をインストールします。
sudo apt install certbot python3-certbot-nginx
証明書の取得
取得方法
証明書の取得方法は下記の様になります。
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
取得例
今回は、https://maria.winroad.biz でMariaDBのphpMyAminのページが開くように設定してみたいと思います。
公開ディレクトリ | ドメイン名 | 備考 |
---|---|---|
/usr/share/phpmyadmin | maria.winroad.biz | MariaDBのphpMyAdmin |
上記の内容で証明書を取得すると下記の様になります。尚、上記例と違い www.maria.winroad.bizのドメインは作成していないので、maria.winroad.bizのみの作成になります。
sudo certbot --nginx -d maria.winroad.biz
下記の様にSuccessfullyと表示されたらOKです。
$ sudo certbot --nginx -d maria.winroad.biz
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for maria.winroad.biz
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/maria.winroad.biz/fullchain.pem
Key is saved at: /etc/letsencrypt/live/maria.winroad.biz/privkey.pem
This certificate expires on 2024-01-10.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for maria.winroad.biz to /etc/nginx/sites-enabled/maria
Congratulations! You have successfully enabled HTTPS on https://maria.winroad.biz
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
保管場所
/etc/letsencrypt/live/Maria.winroad.biz
証明書 | 内容 |
---|---|
cert.pem | SSLサーバー証明書(公開鍵含む) |
chain.pem | 中間証明書 |
fullchain.pem | cert.pem と chain.pem が結合されたファイル |
privkey.pem | 公開鍵に対する秘密鍵 |
確認
それでは、実際に確認してみましょう。sudo権限では、保管場所まで行けないので、rootに変更して見てみます。
su -
cd /etc/letsencrypt/live/maria.winroad.biz
ls -la
下記の様に各証明書が保存されているはずです。
root root README
root root cert.pem -> ../../archive/maria.winroad.biz/cert1.pem
root root chain.pem -> ../../archive/maria.winroad.biz/chain1.pem
root root fullchain.pem -> ../../archive/maria.winroad.biz/fullchain1.pem
root root privkey.pem -> ../../archive/maria.winroad.biz/privkey1.pem
証明書の更新
取得済みの証明書を更新する場合は以下のように実行します。
有効期限が 30日未満の証明書を全て更新
sudo certbot renew
有効期限の残り日数に関わらず更新したい場合
sudo certbot renew --force-renewal
–force-renewal オプションは、証明書を強制的に更新するオプションです。通常、certbot は証明書が期限近くになった場合のみ更新を行いますが、–force-renewal を使用するとその制限が無視され、証明書が即座に更新されます。
注意事項
- Let’s Encrypt などの証明書発行機関は一定時間内に発行または更新できる証明書の数に制限をかけています。頻繁に –force-renewal を使用すると、これらの制限に達する可能性があります。
- 予期せぬタイミングで証明書が更新されるため、サービスに短時間の中断が発生する可能性があります。
- 証明書が新しくなると、既存の設定やカスタマイズが上書きされる可能性があります。
- このオプションは、テスト環境や緊急のセキュリティ対策、証明書の設定変更など、特定の状況で必要な場合にのみ使用するべきです。不必要に使用すると、上記のような問題が発生する可能性があります。
更新プロセスのテスト
下記のコマンドは、実際には証明書を更新せず、更新プロセスをテストします。
sudo certbot renew --dry-run
証明書の自動更新
cron.dディレクトリに設定ファイルを作成する
/etc/cron.dディレクトリの下に拡張子のない設定ファイルを配置することで、crontabコマンドで設定した場合と同様のことを行うことが出来ます。
既存のcronファイル
まずは既存のcronファイルを見てみましょう。
ls -la /etc/cron.d
drwxr-xr-x 2 root root 4096 7月 8 10:04 ./
drwxr-xr-x 101 root root 4096 7月 8 10:03 ../
-rw-r--r-- 1 root root 102 3月 23 2022 .placeholder
-rw-r--r-- 1 root root 775 9月 15 2018 certbot
-rw-r--r-- 1 root root 201 1月 9 2022 e2scrub_all
-rw-r--r-- 1 root root 712 7月 13 2022 php
テンプレのコピー
まず最初にcrontabのテンプレからからssl_renew を作成します。
sudo cp /etc/crontab /etc/cron.d/ssl_renew
設定編集
sudo vim /etc/cron.d/ssl_renew
root 権限でSSL証明書を自動更新します。
#毎月1日の午前3時にSSL証明書を更新&nginxの再起動
00 03 01 * * root certbot renew && systemctl restart nginx
Nginxの設定
phpMyAdminでMariaDBを操作するための環境設定ファイルを作成します。
sudo vim /etc/nginx/sites-available/maria
下記の内容を maria ファイルに記述します。
server {
server_name maria.winroad.biz;
root /usr/share/phpmyadmin/;
index index.php index.html index.htm index.nginx-debian.html;
access_log /var/log/nginx/phpmyadmin_access.log;
error_log /var/log/nginx/phpmyadmin_error.log;
location / {
try_files $uri $uri/ /index.php;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
location ~ ^/(doc|sql|setup)/ {
deny all;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
include snippets/fastcgi-php.conf;
}
location ~ /\.ht {
deny all;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/maria.winroad.biz/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/maria.winroad.biz/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = maria.winroad.biz) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name maria.winroad.biz;
return 404; # managed by Certbot
}
設定ファイルの説明
この設定ファイルは、maria.winroad.bizドメインを用いて、phpMyAdmin を安全かつ効率的にホストするように作成されています。以下は、設定ファイルの主要な部分とその機能についての詳細です。
- 2行目:サーバー名がmaria.winroad.biz であると記述しています。
- 4〜7行目:ドキュメントルートが /usr/share/phpmyadmin/ で、indexファイルはindex.php であると記述しています。index.html 以降は、index.phpが見当たらなかったときの indexファイル名を表示しています。又、アクセスログとエラーログの場所も表示しています。
- 9〜13行目:Basic認証について記述されていて、認証データは /etc/nginx/.httpasswd に保存されています。
- 15〜17行目:アクセス拒否のファイル名が記述されています。
- 19〜24行目:PHPの設定が記述されています。Unixソケットを介して、php-fpmに渡されます。
- 30〜35行目:SSL証明書の設定が記述されています。443番ポートでのリスニングを設定し、SSL証明書と鍵のパスを指定しています。
- 38〜47行目:HTTPからHTTPSへのリダイレクションが設定されています。80番ポートでのリクエストは、443番ポート(HTTPS)に301リダイレクションされます。
これらの設定により、phpMyAdminへのアクセスはセキュアかつ効率的に制御され、ユーザーはHTTPSを通じて安全にアクセスできます。
設定の確認
最後にブラウザで確認してください。
http://maria.winroad.biz
httpsに転送されて、下記の様に鍵マークが表示されていたら、OKです。
コメント