Ubuntu16.04でApacheの自己署名SSL証明書を作成する方法
はじめに
TLS、またはtransport layer security、およびその前身であるSSLは、secure sockets layerの略で、保護された暗号化されたラッパーで通常のトラフィックをラップするために使用されるwebプロトコルです。
この技術を使用すると、サーバーは外部の関係者によってメッセージが傍受される可能性なしに、サーバーとクライアントの間で安全にトラフィックを送 また、証明書システムは、ユーザーが接続しているサイトのidを確認するのにも役立ちます。このガイドでは、Ubuntu16.04サーバー上のApache webサーバーで使用する自己署名SSL証明書を設定する方法を説明します。
注:自己署名証明書は、サーバーとクライアント間の通信を暗号化します。 ただし、webブラウザーに含まれる信頼できる認証局によって署名されていないため、ユーザーは証明書を使用してサーバーのidを自動的に検証することはで
自己署名証明書は、サーバーにドメイン名が関連付けられていない場合や、暗号化されたwebインターフェイスがユーザーに対応していない場合に適してい ドメイン名がある場合は、多くの場合、CA署名付き証明書を使用することをお勧めします。 Let’s Encryptプロジェクトで無料の信頼できる証明書をセットアップする方法は、こちらをご覧ください。始める前に、sudo
権限を持つ非rootユーザーを設定しておく必要があります。
前提条件
始める前に、sudo
権限を持つ非rootユーザーを設定しておく必要があります。
Ubuntu16.04の初期サーバー設定に従って、このようなユーザーアカウントを設定する方法を学ぶことができます。
また、Apache webサーバーをインストールする必要があります。 サーバーにLAMP(Linux、Apache、MySQL、PHP)スタック全体をインストールする場合は、Ubuntu16.04でLAMPを設定するガイドに従うことができます。 Apache webサーバーだけが必要な場合は、ガイドのPHPとMySQLに関する手順をスキップしてください。
前提条件が完了したら、以下の手順に進みます。
ステップ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日目: このオプションは、証明書が有効であると見なされる時間を設定します。 私たちはここで一年間それを設定しました。
- -newkey rsa:2048:これは、新しい証明書と新しいキーを同時に生成することを指定します。 前の手順で証明書に署名するために必要なキーを作成しなかったため、証明書と一緒に作成する必要があります。 4442>部分は、2048ビット長のRSAキーを作成するように指示します。
- -keyout:この行は、作成中の生成された秘密鍵ファイルをどこに配置するかをOpenSSLに指示します。
- -アウト: これにより、作成している証明書をどこに配置するかがOpenSSLに指示されます。
上記のように、これらのオプションはキーファイルと証明書の両方を作成します。 証明書に情報を正しく埋め込むために、サーバーに関するいくつかの質問があります。
プロンプトを適切に記入してください。 最も重要な行は、Common Name (e.g. server FQDN or YOUR name)
を要求する行です。 サーバーに関連付けられているドメイン名、またはサーバーのパブリックIPアドレスを入力する必要があります。
プロンプト全体は次のようになります:
OutputCountry Name (2 letter code) :USState or Province Name (full name) :New YorkLocality Name (eg, city) :New York CityOrganization Name (eg, company) :Bouncy Castles, Inc.Organizational Unit Name (eg, section) :Ministry of Water SlidesCommon Name (e.g. server FQDN or YOUR name) :server_IP_addressEmail Address :admin@your_domain.com
作成した両方のファイルは、/etc/ssl
ディレクトリの適切なサブディレクトリに配置されます。
OpenSSLを使用している間は、クライアントとの完全転送秘密の交渉に使用される強力なDiffie-Hellmanグループも作成する必要があります。
これを行うには、次のように入力します:
- sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
これには数分かかる場合がありますが、完了すると、構成で使用できる/etc/ssl/certs/dhparam.pem
に強力なDHグループがあります。
ステップ2:SSLを使用するようにApacheを設定
私たちは、/etc/ssl
ディレクトリの下に私たちの鍵と証明書ファイルを作成しました。 次に、これらを利用するためにApacheの設定を変更するだけです。
私たちは、私たちの構成にいくつかの調整を行います:
- 私たちは、強力なデフォルトのSSL設定を指定するための構成スニペットを作成します。
- 生成されたSSL証明書を指すように、含まれているSSL Apache仮想ホストファイルを変更します。
- (推奨)暗号化されていない仮想ホストファイルを変更して、要求を暗号化された仮想ホストに自動的にリダイレクトします。
終了したら、安全な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を安全にセットアップするために、Remy van Elstによる推奨事項を使用します。Cipherli.st サイト。 このサイトは、一般的なソフトウェアのための使いやすい暗号化設定を提供するように設計されています。 Apacheの選択に関する彼の決定についての詳細はこちらをご覧ください。
上記にリンクされているサイトの推奨設定は、強力なセキュリティを提供します。 時には、これはより大きなクライアントの互換性を犠牲にして来ます。 古いクライアントをサポートする必要がある場合は、”はい、レガシー/古いソフトウェアで動作するciphersuiteを提供してください”というラベルの付いたページのリンクをクリックすることでアクセスできる代替リストがあります。”そのリストは、以下のコピーされた項目の代わりにすることができます。
使用する設定の選択は、サポートする必要があるものに大きく依存します。 彼らは両方とも偉大なセキュリティを提供します。
私たちの目的のために、提供された設定全体をコピーすることができます。 私たちはちょうど二つの小さな変更を行います。
前に生成したDiffie-Hellmanファイルを指すようにSSLOpenSSLConfCmd DHParameters
ディレクティブを設定します。 また、HTTP Strict Transport Security、またはHSTS、特に「プリロード」機能についてもお読みください。 HSTSをプリロードすると、セキュリティが向上しますが、誤って有効にしたり、誤って有効にしたりすると、遠大な結果にな このガイドでは、設定をプリロードすることはありませんが、
# from https://cipherli.st/# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.htmlSSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDHSSLProtocol All -SSLv2 -SSLv3SSLHonorCipherOrder 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 DENYHeader always set X-Content-Type-Options nosniff# Requires Apache >= 2.4SSLCompression off SSLSessionTickets OffSSLUseStapling 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
内部では、ほとんどのコメントが削除されているため、仮想ホストファイルはデフォルトでは
<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> # BrowserMatch "MSIE " \ # nokeepalive ssl-unclean-shutdown \ # downgrade-1.0 force-response-1.0 </VirtualHost></IfModule>
ファイルを少し調整します。 調整したい通常のものを仮想ホストファイル(ServerAdminのメールアドレス、ServerNameなど)に設定します。)、証明書とキーファイルを指すようにSSLディレクティブを調整し、古いブラウザとの互換性を提供するセクションのコメントを解除します。
これらの変更を行った後、サーバーブロックは次のようになります。
<IfModule mod_ssl.c> <VirtualHost _default_:443> 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 <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE " \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 </VirtualHost></IfModule>
終了したらファイルを保存して閉じます。
(推奨)暗号化されていない仮想ホストファイルを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バージョン
<VirtualHost *:80> . . . Redirect "/" "https://your_domain_or_IP/" . . .</VirtualHost>
終了したらファイルを保存して閉じます。
ステップ3:ファイアウォールの調整
前提条件ガイドで推奨されているように、ufw
ファイアウォールを有効にしている場合は、SSLトラフィックを許可するように設定を調整する必要がある場合があります。 幸いなことに、Apacheはインストール時にufw
でいくつかのプロファイルを登録します。
次のように入力すると、利用可能なプロファイルが表示されます:
- sudo ufw app list
次のようなリストが表示されます:
OutputAvailable applications: Apache Apache Full Apache Secure OpenSSH
現在の設定を確認するには、次のように入力します:
- sudo ufw status
以前に通常のHTTPトラフィックのみを許可した場合、出力は次のようになります:
OutputStatus: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache ALLOW AnywhereOpenSSH (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: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache Full ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Apache Full (v6) ALLOW Anywhere (v6)
ステップ4: Apacheでの変更を有効にする
変更とファイアウォールの調整が完了したので、ApacheでSSLとheadersモジュールを有効にし、SSL対応の仮想ホストを有効にして、Apacheを再起動することができます。
SSLスニペットの設定の一部で必要とされるmod_ssl
、Apache SSLモジュール、およびmod_headers
を有効にするには、a2enmod
コマンドを使用します:
- 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 messageSyntax OK
最初の行は、ServerName
ディレクティブがグローバルに設定されていないことを伝えるメッセージです。 そのメッセージを削除したい場合は、ServerName
を/etc/apache2/apache2.conf
のサーバーのドメイン名またはIPアドレスに設定できます。 メッセージは害を及ぼさないため、これはオプションです。
出力にSyntax OK
が含まれている場合、設定ファイルに構文エラーはありません。 変更を実装するためにApacheを安全に再起動できます:
- sudo systemctl restart apache2
ステップ5:暗号化のテスト
これで、SSLサーバーをテストする準備が整いました。
ウェブブラウザを開き、アドレスバーにhttps://
と入力し、その後にサーバーのドメイン名またはIPを入力します:
https://server_domain_or_IP
作成した証明書は、ブラウザの信頼できる認証局のいずれかによって署名されていないため、以下のような恐ろしい警告が表示される可能性があ:
これは予想され、正常です。 私たちは、証明書の暗号化の側面にのみ関心があり、ホストの信頼性の第三者の検証には関心がありません。 「詳細設定」をクリックしてから、提供されたリンクをクリックして、ホストに進みます:
あなたはあなたのサイトに連れて行かれるべきです。 ブラウザのアドレスバーを見ると、その上に”x”が付いたロックが表示されます。 この場合、これは証明書を検証できないことを意味します。 それはまだあなたの接続を暗号化しています。
HttpをHTTPSにリダイレクトするようにApacheを設定した場合、リダイレクトが正しく機能するかどうかを確認することもできます:
http://server_domain_or_IP
この結果、同じアイコンが表示される場合は、リダイレクトが正しく機能したことを意味します。
ステップ6:永続的なリダイレクトへの変更
リダイレクトが正常に機能し、暗号化されたトラフィックのみを許可したい場合は、暗号化されていないApache仮想ホストを再度変更して、リダイレクトを永続的にする必要があります。
サーバーブロック設定ファイルを再度開きます:
- sudo nano /etc/apache2/sites-available/000-default.conf
先に追加したRedirect
行を見つけます。 その行にpermanent
を追加すると、リダイレクトが302の一時リダイレクトから301の永続リダイレクトに変更されます。
<VirtualHost *:80> . . . Redirect permanent "/" "https://your_domain_or_IP/" . . .</VirtualHost>
ファイルを保存して閉じます。
構文エラーの設定を確認します:
- sudo apache2ctl configtest
準備ができたら、リダイレクトを永続的にするためにApacheを再起動します:
- sudo systemctl restart apache2
結論
クライアント接続に強力な暗号化を使用するようにApacheサーバーを構成しました。 これにより、要求を安全に処理できるようになり、外部の関係者がトラフィックを読み取るのを防ぐことができます。