自宅サーバー、Ubuntu上のApacheのHTTPS(SSL)を有効化する

投稿者: | 2022/08/22

Let’s Encrypt®、ACMEについてのおさらい

WEBサーバーのSSLサーバ証明書発行概要

サボりにサボっていた この WEBサーバーの SSL化を、夏休みを使って何とか導入できた。
利用させていただいた認証局は Let’s Encrypt®。設定には、Certbotを使った。

まずはおさらい。

Let’s Encrypt®は、webサイトで HTTPS (SSL/TLS) を有効にするために必要なデジタル証明書を無料で発行してくれる認証局(CA)で、自動証明書管理環境(ACME)を整えれば、証明書の取得や使用するための環境設定、さらに後の更新を自動でやってくれる。

自動証明書管理環境 (ACME)は、認証局(CA)のドメイン検証や、ドメイン管理者が要求する証明書署名に基づく証明書発行までの工程を自動化することを目的としたもので、ドメイン管理者側の サーバー上でACMEのサービスを利用するためのソフトウェア(ACMEクライアント)を動作させることで証明書等の管理を自動的に行ってくれる。

ここで使う Certbot(サートボット)は代表的な ACMEクライアントの一つで、Let’s Encrypt®からも使用を推奨された信頼性の高いソフトウエアだ。

WordPressのSSL有効化プラグインは必要か

WordPressで作成されたサイトの HTTPS(SSL)の有効化には、Really Simple SSLなどの便利なプラグインが用意されていて、サイトの SSL化に必要な次の作業をワンタッチで設定してくれる。

  1. デジタル証明書の取得と設定。
  2. .htaccessファイルへの 301リダイレクト設定。
  3. 内部リンクやイメージソースの URLを HTTPから HTTPSに書き換え。

このうち、 1と 2はプラグインなど使わずとも今回使用する Certbot(サートボット)がやってくれる。

3に関しては、記事中に記載した urlがフルパスではなく、ドキュメントルートからの相対パスであれば、作業そのものが必要無い。
(※こちらのサイトでは、記事の一部にフルパス記載の箇所があった為、手動で書き換え作業を行った。)

逆にプラグインを使ったが為問題となる場合もある。
記事中に記載された外部リンクも同じように httpから httpsへ変更されてしまうため、リンク先の SSLが有効でなかった場合、そのままリンクを踏んでしまうとブラウザから警告を受けてしまうのだ。

また、こうしたプラグインは、リクエストがあるたびに、接続の都度、動的に httpから httpsへ変換させるため、システムへの負荷を多少なりとも増やしてしまうのもデメリットの一つ。

プラグインは、ワンタッチで有効化・無効化の切り替えが出来るが、そもそも一度 SSLを有効化した後に無効化することは無く、恒久的に SSL化するのであれば、自宅サーバーでプラグインを使うメリットはない。

以下、SSLを有効化したときの手順。

Apacheの事前準備およびファイアウォールの設定

httpから httpsによる通信へ変更するに当たり、Apacheの SSL受け入れ準備と、ufw(ファイアウォール)の設定を行う。
今回、SSLを有効にする webサーバーの仕様は次の通り。今こうしてご覧いただいている WEBサーバーである。

ドメイン rarak.jp
OS ubuntu 22.04.1 LTS
webサーバー Apache 2.4.52
ドキュメントルート /var/www/wordpress
CMS WordPress 6.0.1

Apacheの設定

WEBサーバーのデレクトリ構造

httpで接続していた時の設定を一部変更。
後々、こちらには、httpsへの 301リダイレクト設定が加えられる。(後述)

sudo nano /etc/apache2/sites-available/000-default.conf

<Virtualhost *80>
     ServerName rarak.jp
     DocumentRoot /var/www/wordpress
     ServerAdmin hoge@rarak.jp

     <Directory /var/www/wordpress>
         Options FollowSymLinks
         AllowOverride All
         Require all granted
     </Directory>
</Virtualhost>

#Ctrl+O、Ctrl+X で保存、nanoを終了

