Debian 9でApacheの自己署名SSL証明書を作成する方法

前書き

TLS、またはトランスポートレイヤーセキュリティ、およびその前身であるセキュアソケットレイヤーの_SSL_は、保護された暗号化されたラッパーで通常のトラフィックをラップするために使用されるWebプロトコルです。

このテクノロジーを使用すると、サーバーは、外部の第三者によってメッセージが傍受される可能性なしに、サーバーとクライアント間で安全にトラフィックを送信できます。 証明書システムは、ユーザーが接続先のサイトのIDを確認するのにも役立ちます。

このガイドでは、Debian 9のApache Webサーバーで使用する自己署名SSL証明書を設定する方法を示します。

前提条件

始める前に、 `+ sudo +`権限で設定された非rootユーザーが必要です。 Debian 9での初期サーバー設定に従って、このようなユーザーアカウントを設定する方法を学ぶことができます。

また、Apache Webサーバーをインストールする必要があります。 サーバーにLAMP(Linux、Apache、MariaDB、PHP)スタック全体をインストールする場合は、https://www.digitalocean.com/community/tutorials/how-to-install-linuxのガイドに従ってください。 -apache-mariadb-php-lamp-stack-debian9 [Debian 9でのLAMPのセットアップ]。 Apache Webサーバーだけが必要な場合は、PHPおよびMariaDBに関する手順をスキップしてください。

これらの前提条件を完了したら、以下に進みます。

ステップ1-SSL証明書の作成

TLS / SSLは、公開証明書と秘密キーの組み合わせを使用して機能します。 SSLキーはサーバー上で秘密にされます。 クライアントに送信されるコンテンツを暗号化するために使用されます。 SSL証明書は、コンテンツを要求するすべてのユーザーと公開共有されます。 関連するSSLキーで署名されたコンテンツを復号化するために使用できます。

単一のコマンドでOpenSSLを使用して自己署名キーと証明書のペアを作成できます。

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

