序章

TLS 、または「トランスポート層セキュリティ」(およびその前身の SSL )は、保護された暗号化されたラッパーで通常のトラフィックをラップするために使用されるプロトコルです。 このテクノロジーを使用すると、サーバーは、メッセージが外部の第三者によって傍受されたり読み取られたりすることなく、クライアントに安全に情報を送信できます。

このガイドでは、Ubuntu20.04上のApacheWebサーバーで自己署名SSL証明書を作成して使用する方法を示します。

注:自己署名証明書は、サーバーとクライアント間の通信を暗号化します。 ただし、Webブラウザやオペレーティングシステムに含まれている信頼できる認証局によって署名されていないため、ユーザーは証明書を使用してサーバーのIDを自動的に検証することはできません。 その結果、ユーザーはサイトにアクセスしたときにセキュリティエラーが表示されます。

この制限のため、自己署名証明書は、一般にサービスを提供する実稼働環境には適していません。 これらは通常、テスト、または代替通信チャネルを介して証明書の有効性の信頼を確立できる単一のユーザーまたは少数のユーザーグループが使用する重要ではないサービスを保護するために使用されます。

より本番環境に対応した証明書ソリューションについては、無料の認証局である Let’sEncryptを確認してください。 Let’s Encrypt証明書をダウンロードして構成する方法については、 Ubuntu20.04チュートリアルでLet’sEncryptを使用してApacheを保護する方法をご覧ください。

前提条件

このチュートリアルを開始する前に、次のものが必要です。

  • root以外のsudo対応ユーザーによるUbuntu20.04サーバーへのアクセス。 Ubuntu 20.04を使用したサーバーの初期設定ガイドでは、このアカウントの作成方法を説明しています。

  • また、Apacheをインストールする必要があります。 aptを使用してApacheをインストールできます。 まず、ローカルパッケージインデックスを更新して、最新のアップストリームの変更を反映します。

    1. sudo apt update

    次に、apache2パッケージをインストールします。

    1. sudo apt install apache2

    最後に、ufwファイアウォールを設定している場合は、httpおよびhttpsポートを開きます。

    1. sudo ufw allow "Apache Full"

これらの手順が完了したら、 root 以外のユーザーとしてログインしていることを確認し、チュートリアルを続行してください。

手順1—mod_sslを有効にする

any SSL証明書を使用する前に、SSL暗号化のサポートを提供するApacheモジュールであるmod_sslを有効にする必要があります。

a2enmodコマンドでmod_sslを有効にします。

  1. sudo a2enmod ssl

Apacheを再起動して、モジュールをアクティブ化します。

  1. sudo systemctl restart apache2

これで、mod_sslモジュールが有効になり、使用できるようになります。

ステップ2–SSL証明書を作成する

Apacheで暗号化を使用する準備ができたので、新しいSSL証明書の生成に進むことができます。 証明書には、サイトに関するいくつかの基本情報が格納され、サーバーが暗号化されたデータを安全に処理できるようにするキーファイルが付属しています。

opensslコマンドを使用して、SSLキーと証明書ファイルを作成できます。

  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

コマンドを入力すると、Webサイトに関する情報を入力できるプロンプトが表示されます。 それを説明する前に、発行しているコマンドで何が起こっているかを見てみましょう。

  • openssl:これは、OpenSSL証明書、キー、およびその他のファイルを作成および管理するためのコマンドラインツールです。
  • req -x509:これは、X.509証明書署名要求(CSR)管理を使用することを指定します。 X.509は、SSLおよびTLSが鍵および証明書の管理に準拠する公開鍵インフラストラクチャ標準です。
  • -nodes:これは、パスフレーズで証明書を保護するオプションをスキップするようにOpenSSLに指示します。 サーバーの起動時に、ユーザーの介入なしにファイルを読み取れるようにするには、Apacheが必要です。 パスフレーズは、再起動するたびに入力する必要があるため、これが発生するのを防ぎます。
  • -days 365:このオプションは、証明書が有効であると見なされる時間の長さを設定します。 ここで1年間設定しました。 最近のブラウザの多くは、1年以上有効な証明書を拒否します。
  • -newkey rsa:2048:これは、新しい証明書と新しいキーを同時に生成することを指定します。 前の手順で証明書に署名するために必要なキーを作成しなかったため、証明書と一緒に作成する必要があります。 rsa:2048部分は、2048ビット長のRSAキーを作成するように指示します。
  • -keyout:この行は、作成している生成された秘密鍵ファイルを配置する場所をOpenSSLに指示します。
  • -out:これはOpenSSLに作成する証明書を配置する場所を指示します。

プロンプトに適切に記入します。 最も重要な行は、Common Nameを要求する行です。 サーバーへのアクセスに使用するホスト名、またはサーバーのパブリックIPのいずれかを入力する必要があります。 このフィールドは、サイトにアクセスするためにブラウザのアドレスバーに入力するものと一致することが重要です。一致しないと、セキュリティエラーが増えるためです。