#apacheを再起動
sudo service apache2 restart
  • 104:サーバーネームを入力。www付きで設定している場合は、それも含める。
  • 105:ドキュメントルートの再確認。httpで動作しているのであれば設定変更なし。
  • 106:連絡用メールアドレス。WEBサーバーに不具合出た場合、ブラウザで表示される。
  • SSLサイト用の設定ファイルの書き換え。
    default-ssl.confを rarak.jp.confにリネームして、中身を修正。
    中身は、000-default.confと同一。

    #SSL有効化
    sudo a2enmod ssl
    sudo service apache2 reload
    
    #default-ssl.confを rarak.jp.confにリネーム
    sudo mv /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/rarak.jp.conf
    
    #SSLサイト設定
    sudo nano /etc/apache2/sites-available/rarak.jp.conf
    
    <Virtualhost _default_:443>
         ServerName rarak.jp
         DocumentRoot /var/www/wordpress
         ServerAdmin hoge@rarak.jp
    
         <Directory /var/www/wordpress>
             Options FollowSymLinks
             AllowOverride All
             Require all granted
         </Directory>
    </Virtualhost>
    
    #Ctrl+O、Ctrl+X で保存、nanoを終了
    
    #rarak.jp.confを有効化、apacheを再起動
    sudo a2ensite rarak.jp
    sudo service apache2 restart
    

    ufw(ファイアウォール)の設定

    通過させるのは、http(80)と https(443)
    自宅サーバーの場合、ルーターの設定変更(TCP 443番を通過させる)も必要なので忘れずに。

    #有効化
    sudo ufw enable
    
    #ufwの設定
    sudo ufw allow 80
    sudo ufw allow 443
    sudo ufw allow ’Apache Full’
    
    #ufw設定確認
    sudo ufw status
    状態:アクティブ
    
    To                 Action        From
    --                 ------        ----
    80                 ALLOW         Anywhere
    443                ALLOW         Anywhere
    Apache Full        ALLOW         Anywhere
    80(V6)             ALLOW         Anywhere
    443(V6)            ALLOW         Anywhere
    Apache Full(V6)    ALLOW         Anywhere
    

    ブラウザで [https://localhost]を開き、ページを表示('安全な接続ではありません'との警告表示されるがこれは正常な動作)してエラーが無いことを確認。

    Certbotのインストールと SSL証明書の取得

    Certbotの公式サイトに、OS毎(Debian、CentOSや Ubuntuなど)、WEBサーバー毎(Apacheや NginXなど)のインストール方法が詳細に記載されている。今回はその手順に従った。snap版である。

    #snapd のバージョンが最新であることを確認
    sudo snap install core
    sudo snap refresh core
    
    #Certbot をインストールする
    sudo snap install --classic certbot
    sudo ln -s /snap/bin/certbot /usr/bin/certbot
    
    #Certbotによる apacheのコントロールと証明書の取得
    sudo certbot --apache
    sudo certbot certonly --apache
    
    #メールアドレスを入力(ここではhoge@rarak.jpを入力している)
    Saving debug log to /var/log/letsencrypt/letsencrypt.log 
    Enter email address (used for urgent renewal and security notices) 
    -------------------------------------------------------------------------------
     (Enter 'c' to cancel):hoge@rarak.jp
    ---------------------------------
    
    #利用規約に同意(同意を選択)
    Please read the Terms of Service at 
    https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017-w-v1.3-notice.pdf. 
    You must agree in order to register with the ACME server. Do you agree?
    -------------------------------------------------------------------------------
    (Y)es/(N)o:Y
    ---------------------------------
    
    #メールアドレスへの案内送信の許可(ここでは不許可を選択)
    Would you be willing, once your first certificate is successfully issued, 
    to share your email address with the Electronic Frontier Foundation, 
    a founding partner of the Let's Encrypt project and the non-profit organization 
    that develops Certbot? We'd like to send you email about our work encrypting the web, 
    EFF news, campaigns, and ways to support digital freedom. 
    -------------------------------------------------------------------------------
    (Y)es/(N)o:N
    ---------------------------------
    
    #対象のドメインの選択
    Which names would you like to activate HTTPS for?
    -------------------------------------------------------------------------------
    1: rarak.jp
    -------------------------------------------------------------------------------
    Select the appropriate numbers separated by commas and/or spaces, or leave input
    blank to select all options shown (Enter 'c' to cancel): 1
    ---------------------------------
    
    # httpをhttps へリダイレクトするか(ここではリダイレクトするを選択)
    Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
    -------------------------------------------------------------------------------
    1: No redirect - Make no further changes to the webserver configuration.
    2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
    new sites, or if you're confident your site works on HTTPS. You can undo this
    change by editing your web server's configuration.
    -------------------------------------------------------------------------------
    Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
    ---------------------------------
    
    #設定完了のメッセージ
    Congratulations! You have successfully enabled https://rarak.jp
    
    You should test your configuration at:
    https://www.ssllabs.com/ssltest/analyze.html?d=rarak.jp
    ---------------------------------
    

    wordpress側のhttps対応設定

    wordpress一般設定サイトアドレス設定変更

    WordPress [設定]-[一般]にある「WordPress アドレス」と「サイトアドレス」を httpから httpsへ変更。

    動作確認

    2015年以前の SSL/TLSサーバ証明書の最長の有効期限は 5年だった。それがどんどん短くなり、2020年9月1日以降に発行されるSSL/TLSサーバ証明書の有効期間が398日間(約13ヶ月)が最長で、これを超えた状態で使用すると、ブラウザに期限切れのエラーが表示される。

    ドメインの管理者が証明書有効期限中に変わったとしても、証明書はそのまま有効で使えてしまう脆弱性を出来るだけ避けるための対策で、この考え方からすると、有効期限は短いほうがセキュリティ的には堅牢なものとなる。
    ただし、継続して使っていくには、更新作業の回数が増え、サーバー管理者の負担が増大する。

    証明書の自動更新は必須な機能なのだ。

    Let’s Encrypt®のSSL証明書は有効期限は3ヶ月。以前はこの更新作業に cronが用いられていた。今の cerbotには certbot.timerが新たに組み込まれ、更新作業を特別な設定をせずとも自動的に行ってくれるようになった。

    #自動更新設定の確認(twice daily=2回/日)
    sudo systemctl status certbot.timer
    
    ● certbot.timer - Run certbot twice daily
       Loaded: loaded (/lib/systemd/system/certbot.timer; enabled)
       Active: active (waiting) since Sun 2022-08-21 08:04:58 JST; 5min ago
      Trigger: Sun 2022-08-21 23:47:00 JST; 15h left
    
    8月 21 08:04:58 *** systemd[1]: Started Run certbot twice daily.
    

    証明書更新コマンド certbot renewを、テスト用の dry-runのオプションを付けて実行。テスト用なので証明書が実際にディスクに保存されることはない。

    #更新動作確認
    sudo certbot renew --dry-run
    
    Saving debug log to /var/log/letsencrypt/letsencrypt.log
    -------------------------------------------------------------------------------
    Processing /etc/letsencrypt/renewal/rarak.jp.conf
    -------------------------------------------------------------------------------
    Simulating renewal of an existing certificate for rarak.jp
    -------------------------------------------------------------------------------
    Congratulations, all simulated renewals succeeded: 
      /etc/letsencrypt/live/rarak.jp/fullchain.pem (success)
    -------------------------------------------------------------------------------
    

    その他 Let’s Encrypt®や certbotに関わる備忘録

    Certbotを使って、Let’s Encrypt®に接続完了後、後々、忘れそうなので自分用メモを残しておく。

    certbotを使った証明書発行手続きの際にhttpを https へリダイレクト設定を選択した時に書き加えられる箇所と内容(メモ)

    000-default.confに次の行(106~110行)が追記される。

    sudo nano /etc/apache2/sites-available/000-default.conf
    
    <VirtualHost *:80>
    ...
    ...
    RewriteEngine on
    RewriteCond %{SERVER_NAME} =rarak.jp
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
      #Redirect to HTTPS
      RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    </VirtualHost>
    

    Certbotを使ってLet’s Encryptに登録したE-mailアドレスを変更する方法(メモ)

    下記のコマンドで、登録したアドレスを hage@rarak.jpに変更できる。

    sudo certbot update_account --email hage@rarak.jp
    




    コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です