宮島弥山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"として重要なアカウント通知のメールアドレスを指定。指定したメールアドレスに失効期限が近いことなどを通知してくれます。 |
ACMEについて
Automated Certificate Management Environment (ACME) プロトコルは、利用者のWebサーバのおけるPKIX (X.509)形式公開鍵証明書の自動展開において,Webサーバと認証局との間の相互作用を自動化するための通信認証プロトコルです。
Let’s Encrypt サービスは、与えられたドメインを制御する権限があなたにあることを検証し証明書を発行するために、このACME プロトコルを使用しています。
任意の認証用ドキュメントルートを利用したい場合
このACMEプロトコルはhttpによる認証方法であり,Apacheサーバ内のドキュメントルート下にCertbotが認証用ファイルを書き込むことになります。通常のドキュメントルートはユーザコンテンツを置く場所ですので,これが好ましくないと思われる場合には,認証用のドキュメントルートを別途作る必要があります。
コード
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>
このAiliasディレクティブを有効にするには,「ailis_module」が稼動している必要があります。この確認には,次のコマンドで確認してください。
コード
「alias_module (shared)」と出力されれば起動しています。
起動していない場合は,次のコマンドを入力します。
コード
実行後のOutputに「Enabling module rewrite.」が出ればOKです。最後に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を加えて実行してください。
今回のcertbotコマンドは,ドメイン名が一つの場合を例に構成しました。しかし,時には他のドメインも含めてSSL証明したい場合(SAN仕様のマルチドメイン対応)があります。その場合は,コマンドを次のように変更してください。
コード
ここでは,domain_nameにdomain2_nameを含めて,マルチドメインでSSL証明書を作成しています。この場合,domain_nameと同様にdomain2_nameに対応する一通りのフォルダとファイルが必要になりますのでご注意ください。マルチドメイン対応SSL証明書は,一つのSSL証明書で複数のドメインに対応できるので便利です。
|
SSL証明書は,/etc/letsencrypt/live/domain_name/以下に作成されます。
· cert.pem…公開鍵を含むSSLサーバ証明書
· chain.pem…中間証明書
· fullchain.pem…cert.pemとchain.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
(注意)情報の正確性を期していますが,実施される場合には自己責任でお願いします。
0 件のコメント:
コメントを投稿