2023年10月21日

Ubuntu20.04 Apache2(3)certbot_SSL(Let'sEncrypt)取得

宮島弥山535m,青い空と青い海,薄く煙る島々
宮島弥山535m,青い空と青い海,薄く煙る島々

 

さて,前回はApache2のVirtual Hostの設定までを行いましたが,最近のWeb表示は,SSLによる暗号化通信が主流になりつつあります。そこで,SSLの設定をApache2に加えていきます。

このSSL通信には,公式のSSL証明書と公開鍵暗号が必要になります。一般的には,利用中のサーバサービスプロバイダなどから有料で調達することが出来ます。1年間有効なドメイン認証であれば1~数千円程度,企業認証であれば1~3万円程度です。

それをApache2の「/etc/apache2/sites-availale」下にあるSSL定義ファイルに設定すれば完了です。無料のSSLもあるのですが,それらは有効期間が3ケ月程度になりますので,頻繁に更新処理を行う必要があります。

有料のSSL証明書は,購入してファイルをApache2内に設定するだけですので,今回は無料のSSL証明書と自動更新方法について学習してみたいと思います。

それでは,早速,始めましょう。


  Let's Encryptとは

Let’s Encryptは、90日間有効なDV(Domain Validation)SSL証明書を2つの認証方式(HTTP認証、DNS認証)で無料提供しています。暗号強度なども一般に販売されているSSL証明書とほとんど違いはありません。(アメリカの大手認証局(IdenTrust社)のルート証明書によってクロス署名されているため、IdenTrustの証明書を信頼しているほぼ全てのプラットフォームで使用できます。 )

Let’s Encryptは、米国の非営利団体であるISRG(Internet Security Research Group)により運営されており,Webサイトの暗号化を目指しています。現在ではメタやシスコシステムズ、Akamai Technologiesといった数多くの大手企業が支援しています。

Let’s EncryptのSSL証明書発行システムの大きな特徴は、ACME(Automated Certificate Management Environment)プロトコルと呼ばれるSSL証明書を自動発行する仕組みを利用している点です。認証してから数秒でSSL証明書が発行され、すぐにサーバーへデプロイできます。

管理者(root)権限のあるサーバーでLet's Encryptを利用する場合は、一般的にcertbotなどのアプリケーションが利用されます。更新スクリプトが定期的に実行されるように事前に設定すれば、無料SSL機能の自動更新が比較的簡単に実現できます。

  Let's EncryptのSSLサーバ証明書の取得

Ubuntuでは,Let's Encryptのサーバ証明書をインストール・管理するためのツールが用意されています。これを使うと楽なので,そのツールをインストールします。

まずは,ユーザのホームディレクリ「$」にログインして,次のコマンドを入力します。

コード

sudo apt install certbot

このツールを使って,「/var/www/domain_name」をドキュメントルートに持つdomain_name(ドメイン名)に対して,サーバ証明書を取得するコマンドを次のように入力します。

コード

sudo certbot certonly --webroot -w /var/www/domain_name -d domain_name -d www.domain_name --preferred-challenges http --agree-tos --dry-run


ここで,このサンプルコマンドの項目を説明します。

certonly
サブコマンドのひとつで、証明書の取得のみ行います。ちなみに何も書かない場合はデフォルトのrunで動作し、証明書の取得と同時にサーバソフトウェアへのインストールまで行います。今回は証明書の発行のみ行います。
--webrootオプション
ApacheなどWEBサーバのドキュメントルート下に認証用ファイルを生成します。ドキュメントルート下に動的にランダムな名前のファイル(例えば/var/www/domain_name/.well-known/acme-challenge/<ファイル名> とか)を配置。http://<ドメイン名>/.well-known/acme-challenge/<ファイル名>のリクエストを創出して,リターンが戻ってくることで認証します。但し,リバースプロキシ使っていると面倒になります。
-wオプション
webrootのディレクトリを指定。このドキュメントルートディレクトリ下にファイルを書き込みます。そのファイルをhttp(80)でアクセスするのでアクセスできる状態としておくこと。認証のためのドキュメントルートを指定するためのもので/var/www/htmlがデフォルトになっています。ここでは仮想ドメインの概念から利用するドメイン名を使って/var/www/ドメイン名とします。
-dオプション
認証するドメインを指定するためのものです。エイリアスがある場合は複数指定します。このオプションを繰り返すことでドメインとエイリアスに対応したサーバ証明書を1枚で済ませることができます。
--preferred-challenges http(dns)
ドメインの取得者を確認することになりますが,httpだとサーバ内にアクセスされることになり,dnsだとDNSサーバ内にcertbot認証局が指定したTXTを設定することになります。DNSだと認証に時間がかかるのでhttpだと手軽なのですが,httpではApacheサーバ内へ認証アクセスを受け入れることになるので,どちらを選択するかは設定者の意思になります。
--agree-tos
ACMEサーバのサブスクライバー契約に同意することになります.
--dry-run
「更新」または「証明書のみ」をテスト実行。証明書をディスクに保存しない。
-mオプション
"Email"として重要なアカウント通知のメールアドレスを指定。指定したメールアドレスに失効期限が近いことなどを通知してくれます。

サンプルコマンドは,ドメイン(domain_name)とエイリアス(www.domain_name)を一体運用している場合の例です。一番最初に指定したドメイン名で認証用フォルダ「/etc/letsencrypt/live/ドメイン名」が作られるはずですが,certbotによりエイリアスドメインになる事もありますので注意してください。
なお,異なるドメインに対しては,通常別のSSL証明書が必要となります。

  ACMEについて

Automated Certificate Management Environment (ACME) プロトコルは、利用者のWebサーバのおけるPKIX (X.509)形式公開鍵証明書の自動展開において,Webサーバと認証局との間の相互作用を自動化するための通信認証プロトコルです。

Let’s Encrypt サービスは、与えられたドメインを制御する権限があなたにあることを検証し証明書を発行するために、このACME プロトコルを使用しています。

  任意の認証用ドキュメントルートを利用したい場合

このACMEプロトコルはhttpによる認証方法であり,Apacheサーバ内のドキュメントルート下にCertbotが認証用ファイルを書き込むことになります。通常のドキュメントルートはユーザコンテンツを置く場所ですので,これが好ましくないと思われる場合には,認証用のドキュメントルートを別途作る必要があります。

例えば,認証用のドキュメントルートを「/var/www/certbot/domain_name」にする場合は,「/etc/apache2/sites-available/domain_name.conf」内に次のように追加します。

コード

ServerName domain_name
ServerAlias www.domain_name
ServerAdmin webmaster@localhost
DocumentRoot /var/www/domain_name

# for Let's Encrypt 追加
Alias /.well-known /var/www/certbot/domain_name/.well-known
<Directory /var/www/certbot/domain_name>
  Require all granted
</Directory>

追加したAliasディレクティブにより,認証用httpリクエストに/.well-known/*がある場合は,認証用ドキュメントルートを「/var/www/certbot/domain_name」にすることができます。「Require all granted」は,書き込み可能にすることを意味します。

【注意点1】
このAiliasディレクティブを有効にするには,「ailis_module」が稼動している必要があります。この確認には,次のコマンドで確認してください。

コード

sudo apachectl -M | grep -e 'alias'

「alias_module (shared)」と出力されれば起動しています。
起動していない場合は,次のコマンドを入力します。

コード

sudo a2enmod rewrite

実行後のOutputに「Enabling module rewrite.」が出ればOKです。最後にApache2を再起動して下さい。

コード

sudo systemctl restart apache2


認証用ドキュメントルートが変わったのでcertbotの認証コマンドは以下のようになります。

コード

sudo certbot certonly --webroot -w /var/www/certbot/domain_name -d domain_name -d www.domain_name --preferred-challenges http --agree-tos
 

この認証コマンドでは,認証ドメインルートを「/var/www/certbot/domain_name」に変更しています。テスト実行する場合には,--dry-runを加えて実行してください。

Outputは次のようになります。

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/domain_name/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/domain_name/privkey.pem
   Your cert will expire on 2024-01-18. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

「Congratulations!」と出力されれば,成功です。

【注意点2】
今回のcertbotコマンドは,ドメイン名が一つの場合を例に構成しました。しかし,時には他のドメインも含めてSSL証明したい場合(SAN仕様のマルチドメイン対応)があります。その場合は,コマンドを次のように変更してください。

コード

sudo certbot certonly --webroot -w /var/www/certbot/domain_name -d domain_name -d www.domain_name -w /var/www/certbot/domain2_name -d domain2_name -d www.domain2_name --preferred-challenges http --agree-tos

ここでは,domain_nameにdomain2_nameを含めて,マルチドメインでSSL証明書を作成しています。この場合,domain_nameと同様にdomain2_nameに対応する一通りのフォルダとファイルが必要になりますのでご注意ください。マルチドメイン対応SSL証明書は,一つのSSL証明書で複数のドメインに対応できるので便利です。



  SSL証明書の存在確認

SSL証明書は,/etc/letsencrypt/live/domain_name/以下に作成されます。

作成されるファイルは
· cert.pem…公開鍵を含むSSLサーバ証明書
· chain.pem…中間証明書
· fullchain.pem…cert.pemchain.pemが結合されたファイル
· privkey.pem…公開鍵に対応する秘密鍵

4種類で、SSL/TLSを有効化する際に必要となります。

  CERTBOTの稼働状態確認について

Let's Encrypt SSL 証明書は3ヶ月が期限です。以前は cron を使って自動で更新できるようにしていましたが,最新の certbot には自動更新の機能があります。最後にcertbotで実施したコマンドが記憶されるようです。特別何かを設定する必要はありませんが,時折,以下のコマンドを入力し,正しく動作しているか確認してみてください。

コード

sudo systemctl status certbot.timer

以下のように表示されればOKでしょう。

● certbot.timer - Run certbot twice daily

     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)

     Active: active (waiting) since Sat 2023-10-21 00:26:21 JST; 12h ago

    Trigger: Sat 2023-10-21 17:09:36 JST; 4h 36min left

   Triggers: ● certbot.service

1日2回ほど,チェックしているようです。

  まとめ

今回は,Apache2への「Let'sEncrypt」の取得方法について学習しました。これを使うと,ドメインへの通信はSSL化され暗号通信となります。次回は,Apache2へのSSLの設定方法について記述いたします。
これらに関するサイトは非常に多く,詳しくはインターネットをググって頂ければ良いです。ただ,Linuxは,Ubuntuと「その他」で違いがありますので十分ご注意下さい。

(注意)情報の正確性を期していますが,実施される場合には自己責任でお願いします。


0 件のコメント: