Debian10でApacheの自己署名SSL証明書を作成する方法
序章
TLS 、つまりトランスポート層セキュリティ、およびその前身である SSL は、セキュアソケットレイヤーの略で、通常のトラフィックを保護された暗号化ラッパーでラップするために使用されるWebプロトコルです。
このテクノロジーを使用すると、サーバーは、外部の関係者によってメッセージが傍受される可能性なしに、サーバーとクライアント間でトラフィックを安全に送信できます。 証明書システムは、ユーザーが接続しているサイトのIDを確認するのにも役立ちます。
このガイドでは、Debian10上のApacheWebサーバーで使用するための自己署名SSL証明書を設定する方法を示します。
注:自己署名証明書は、サーバーとクライアント間の通信を暗号化します。 ただし、Webブラウザに含まれている信頼できる認証局によって署名されていないため、ユーザーは証明書を使用してサーバーのIDを自動的に検証することはできません。
サーバーにドメイン名が関連付けられていない場合や、暗号化されたWebインターフェイスがユーザー向けでない場合は、自己署名証明書が適切な場合があります。 do にドメイン名がある場合、多くの場合、CA署名付き証明書を使用することをお勧めします。 Let’sEncryptプロジェクトここで無料の信頼できる証明書を設定する方法を見つけることができます。
前提条件
始める前に、root以外のユーザーにsudo
権限を設定しておく必要があります。 このようなユーザーアカウントを設定する方法については、Debian10を使用した初期サーバー設定に従ってください。
また、ApacheWebサーバーをインストールする必要があります。 LAMPスタック全体(Linux、Apache、MariaDB、PHP)をサーバーにインストールする場合は、 Debian10でのLAMPのセットアップに関するガイドに従ってください。 Apache Webサーバーだけが必要な場合は、PHPとMariaDBに関連する手順をスキップしてください。
これらの前提条件を完了したら、以下に進みます。
ステップ1—SSL証明書を作成する
TLS / SSLは、公開証明書と秘密鍵の組み合わせを使用して機能します。 SSLキーはサーバー上で秘密にされます。 クライアントに送信されるコンテンツを暗号化するために使用されます。 SSL証明書は、コンテンツを要求するすべての人と公に共有されます。 これは、関連付けられたSSLキーによって署名されたコンテンツを復号化するために使用できます。
1つのコマンドで、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に作成する証明書を配置する場所を指示します。
上で述べたように、これらのオプションはキーファイルと証明書の両方を作成します。 情報を証明書に正しく埋め込むために、サーバーについていくつか質問があります。
プロンプトに適切に記入します。
プロンプト全体は次のようになります。
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 []:admin@your_domain.com
作成した両方のファイルは、/etc/ssl
の下の適切なサブディレクトリに配置されます。
ステップ2—SSLを使用するようにApacheを構成する
/etc/ssl
ディレクトリの下にキーファイルと証明書ファイルを作成しました。 これらを利用するには、Apache構成を変更する必要があります。
構成にいくつかの調整を加えます。
- 強力なデフォルトSSL設定を指定するための構成スニペットを作成します。
- 含まれているSSLApache仮想ホストファイルを変更して、生成されたSSL証明書を指すようにします。
- (推奨)暗号化されていない仮想ホストファイルを変更して、要求を暗号化された仮想ホストに自動的にリダイレクトします。
終了したら、安全な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サイトのRemyvanElstによる推奨事項を使用します。 このサイトは、人気のあるソフトウェアの使いやすい暗号化設定を提供するように設計されています。
上記にリンクされているサイトで推奨される設定は、強力なセキュリティを提供します。 場合によっては、これにはクライアントの互換性が向上するという犠牲が伴います。 古いクライアントをサポートする必要がある場合は、「はい、レガシー/古いソフトウェアで動作する暗号スイートを教えてください」というラベルの付いたページのリンクをクリックしてアクセスできる代替リストがあります。 そのリストは、以下にコピーされたアイテムの代わりに使用できます。
使用する構成の選択は、サポートする必要があるものに大きく依存します。 どちらも優れたセキュリティを提供します。
私たちの目的のために、提供された設定全体をコピーすることができます。 これに小さな変更を1つ加えて、Strict-Transport-Security
ヘッダー(HSTS)を無効にします。
HSTSをプリロードするとセキュリティが向上しますが、誤って有効にしたり、誤って有効にした場合、広範囲にわたる結果が生じる可能性があります。 このガイドでは、設定を有効にしませんが、影響を理解していることが確実な場合は、設定を変更できます。
決定する前に、 HTTP Strict Transport Security(HSTS )、特に「プリロード」機能についてお読みください。
開いたssl-params.conf
ファイルに次の構成を貼り付けます。
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
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 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
終了したら、ファイルを保存して閉じます。
デフォルトのApacheSSL仮想ホストファイルの変更
次に、デフォルトのApacheSSL仮想ホストファイルである/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>
</VirtualHost>
</IfModule>
ファイルに若干の調整を加えます。 調整したい通常のもの(ServerAdmin電子メールアドレス、ServerNameなど)を設定し、証明書とキーファイルを指すようにSSLディレクティブを調整します。 繰り返しになりますが、別のドキュメントルートを使用している場合は、必ずDocumentRoot
ディレクティブを更新してください。
これらの変更を行うと、サーバーブロックは次のようになります。
<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>
</VirtualHost>
</IfModule>
終了したら、ファイルを保存して閉じます。
(推奨)HTTPSにリダイレクトするようにHTTPホストファイルを変更する
現在のところ、サーバーは暗号化されていない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>
終了したら、ファイルを保存して閉じます。
これで、Apacheに対して行う必要のある構成変更はすべて完了しました。 次に、ファイアウォールルールをufw
で更新して、サーバーへの暗号化されたHTTPSトラフィックを許可する方法について説明します。
ステップ3—ファイアウォールを調整する
前提条件ガイドで推奨されているように、ufw
ファイアウォールを有効にしている場合は、SSLトラフィックを許可するように設定を調整する必要がある場合があります。 幸い、Debian 10にインストールすると、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フル」プロファイルを許可してから、冗長な「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を再起動してこれらの変更を有効にします。
mod_ssl
、Apache SSLモジュール、およびmod_headers
を有効にします。これは、a2enmod
コマンドを使用して、SSLスニペットの一部の設定で必要になります。
- 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サーバーをテストする準備が整いました。
Webブラウザーを開き、https://
に続けて、サーバーのドメイン名またはIPをアドレスバーに入力します。
https://server_domain_or_IP
作成した証明書は、ブラウザの信頼できる認証局の1つによって署名されていないため、次のような恐ろしい警告が表示される可能性があります。
これは予想された正常なことです。 証明書の暗号化の側面にのみ関心があり、ホストの信頼性のサードパーティによる検証には関心がありません。 ADVANCED をクリックしてから、提供されたリンクをクリックして、とにかくホストに進みます。
あなたはあなたのサイトに連れて行かれるべきです。 ブラウザのアドレスバーを見ると、「x」が付いたロックまたは同様の「安全ではない」という別の通知が表示されます。 この場合、これは単に証明書を検証できないことを意味します。 それはまだあなたの接続を暗号化しています。
HTTPをHTTPSにリダイレクトするようにApacheを設定した場合は、リダイレクトが正しく機能するかどうかを確認することもできます。
http://server_domain_or_IP
これで同じアイコンが表示される場合は、リダイレクトが正しく機能したことを意味します。 ただし、前に作成したリダイレクトは一時的なリダイレクトにすぎません。 HTTPSへのリダイレクトを永続的にする場合は、最後の手順に進みます。
ステップ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
これにより、リダイレクトが永続的になり、サイトはHTTPS経由のトラフィックのみを処理します。
結論
クライアント接続に強力な暗号化を使用するようにApacheサーバーを構成しました。 これにより、リクエストを安全に処理できるようになり、外部の関係者がトラフィックを読み取るのを防ぐことができます。