Raspberry Pi の覚え書き

Raspberry piをいじってみて、なかなか手こずる場面もあり備忘録として作成。

セクション6:httpsに挑戦

        
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への リダイレクト設定を復活。