一連の質問が表示されます。 それを説明する前に、発行しているコマンドで何が起こっているのか見てみましょう。

  • * 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」を要求する行です(例: サーバーのFQDNまたは自分の名前)+ `。 サーバーに関連付けられているドメイン名、またはサーバーのパブリックIPアドレスを入力する必要があります。

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

OutputCountry Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

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

ステップ2-SSLを使用するためのApacheの構成

`+ / etc / ssl +`ディレクトリの下にキーと証明書ファイルを作成しました。 これらを利用するために、Apache構成を変更するだけです。

構成をいくつか調整します。

  1. 構成スニペットを作成して、強力なデフォルトのSSL設定を指定します。

  2. 生成されたSSL証明書を指すように、含まれているSSL Apache仮想ホストファイルを変更します。

  3. (推奨)暗号化されていない仮想ホストファイルを変更して、要求を暗号化された仮想ホストに自動的にリダイレクトします。

終了したら、安全なSSL構成が必要です。

強力な暗号化設定を使用したApache構成スニペットの作成

最初に、Apache構成スニペットを作成して、いくつかのSSL設定を定義します。 これにより、Apacheに強力なSSL暗号スイートが設定され、サーバーのセキュリティを維持するのに役立ついくつかの高度な機能が有効になります。 設定するパラメーターは、SSLを有効にするすべての仮想ホストで使用できます。

`+ / etc / apache2 / conf-available `ディレクトリに新しいスニペットを作成します。 ファイルの目的を明確にするために、ファイルに「 ssl-params.conf +」という名前を付けます。

sudo nano /etc/apache2/conf-available/ssl-params.conf

Apache SSLを安全にセットアップするために、https://cipherli.st [Cipherli.st]サイトでRemy van Elstの推奨事項を使用します。 このサイトは、一般的なソフトウェアの使いやすい暗号化設定を提供するように設計されています。

この目的のために、提供された設定全体をコピーできます。 これに少し変更を加えて、 `+ Strict-Transport-Security +`ヘッダー(HSTS)を無効にします。

HSTSをプリロードするとセキュリティが向上しますが、誤って有効にした場合や誤って有効にした場合、広範囲に及ぶ結果になる可能性があります。 このガイドでは、設定を有効にしませんが、意味を理解していることが確実な場合は設定を変更できます。

決定する前に、https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security [HTTP Strict Transport Security、またはHSTS]、特にhttps://hstspreload.appspot.com/["preload 」機能]。

次の設定を、開いた `+ ssl-params.conf +`ファイルに貼り付けます:

/etc/apache2/conf-available/ssl-params.conf

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On


Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

完了したら、ファイルを保存して閉じます。

デフォルトのApache SSL仮想ホストファイルの変更

次に、デフォルトのApache SSL仮想ホストファイルである `+ / etc / apache2 / sites-available / default-ssl.conf +`を変更しましょう。 別のサーバーブロックファイルを使用している場合は、以下のコマンドでその名前を置き換えてください。

先に進む前に、元のSSL仮想ホストファイルをバックアップしましょう。

sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

次に、SSL仮想ホストファイルを開いて調整を行います。

sudo nano /etc/apache2/sites-available/default-ssl.conf

内部では、ほとんどのコメントが削除され、仮想ホストブロックはデフォルトで次のようになります。

/etc/apache2/sites-available/default-ssl.conf

<IfModule mod_ssl.c>
       <VirtualHost _default_:443>
               ServerAdmin webmaster@localhost

               DocumentRoot /var/www/html

               ErrorLog ${APACHE_LOG_DIR}/error.log
               CustomLog ${APACHE_LOG_DIR}/access.log combined

               SSLEngine on

               SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
               SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

               <FilesMatch "\.(cgi|shtml|phtml|php)$">
                               SSLOptions +StdEnvVars
               </FilesMatch>
               <Directory /usr/lib/cgi-bin>
                               SSLOptions +StdEnvVars
               </Directory>

       </VirtualHost>
</IfModule>

ファイルを少し調整します。 仮想ホストファイル(ServerAdminメールアドレス、ServerNameなど)で調整する通常の設定を行い、証明書とキーファイルを指すようにSSLディレクティブを調整します。 繰り返しますが、別のドキュメントルートを使用している場合は、必ず `+ DocumentRoot +`ディレクティブを更新してください。

これらの変更を行った後、サーバーブロックは次のようになります。

/etc/apache2/sites-available/default-ssl.conf

<IfModule mod_ssl.c>
       <VirtualHost _default_:443>
               ServerAdmin


               DocumentRoot /var/www/html

               ErrorLog ${APACHE_LOG_DIR}/error.log
               CustomLog ${APACHE_LOG_DIR}/access.log combined

               SSLEngine on

               SSLCertificateFile      /etc/ssl/certs/
               SSLCertificateKeyFile /etc/ssl/private/

               <FilesMatch "\.(cgi|shtml|phtml|php)$">
                               SSLOptions +StdEnvVars
               </FilesMatch>
               <Directory /usr/lib/cgi-bin>
                               SSLOptions +StdEnvVars
               </Directory>

       </VirtualHost>
</IfModule>

完了したら、ファイルを保存して閉じます。

(推奨)HTTPホストファイルを変更してHTTPSにリダイレクトする

現状では、サーバーは暗号化されていないHTTPトラフィックと暗号化されたHTTPSトラフィックの両方を提供します。 セキュリティを強化するために、ほとんどの場合、HTTPをHTTPSに自動的にリダイレクトすることをお勧めします。 この機能が必要ない場合は、このセクションを安全にスキップできます。

暗号化されていない仮想ホストファイルを調整してすべてのトラフィックをSSL暗号化にリダイレクトするには、 `+ / etc / apache2 / sites-available / 000-default.conf +`ファイルを開きます。

sudo nano /etc/apache2/sites-available/000-default.conf

内部で、 `+ VirtualHost `設定ブロック内で、 ` Redirect +`ディレクティブを追加し、すべてのトラフィックをSSLバージョンのサイトに向けます:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
       . . .

       Redirect "/" "https:///"

       . . .
</VirtualHost>

完了したら、ファイルを保存して閉じます。

これで、Apacheに必要な設定の変更はすべて完了です。 次に、サーバーへの暗号化されたHTTPSトラフィックを許可するために、「+ ufw +」でファイアウォールルールを更新する方法について説明します。

ステップ3-ファイアウォールの調整

前提条件のガイドで推奨されているように、「+ ufw 」ファイアウォールを有効にしている場合、SSLトラフィックを許可するように設定を調整する必要がある場合があります。 幸いなことに、Debian 9にインストールすると、 ` ufw +`には、ファイアウォール設定を調整するために使用できるアプリプロファイルがロードされます

次のように入力すると、使用可能なプロファイルを確認できます。

sudo ufw app list

このようなリストが表示され、出力の下部に次の4つのプロファイルが表示されます。

OutputAvailable applications:
. . .
 WWW
 WWW Cache
 WWW Full
 WWW Secure
. . .

次のように入力すると、現在の設定を確認できます。

sudo ufw status

以前に通常のHTTPトラフィックのみを許可した場合、出力は次のようになります。

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
WWW                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
WWW (v6)                   ALLOW       Anywhere (v6)

さらにHTTPSトラフィックを許可するには、「WWW Full」プロファイルを許可してから、冗長な「WWW」プロファイル許可を削除します。

sudo ufw allow 'WWW Full'
sudo ufw delete allow 'WWW'

ステータスは次のようになります。

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
WWW Full                   ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
WWW Full (v6)              ALLOW       Anywhere (v6)

HTTPSトラフィックを許可するようにファイアウォールを設定したら、次のステップに進み、いくつかのモジュールと設定ファイルを有効にしてSSLが適切に機能するようにする方法について説明します。

ステップ4-Apacheの変更を有効にする

変更を行い、ファイアウォールを調整したので、ApacheでSSLおよびヘッダーモジュールを有効にし、SSL対応仮想ホストを有効にしてから、Apacheを再起動してこれらの変更を有効にします。

+ a2enmod +`コマンドを使用して、SSLスニペットの一部の設定で必要な `+ mod_ssl +、Apache SSLモジュール、および `+ mod_headers +`を有効にします。

sudo a2enmod ssl
sudo a2enmod headers

次に、 `+ a2ensite +`コマンドでSSL仮想ホストを有効にします:

sudo a2ensite default-ssl

また、設定した値を読み込むには、 `+ ssl-params.conf +`ファイルを有効にする必要があります。

sudo a2enconf ssl-params

この時点で、サイトと必要なモジュールが有効になります。 ファイルに構文エラーがないことを確認する必要があります。 次のように入力してこれを行います。

sudo apache2ctl configtest

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

OutputSyntax OK

出力に `+ Syntax OK +`が含まれている限り、設定ファイルに構文エラーはなく、Apacheを安全に再起動して変更を実装できます。

sudo systemctl restart apache2

これで、自己署名SSL証明書がすべて設定されました。 これで、サーバーがトラフィックを正しく暗号化していることをテストできます。

ステップ5-暗号化のテスト

これで、SSLサーバーをテストする準備ができました。

ウェブブラウザを開き、アドレスバーに「+ https:// +」と入力してからサーバーのドメイン名またはIPを入力します。

https://

作成した証明書はブラウザの信頼できる認証局のいずれかによって署名されていないため、次のような恐ろしい警告が表示される可能性があります。

image:https://assets.digitalocean.com/articles/apache_ssl_1604/self_signed_warning.png [Apache自己署名証明書の警告]

これは予想される正常な動作です。 証明書の暗号化の側面のみに関心があり、ホストの信頼性の第三者検証には関心がありません。 * ADVANCED *をクリックし、提供されたリンクをクリックしてホストに進みます:

image:https://assets.digitalocean.com/articles/apache_ssl_1604/warning_override.png [Apache自己署名オーバーライド]

あなたのサイトに連れて行く必要があります。 ブラウザのアドレスバーを見ると、「x」が付いたロックまたは別の同様の「安全でない」通知が表示されます。 この場合、これは単に証明書を検証できないことを意味します。 接続を暗号化しています。

HTTPをHTTPSにリダイレクトするようにApacheを構成した場合、リダイレクトが正しく機能するかどうかも確認できます。

http://

これが同じアイコンになる場合、これはリダイレクトが正しく機能したことを意味します。 ただし、以前に作成したリダイレクトは一時的なリダイレクトにすぎません。 HTTPSへのリダイレクトを永続的にする場合は、最後の手順に進みます。

手順6-永続的なリダイレクトへの変更

リダイレクトが正常に機能し、暗号化されたトラフィックのみを許可したい場合は、暗号化されていないApache仮想ホストを再度変更して、リダイレクトを永続的にする必要があります。

サーバーブロック構成ファイルを再度開きます。

sudo nano /etc/apache2/sites-available/000-default.conf

前に追加した `+ Redirect `行を見つけます。 その行に「 permanent +」を追加すると、リダイレクトが302一時リダイレクトから301永続リダイレクトに変更されます。

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
       . . .

       Redirect  "/" "https:///"

       . . .
</VirtualHost>

ファイルを保存して閉じます。

構成に構文エラーがないか確認してください。

sudo apache2ctl configtest

このコマンドで構文エラーが報告されない場合は、Apacheを再起動します。

sudo systemctl restart apache2

これによりリダイレクトが永続的になり、サイトはHTTPS経由のトラフィックのみを処理します。

結論

クライアント接続に強力な暗号化を使用するようにApacheサーバーを構成しました。 これにより、リクエストを安全に処理できるようになり、外部の関係者がトラフィックを読み取れなくなります。

Related