家庭内で検証用のWEBサーバを構築しており外部にも公開されていないので平文で暗号化せずに運用していましたが、やはり暗号化したほうが良いかなと思い自己証明書を利用したHTTPS環境を構築してみました。
自己署名証明書を利用してUbuntu上のApache WebサーバーでHTTPSを構成する方法は、特にテスト環境や内部ネットワークでの使用において非常に重要です。自己署名証明書は、正式な認証局(CA)から発行された証明書ではなく、自分自身で署名された証明書です。これにより、外部の認証を受けないため、通常のブラウザでは信頼されませんが、内部用途には十分なセキュリティを提供することが可能です。
基本的な前提条件と環境の準備
システムの準備
UbuntuサーバーにApacheがインストールされていることが前提となります。
まず、システムを最新の状態に更新し、Apacheと必要なSSL関連のパッケージをインストールします。
sudo apt update sudo apt upgrade -y sudo apt install apache2 openssl -y
このコマンドにより、Apache WebサーバーとOpenSSLライブラリがインストールされます。OpenSSLは、証明書の生成や管理に使用される広く採用されているツールです。
SSLディレクトリの作成
次に、SSL関連ファイルを格納するディレクトリを作成します。このディレクトリには、秘密鍵や証明書が保存されます。
sudo mkdir /etc/ssl/private sudo chmod 700 /etc/ssl/private
'/etc/ssl/private
‘ディレクトリには、証明書の秘密鍵を格納します。このディレクトリには厳重なアクセス制御を設定し、ルートユーザーのみがアクセスできるようにします。
自己署名証明書の作成
秘密鍵と証明書の生成
自己署名証明書を生成するために、まず秘密鍵を生成し、その秘密鍵を使って証明書を作成します。以下のコマンドを実行します。
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
ここで使用される各オプションについて説明します。
-x509
: X.509形式の証明書を生成するオプションです。X.509はSSL/TLSで広く使われる証明書の標準形式です。-nodes
: 証明書にパスフレーズを設定しないオプションです。これにより、Apacheが自動的に証明書をロードできるようになります。通常、サーバー起動時にパスフレーズを求められると自動化が難しくなるため、特に自己署名証明書ではパスフレーズを省略するのが一般的です。-days 365
: 証明書の有効期限を365日に設定します。これは自己署名証明書の有効期間であり、1年後に再生成する必要があります。-newkey rsa:2048
: 新しい2048ビットのRSA鍵を生成します。これは現在標準的な鍵サイズであり、十分なセキュリティを提供します。-keyout
: 生成した秘密鍵の保存場所を指定します。-out
: 生成した証明書の保存場所を指定します。
コマンドを実行すると、国名、州名、都市名、組織名、コモンネーム(FQDN)、電子メールアドレスなどを尋ねるプロンプトが表示されます。コモンネームには、サーバーの完全修飾ドメイン名(FQDN)を入力します。例えば、内部サーバーの場合は server.example.com
などを指定します。
証明書の確認
生成された秘密鍵と証明書は、指定したディレクトリに保存されます。これらが正しく生成されているか確認するには、以下のコマンドを使用します。
sudo ls -l /etc/ssl/private/apache-selfsigned.key sudo ls -l /etc/ssl/certs/apache-selfsigned.crt
これにより、ファイルが正しく生成され、所定の場所に存在することを確認できます。
Apacheの設定
ApacheのSSLモジュールを有効化
ApacheがSSLをサポートするためには、mod_ssl
モジュールを有効にする必要があります。このモジュールはSSL/TLS接続を処理するためのApacheモジュールです。
sudo a2enmod ssl
モジュールを有効にした後、Apacheを再起動して変更を適用します。
sudo systemctl restart apache2
仮想ホストの設定
次に、自己署名証明書を利用してSSL/TLS接続を確立するための仮想ホストを設定します。通常、デフォルトのSSL設定ファイルは /etc/apache2/sites-available/default-ssl.conf
にありますが、これを編集するか、新たに作成します。
sudo nano /etc/apache2/sites-available/default-ssl.conf
このファイルの中に、以下の内容を追加または編集します。
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin webmaster@localhost ServerName yourdomain.com DocumentRoot /var/www/html SSLEngine on SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> </IfModule>
この設定ファイルの主要なセクションを解説します。
<VirtualHost _default_:443>
: ポート443でのデフォルト仮想ホストを定義しています。443はHTTPSのデフォルトポートです。ServerAdmin
: サイト管理者のメールアドレスを指定します。ServerName
: サーバーのFQDNを指定します。自己署名証明書を作成するときに指定したものと一致させる必要があります。DocumentRoot
: ウェブサイトのルートディレクトリを指定します。SSLEngine on
: SSLエンジンを有効にします。これにより、この仮想ホストでSSL/TLSが使用されるようになります。SSLCertificateFile
: SSL証明書のパスを指定します。ここには、先ほど生成した自己署名証明書のパスを指定します。SSLCertificateKeyFile
: SSL証明書の秘密鍵のパスを指定します。
設定ファイルを保存したら、仮想ホストを有効にします。
sudo a2ensite default-ssl
これで、Apacheは自己署名証明書を使用してHTTPS接続を提供する準備が整いました。
証明書のインストールとブラウザでのテスト
ブラウザでの警告
自己署名証明書を使用する場合、ブラウザはその証明書を信頼しないため、サイトにアクセスするとセキュリティ警告が表示されます。この警告は、ユーザーが証明書の信頼性を確認できないためです。しかし、内部ネットワークやテスト環境では、この警告を無視して接続を続行することができます。
証明書のインポート(オプション)
内部ネットワークで使用する場合やテスト環境で頻繁にアクセスする場合は、自己署名証明書をブラウザやオペレーティングシステムにインポートして信頼済み証明書として登録することができます。これにより、警告が表示されなくなります。
HTTPからHTTPSへのリダイレクト設定(オプション)
自己署名証明書を使用する場合でも、すべてのHTTPトラフィックをHTTPSにリダイレクトすることをお勧めします。これにより、ユーザーがHTTPで接続した場合でも自動的に安全なHTTPSに切り替わります。
sudo nano /etc/apache2/sites-available/000-default.conf
このファイルに以下のリダイレクトルールを追加します。
<VirtualHost *:80> ServerName yourdomain.com Redirect permanent / https://yourdomain.com/ </VirtualHost>
設定を保存したら、Apacheを再起動して変更を適用します。
sudo systemctl restart apache2
定期的なメンテナンスと再生成
自己署名証明書は通常、1年(365日)の有効期間を持ちます。この期間が過ぎると、証明書は無効になり、新しい証明書を再生成する必要があります。以下のコマンドを再実行して新しい証明書を生成し、既存の証明書を置き換えます。
参考までに外部公開向けに無料で証明書を発行ができるLet’s Encryptというサービスがありますが、有効期限は90日です。ほかの商用サービスでは1年単位です。
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
再生成後、Apacheを再起動して新しい証明書を適用します。
最後に
自己署名証明書を利用してUbuntu上のApacheでHTTPSを構成は、内部用途やテスト環境でのセキュリティを強化するための実用的な手段です。この設定により、暗号化された接続が確立され、データの盗聴や改ざんのリスクを軽減できます。ただし、自己署名証明書は外部公開のウェブサイトには適していないため、正式な運用環境では信頼できる認証局から発行された証明書を使用することを推奨します。