1.サーバー証明書を無料で発行する
letsencrypt.jpで発行、更新するCertbotをインストールする。
現状でRaspbian GNU/Linux 9.4(stretch)でnginx/1.10.3に対応した
Certbotクライアントがまだ無い為、其の他のUNIX系OSの手順に従って
certbot-autoをインストールしろとあったので、取りあえず
Certbotインストール
sudo apt-get install certbot
2.certbotを実行する
sudo certbot certonly
で必要事項を入力してEnterでSSL証明が発行される
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel):Domain名
Press 1 [enter] to confirm the selection (press 'c' to cancel): 1
Input the webroot for Your Domain: (Enter 'c' to cancel): /var/www/html
/etc/letsencrypt/live/ドメイン名/の下に
fullchain.pemとprivkey.pemが有るのを確認。
3.nginxの設定
/etc/nignx/sites-available/defaultを開いて設定を書き込む。
# Default server configuration
#
#httpでのアクセルをhttpsにリダイレクトする設定は今回
#使用しない。
#server {
# listen 80 default_server;
# listen [::]:80 default_server;
# server_name _;
# return 301 https://$host$request_uri;
#}
server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
#
listen 443 ssl default_server;
listen [::]:443 ssl;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html index.php;
#server_name ogmmm.homelinux.net;
ssl_certificate /etc/letsencrypt/live/ogmmm.homelinux.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ogmmm.homelinux.net/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# # With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
error_page 404 /404.html;
location = /404.html{
root /var/www/html;
}
}
HTTPでアクセスがあった場合HTTPSにリダイレクトする設定もしたが、
ローカルでテストするとき、ルーターの設定の関係でドメイン名でアクセス出来ず
IPアドレスで直アクセスしたら、不正アクセスの警告が出るため、設定を外して。
ルーターの開放ポートを443のみとした。
(特に広く一般公開しているサイトでは無いのでこれで十分)
4.自動更新の設定
/etc/cron.d/certbotに自動更新の設定がされるようなので、ファイルを確認。
# /etc/cron.d/certbot: crontab entries for the certbot package
#
# Upstream recommends attempting renewal twice a day
#
# Eventually, this will be an opportunity to validate certificates
# haven't been revoked, etc. Renewal will only occur if expiration
# is within 30 days.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew
が作成されている。
念のため、更新の確認
sudo /usr/bin/certbot -auto renew
としたら
The following certs are not due for renewal yet:
/etc/letsencrypt/live/ogmmm.homelinux.net/fullchain.pem (skipped)
No renewals were attempted.
とまだ更新の必要はないと出る。
証明書に有効期限は90日なので、これで自動更新されるはず。
/*******************************************************************************
自動更新が動いていないようでLet's Encryptからあと10日で期限が切れる旨の
メールが来た。syslogを確認したらcertbot renewは起動している模様だが
エラーになっている。
1.手動で更新してみる。
sudo /usr/bin/certbot -auto renew
としたがなにやらエラーが出て更新出来ない。
さらにWebで調べてLet's Encryptのユーザーガイドにあった
sudo /usr/bin/certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"
としてnginxを停止して更新するコマンドを実行してみたが
エラーになる。ただしcertonlyで更新出来ると表示されたので
sudo /usr/bin/certbot certonly
としたが入力したドメイン名が間違っていないか、ファイアーウォールが
働いている等のメッセージがでる。
この時点で、ようやくポート80を切っているのが原因では無いかと気づく。
ポート80をオープンして再度
sudo /usr/bin/certbot certonly
とやってようやく更新完了。
自動更新、手動での更新がうまくいかなかったのが、ポート80にアクセス出来なかった
のが原因なのかどうかはもう少し様子を見る必要がある。
どうやら新しいKeyが発行されたみたいでnginxの設定を変更しないとだめみたいです。
chromeで確認したら、有効期限が更新されていない。
/******************************************************************************
1.ポート80を解放後cert.pem等のシンボリックリンクはcert2.pem等に変更されており
それぞれfullchain2.pemとcert2.pemができていた。
2.有効期限の確認で
sudo openssl x509 -noout -dates -in cert.pem
notBefore=JUL 20 22:57:09 2018 GMT
notAfter=Oct 18 22:5509 2018 GMT
ちゃんと更新されている。
3.ブラウザで確認したら有効期限が更新されていない、どうやらnginxが再起動されて
以内模様なので、再起動したら有効期限が更新された。
自動で作成されたcertbotファイルにnginxのリスタートの設定がないのが原因。
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew ; sudo systemctl restart nginx
自動更新設定/etc/cron.d/cerbotの最後にnginxの再起動設定を追加。
これで3ヶ月後の様子を見る。
ついでに/etc/nginx/sites-available/defaultのポート80からポート443への
リダイレクト設定を復活。