プロンプトの完全なリストは次のようになります。

Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:Example
Locality Name (eg, city) [Default City]:Example 
Organization Name (eg, company) [Default Company Ltd]:Example Inc
Organizational Unit Name (eg, section) []:Example Dept
Common Name (eg, your name or your server's hostname) []:your_domain_or_ip
Email Address []:[email protected]

作成した両方のファイルは、/etc/sslの下の適切なサブディレクトリに配置されます。

次に、新しい証明書とキーを使用するようにApache構成を更新します。

ステップ3–SSLを使用するようにApacheを構成する

自己署名証明書とキーが利用可能になったので、それらを使用するためにApache構成を更新する必要があります。 Ubuntuでは、新しいApache構成ファイル(.confで終わる必要があります)を/etc/apache2/sites-available/に配置でき、次にApacheプロセスを再ロードまたは再起動したときにロードされます。

このチュートリアルでは、新しい最小構成ファイルを作成します。 (すでにApache <Virtualhost>をセットアップしていて、SSLを追加するだけでよい場合は、SSLで始まる構成行をコピーして、VirtualHost80から443へのポート。 次のステップでポート80を処理します。)

/ etc / apache2/sites-availableディレクトリにある新しいファイルを開きます。

  1. sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf

次の最小限のVirtualHost構成を貼り付けます。

/etc/apache2/sites-available/your_domain_or_ip.conf
<VirtualHost *:443>
   ServerName your_domain_or_ip
   DocumentRoot /var/www/your_domain_or_ip

   SSLEngine on
   SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
   SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
</VirtualHost>

ServerName行を、サーバーをアドレス指定する目的に更新してください。 これは、ホスト名、完全なドメイン名、またはIPアドレスにすることができます。 選択したものが、証明書を作成するときに選択したCommon Nameと一致することを確認してください。

残りの行は、ファイルを提供するDocumentRootディレクトリと、Apacheが新しく作成された証明書とキーを指すために必要なSSLオプションを指定します。

それでは、DocumentRootを作成し、テスト目的でHTMLファイルをその中に入れましょう。

  1. sudo mkdir /var/www/your_domain_or_ip

テキストエディタで新しいindex.htmlファイルを開きます。

  1. sudo nano /var/www/your_domain_or_ip/index.html

以下を空のファイルに貼り付けます。

/var/www/your_domain_or_ip/index.html
<h1>it worked!</h1>

もちろん、これは完全なHTMLファイルではありませんが、ブラウザーは寛大であり、構成を確認するのに十分です。

ファイルを保存して閉じます次に、a2ensiteツールを使用して構成ファイルを有効にする必要があります。

  1. sudo a2ensite your_domain_or_ip.conf

次に、構成エラーをテストしましょう。

  1. sudo apache2ctl configtest

すべてが成功すると、次のような結果が得られます。

Output
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message Syntax OK

最初の行は、ServerNameディレクティブがグローバルに設定されていないことを通知するメッセージです。 そのメッセージを削除したい場合は、ServerName/etc/apache2/apache2.confのサーバーのドメイン名またはIPアドレスに設定できます。 メッセージは害を及ぼさないため、これはオプションです。

出力にSyntax OKが含まれている場合、構成ファイルに構文エラーはありません。 Apacheを安全にリロードして、変更を実装できます。

  1. sudo systemctl reload apache2

次に、ブラウザにサイトをロードします。最初は必ずhttps://を使用してください。

エラーが表示されるはずです。 これは自己署名証明書では正常です。 ブラウザは、サーバーのIDを確認できないことを警告しています。これは、証明書が既知の認証局によって署名されていないためです。 テスト目的および個人的な使用の場合、これは問題ない場合があります。 詳細または詳細情報をクリックして、続行することを選択できるはずです。

そうすると、ブラウザはit worked!メッセージをロードします。

注:ブラウザがサーバーにまったく接続しない場合は、接続がファイアウォールによってブロックされていないことを確認してください。 ufwを使用している場合、次のコマンドはポート80および443を開きます。

  1. sudo ufw allow "Apache Full"

次に、別のVirtualHostセクションを構成に追加して、プレーンHTTPリクエストを処理し、HTTPSにリダイレクトします。

ステップ4—HTTPをHTTPSにリダイレクトする

現在、この構成はポート443でのHTTPS要求にのみ応答します。 すべてのトラフィックを強制的に暗号化する場合でも、ポート80でも応答することをお勧めします。 VirtualHostを設定して、これらの暗号化されていない要求に応答し、HTTPSにリダイレクトしてみましょう。

前の手順で開始したものと同じApache構成ファイルを開きます。

  1. sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf

下部に、別のVirtualHostブロックを作成して、ポート80の要求に一致させます。 ServerNameディレクティブを使用して、ドメイン名またはIPアドレスを再度照合します。 次に、Redirectを使用してすべてのリクエストを照合し、SSLVirtualHostに送信します。 末尾のスラッシュを必ず含めてください。

/etc/apache2/sites-available/your_domain_or_ip.conf
<VirtualHost *:80>
	ServerName your_domain_or_ip
	Redirect / https://your_domain_or_ip/
</VirtualHost>

終了したら、このファイルを保存して閉じ、構成構文を再度テストして、Apacheをリロードします。

  1. sudo apachectl configtest
  2. sudo systemctl reload apache2

アドレスの前にプレーンなhttp://を付けてサイトにアクセスすると、新しいリダイレクト機能をテストできます。 https://に自動的にリダイレクトされます。

結論

これで、自己署名SSL証明書を使用して暗号化されたリクエストを処理し、暗号化されていないHTTPリクエストをHTTPSにリダイレクトするようにApacheを設定しました。

公開WebサイトにSSLを使用することを計画している場合は、ドメイン名を購入し、 Let’sEncryptなどの広くサポートされている認証局を使用することを検討する必要があります。

Let’s EncryptをApacheで使用する方法の詳細については、 Ubuntu20.04でLet’sEncryptを使用してApacheを保護する方法のチュートリアルをお読みください。