Ubuntu16.04でApacheの自己署名SSL証明書を作成する方法
序章
TLS 、つまりトランスポート層セキュリティ、およびその前身である SSL は、セキュアソケットレイヤーの略で、通常のトラフィックを保護された暗号化ラッパーでラップするために使用されるWebプロトコルです。
このテクノロジーを使用すると、サーバーは、メッセージが外部の関係者によって傍受される可能性なしに、サーバーとクライアントの間でトラフィックを安全に送信できます。 証明書システムは、ユーザーが接続しているサイトのIDを確認するのにも役立ちます。
このガイドでは、Ubuntu16.04サーバー上のApacheWebサーバーで使用するための自己署名SSL証明書を設定する方法を学習します。
注:自己署名証明書は、サーバーとクライアント間の通信を暗号化します。 ただし、Webブラウザやオペレーティングシステムに含まれている信頼できる認証局によって署名されていないため、ユーザーは証明書を使用してサーバーのIDを自動的に検証することはできません。 その結果、ユーザーはサイトにアクセスしたときにセキュリティエラーが表示されます。
この制限のため、自己署名証明書は、一般にサービスを提供する実稼働環境には適していません。 これらは通常、テスト、または代替通信チャネルを介して証明書の有効性の信頼を確立できる単一のユーザーまたは少数のユーザーグループが使用する重要ではないサービスを保護するために使用されます。
より本番環境に対応した証明書ソリューションについては、無料の認証局である Let’sEncryptを確認してください。 Let’s Encrypt証明書をダウンロードして構成する方法については、 Ubuntu16.04チュートリアルでLet’sEncryptを使用してApacheを保護する方法をご覧ください。
前提条件
このチュートリアルを開始する前に、次のものが必要です。
-
root以外のsudo対応ユーザーによるUbuntu16.04サーバーへのアクセス。 Ubuntu 16.04を使用したサーバーの初期設定ガイドでは、このアカウントの作成方法を説明しています。
-
また、Apacheをインストールする必要があります。
apt
を使用してApacheをインストールできます。 まず、ローカルパッケージインデックスを更新して、最新のアップストリームの変更を反映します。- sudo apt update
次に、
apache2
パッケージをインストールします。- sudo apt install apache2
最後に、
ufw
ファイアウォールを設定している場合は、http
およびhttps
ポートを開きます。- sudo ufw allow "Apache Full"
これらの手順が完了したら、 root 以外のユーザーとしてログインしていることを確認し、チュートリアルを続行してください。
手順1—mod_ssl
を有効にする
any SSL証明書を使用する前に、SSL暗号化のサポートを提供するApacheモジュールであるmod_ssl
を有効にする必要があります。
a2enmod
コマンドでmod_ssl
を有効にします。
- sudo a2enmod ssl
Apacheを再起動して、モジュールをアクティブ化します。
- sudo systemctl restart apache2
これで、mod_ssl
モジュールが有効になり、使用できるようになります。
ステップ2—SSL証明書を作成する
Apacheで暗号化を使用する準備ができたので、新しいSSL証明書の生成に進むことができます。 証明書には、サイトに関するいくつかの基本情報が格納され、サーバーが暗号化されたデータを安全に処理できるようにするキーファイルが付属しています。
openssl
コマンドを使用して、SSLキーと証明書ファイルを作成できます。
- 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 :このサブコマンドは、X.509証明書署名要求(CSR)管理を使用することを指定します。 「X.509」は、SSLおよびTLSが鍵および証明書の管理のために準拠している公開鍵インフラストラクチャ標準です。 新しいX.509証明書を作成したいので、このサブコマンドを使用しています。
- -x509 :これは、通常行われるように証明書署名要求を生成するのではなく、自己署名証明書を作成することをユーティリティに通知することにより、前のサブコマンドをさらに変更します。
- -nodes :これは、パスフレーズで証明書を保護するオプションをスキップするようにOpenSSLに指示します。 サーバーの起動時に、ユーザーの介入なしにファイルを読み取れるようにするには、Apacheが必要です。 パスフレーズは、再起動するたびに入力する必要があるため、これが発生するのを防ぎます。
- -365日:このオプションは、証明書が有効であると見なされる期間を設定します。 ここで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
ディレクトリの適切なサブディレクトリに配置されます。
ステップ3—SSLを使用するようにApacheを設定する
自己署名証明書とキーが利用可能になったので、それらを使用するためにApache構成を更新する必要があります。 Ubuntuでは、新しいApache構成ファイル(.conf
で終わる必要があります)を/etc/apache2/sites-available/
に配置でき、次にApacheプロセスを再ロードまたは再起動したときにロードされます。
このチュートリアルでは、新しい最小構成ファイルを作成します。 (すでにApache <Virtualhost>
をセットアップしていて、SSLを追加するだけでよい場合は、SSL
で始まる構成行をコピーして、VirtualHost
80
から443
へのポート。 次のステップでポート80
を処理します。)
/ etc / apache2/sites-availableディレクトリにある新しいファイルを開きます。
- sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf
次の最小限のVirtualHost構成を貼り付けます。
<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ファイルをその中に入れましょう。
- sudo mkdir /var/www/your_domain_or_ip
テキストエディタで新しいindex.html
ファイルを開きます。
- sudo nano /var/www/your_domain_or_ip/index.html
以下を空のファイルに貼り付けます。
<h1>it worked!</h1>
もちろん、これは完全なHTMLファイルではありませんが、ブラウザーは寛大であり、構成を確認するのに十分です。
ファイルを保存して閉じます次に、a2ensite
ツールを使用して構成ファイルを有効にする必要があります。
- sudo a2ensite your_domain_or_ip.conf
Apacheを再起動して構成をアクティブ化するように求められますが、最初に、構成エラーをテストしてみましょう。
- sudo apache2ctl configtest
すべてが成功すると、次のような結果が得られます。
OutputAH00558: 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を安全にリロードして、変更を実装できます。
- sudo systemctl reload apache2
次に、ブラウザにサイトをロードします。最初は必ずhttps://
を使用してください。
エラーが表示されるはずです。 これは自己署名証明書では正常です。 ブラウザは、サーバーのIDを確認できないことを警告しています。これは、証明書が既知の認証局によって署名されていないためです。 テスト目的および個人的な使用の場合、これは問題ない場合があります。 詳細または詳細情報をクリックして、続行することを選択できるはずです。
そうすると、ブラウザはit worked!
メッセージをロードします。
注:ブラウザがサーバーにまったく接続しない場合は、接続がファイアウォールによってブロックされていないことを確認してください。 ufw
を使用している場合、次のコマンドはポート80
および443
を開きます。
- sudo ufw allow "Apache Full"
次に、別のVirtualHost
セクションを構成に追加して、プレーンHTTPリクエストを処理し、HTTPSにリダイレクトします。
ステップ4—HTTPをHTTPSにリダイレクトする
現在、この構成はポート443
でのHTTPS要求にのみ応答します。 すべてのトラフィックを強制的に暗号化する場合でも、ポート80
でも応答することをお勧めします。 VirtualHost
を設定して、これらの暗号化されていない要求に応答し、HTTPSにリダイレクトしてみましょう。
前の手順で開始したものと同じApache構成ファイルを開きます。
- sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf
下部に、別のVirtualHost
ブロックを作成して、ポート80
の要求に一致させます。 ServerName
ディレクティブを使用して、ドメイン名またはIPアドレスを再度照合します。 次に、Redirect
を使用してすべてのリクエストを照合し、SSLVirtualHost
に送信します。 末尾のスラッシュを必ず含めてください。
<VirtualHost *:80>
ServerName your_domain_or_ip
Redirect / https://your_domain_or_ip/
</VirtualHost>
終了したら、このファイルを保存して閉じ、構成構文を再度テストして、Apacheをリロードします。
- sudo apachectl configtest
- sudo systemctl reload apache2
アドレスの前にプレーンなhttp://
を付けてサイトにアクセスすると、新しいリダイレクト機能をテストできます。 https://
に自動的にリダイレクトされます。
結論
これで、自己署名SSL証明書を使用して暗号化されたリクエストを処理し、暗号化されていないHTTPリクエストをHTTPSにリダイレクトするようにApacheを設定しました。
公開WebサイトにSSLを使用することを計画している場合は、ドメイン名を購入し、 Let’sEncryptなどの広くサポートされている認証局を使用することを検討する必要があります。
Let’s EncryptをApacheで使用する方法の詳細については、 Ubuntu16.04でLet’sEncryptを使用してApacheを保護する方法チュートリアルをお読みください。