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

前書き

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

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

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

[。注意]##

Note:自己署名証明書は、サーバーとクライアント間の通信を暗号化します。 ただし、Webブラウザーに含まれる信頼できる認証局のいずれかによって署名されていないため、ユーザーは証明書を使用してサーバーのIDを自動的に検証することはできません。

サーバーにドメイン名が関連付けられていない場合や、暗号化されたWebインターフェースがユーザー向けではない場合には、自己署名証明書が適切な場合があります。 doにドメイン名がある場合、多くの場合、CA署名付き証明書を使用することをお勧めします。 Let’s Encryptプロジェクトhere
を使用して、無料の信頼できる証明書を設定する方法を確認できます。

前提条件

始める前に、sudo特権で構成された非rootユーザーが必要です。 initial server setup for Ubuntu 16.04をフォローすることで、このようなユーザーアカウントを設定する方法を学ぶことができます。

また、Apache Webサーバーをインストールする必要があります。 LAMP(Linux、Apache、MySQL、PHP)スタック全体をサーバーにインストールする場合は、setting up LAMP on Ubuntu 16.04に関するガイドに従うことができます。 Apache Webサーバーだけが必要な場合は、ガイドのPHPおよびMySQLに関する手順をスキップしてください。

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

ステップ1:SSL証明書を作成する

TLS/SSL works by using a combination of a public certificate and a private key. 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が必要です。 パスフレーズは、再起動のたびにパスフレーズを入力する必要があるため、これを防ぐことができます。

  • -days 365:このオプションは、証明書が有効であると見なされる時間の長さを設定します。 ここで1年間設定しました。

  • -newkey rsa:2048:これは、新しい証明書と新しいキーを同時に生成することを指定します。 前の手順で証明書に署名するために必要なキーを作成しなかったため、証明書と共に作成する必要があります。 rsa:2048部分は、2048ビット長のRSAキーを作成するように指示します。

  • -keyout:この行は、作成している生成された秘密鍵ファイルを配置する場所をOpenSSLに指示します。

  • -out:これは、作成する証明書を配置する場所をOpenSSLに指示します。

前述したように、これらのオプションはキーファイルと証明書の両方を作成します。 証明書に情報を正しく埋め込むために、サーバーに関するいくつかの質問があります。

プロンプトに適切に記入します。 The most important line is the one that requests the Common Name (e.g. server FQDN or YOUR name). You need to enter the domain name associated with your server or, more likely, your server’s public IP address.

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

OutputCountry Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:[email protected]_domain.com

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

OpenSSLを使用している間、クライアントとのPerfect Forward Secrecyのネゴシエーションで使用される強力なDiffie-Hellmanグループも作成する必要があります。

これを行うには、次のように入力します。

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

これには数分かかる場合がありますが、完了すると、構成で使用できる/etc/ssl/certs/dhparam.pemに強力なDHグループが作成されます。

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

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

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

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

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

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

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

強力な暗号化設定でApache構成スニペットを作成する

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

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

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

Apache SSLを安全にセットアップするために、Cipherli.stサイトのRemy van Elstによる推奨事項を使用します。 このサイトは、一般的なソフトウェアの使いやすい暗号化設定を提供するように設計されています。 Apacheの選択hereに関する彼の決定についてもっと読むことができます。

[。注意]##

上記にリンクされているサイトの推奨設定は、強力なセキュリティを提供します。 場合によっては、クライアントの互換性が高くなるという犠牲が伴います。 古いクライアントをサポートする必要がある場合は、「はい、レガシー/古いソフトウェアで動作する暗号スイートを教えてください」というラベルの付いたページのリンクをクリックしてアクセスできる代替リストがあります。そのリストはコピーされたアイテムの代わりに使用できます未満。

使用する構成の選択は、サポートする必要があるものに大きく依存します。 どちらも優れたセキュリティを提供します。

この目的のために、提供された設定全体をコピーできます。 2つの小さな変更を行うだけです。

以前に生成したDiffie-Hellmanファイルを指すようにSSLOpenSSLConfCmd DHParametersディレクティブを設定します。 また、HTTP Strict Transport Security, or HSTSについて、特に“preload” functionalityについてお読みください。 HSTSをプリロードするとセキュリティが向上しますが、誤って有効にしたり誤って有効にしたりすると、広範囲に及ぶ結果を招く可能性があります。 このガイドでは、設定をプリロードしませんが、その意味を理解していることが確実な場合は変更できます。

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

# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLSessionTickets Off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"

SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"

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

デフォルトの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


        
                ServerAdmin [email protected]

                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

                
                                SSLOptions +StdEnvVars
                
                
                                SSLOptions +StdEnvVars
                

                # BrowserMatch "MSIE [2-6]" \
                #               nokeepalive ssl-unclean-shutdown \
                #               downgrade-1.0 force-response-1.0

        

ファイルを少し調整します。 仮想ホストファイルで調整する通常の設定(ServerAdminメールアドレス、ServerNameなど)を設定し、証明書とキーファイルを指すようにSSLディレクティブを調整し、古いバージョンとの互換性を提供するセクションのコメントを外しますブラウザ。

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

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


        
                ServerAdmin [email protected]
                ServerName server_domain_or_IP

                DocumentRoot /var/www/html

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

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/apache-selfsigned.crt
                SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

                
                                SSLOptions +StdEnvVars
                
                
                                SSLOptions +StdEnvVars
                

                BrowserMatch "MSIE [2-6]" \
                               nokeepalive ssl-unclean-shutdown \
                               downgrade-1.0 force-response-1.0

        

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

現状では、サーバーは暗号化されていない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


        . . .

        Redirect "/" "https://your_domain_or_IP/"

        . . .

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

ステップ3:ファイアウォールを調整する

前提条件ガイドで推奨されているように、ufwファイアウォールを有効にしている場合は、SSLトラフィックを許可するように設定を調整する必要がある場合があります。 幸い、Apacheはインストール時にいくつかのプロファイルをufwに登録します。

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

sudo ufw app list

次のようなリストが表示されます。

OutputAvailable applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

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

sudo ufw status

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

OutputStatus: active

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

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

sudo ufw allow 'Apache Full'
sudo ufw delete allow 'Apache'

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

sudo ufw status
OutputStatus: active

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

ステップ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

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

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 restart apache2

ステップ5:暗号化をテストする

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

Webブラウザーを開き、https://に続けて、サーバーのドメイン名またはIPをアドレスバーに入力します。

https://server_domain_or_IP

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

Apache self-signed cert warning

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

Apache self-signed override

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

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

http://server_domain_or_IP

これが同じアイコンになる場合、これはリダイレクトが正しく機能したことを意味します。

ステップ6:永続的なリダイレクトへの変更

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

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

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

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

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


        . . .

        Redirect permanent "/" "https://your_domain_or_IP/"

        . . .

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

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

sudo apache2ctl configtest

準備ができたら、Apacheを再起動してリダイレクトを永続化します。

sudo systemctl restart apache2

結論

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

Related