CentOS 7用のApacheでSSL証明書を作成する方法

前書き

  • TLS *、または「トランスポート層セキュリティ」、およびその前身である「SSL」は、保護された暗号化されたラッパーで通常のトラフィックをラップするために使用されるWebプロトコルです。 このテクノロジーを使用すると、サーバーは、メッセージが外部の第三者によって傍受されて読み取られる心配なしに、サーバーとクライアント間で安全にトラフィックを送信できます。 証明書システムは、ユーザーが接続先のサイトのIDを確認するのにも役立ちます。

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

前提条件

このガイドを始める前に、最初に完了する必要があるいくつかのステップがあります。

`+ sudo +`権限を持つ非rootユーザーでCentOS 7サーバーにアクセスする必要があります。 これをまだ構成していない場合は、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7 [CentOS 7初期サーバーセットアップガイド]を実行して、これを作成できます。アカウント。

仮想ホストを構成するには、Apacheもインストールする必要があります。 まだ行っていない場合は、 `+ yum +`を使用して、CentOSのデフォルトのソフトウェアリポジトリからApacheをインストールできます。

sudo yum install httpd

次に、ApacheをCentOSサービスとして有効にして、再起動後に自動的に開始されるようにします。

sudo systemctl enable httpd.service

これらの手順が完了したら、SSHを介して非rootユーザーアカウントとしてログインし、チュートリアルを続行できます。

ステップ1:Mod_sslをインストールする

自己署名証明書をセットアップするには、まず、SSL暗号化のサポートを提供するApacheモジュールである `+ mod_ssl `がサーバーにインストールされていることを確認する必要があります。 ` yum `コマンドで ` mod_ssl +`をインストールできます:

sudo yum install mod_ssl

モジュールはインストール中に自動的に有効になり、Apacheは再起動後にSSL証明書の使用を開始できます。 `+ mod_ssl +`を使用するために追加の手順を実行する必要はありません。

ステップ2:新しい証明書を作成する

Apacheで暗号化を使用する準備ができたので、新しいSSL証明書の生成に進むことができます。 証明書にはサイトに関するいくつかの基本情報が保存され、サーバーが暗号化されたデータを安全に処理できるようにするキーファイルが添付されます。

最初に、秘密鍵を保存するための新しいディレクトリを作成する必要があります(証明書ファイルを保持するために `+ / etc / ssl / certs +`ディレクトリがすでに利用可能です):

sudo mkdir /etc/ssl/private

このディレクトリ内に保持されるファイルは厳密にプライベートに保持する必要があるため、ルートユーザーのみがアクセスできるようにアクセス許可を変更します。

sudo chmod 700 /etc/ssl/private

ファイルを配置する場所ができたので、 `+ 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 -x509 *:これは、X.509証明書署名要求(CSR)管理を使用することを指定します。 「X.509」は、鍵と証明書の管理のためにSSLおよびTLSが準拠している公開鍵インフラストラクチャ標準です。

  • * -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]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

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

OpenSSLを使用している間、クライアントとhttps://en.wikipedia.org/wiki/Forward_secrecy[Perfect Forward Secrecy]の交渉に使用される強力なDiffie-Hellmanグループも作成する必要があります。

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

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

これには数分かかる場合がありますが、完了すると、「+ / etc / ssl / certs / dhparam.pem +」に強力なDHグループができます。これを設定で使用できます。

CentOS 7に同梱されているバージョンのApacheには、 `+ SSLOpenSSLConfCmd +`ディレクティブが含まれていないため、自己署名証明書の最後に生成されたファイルを手動で追加する必要があります。 これを行うには、次を入力します。

cat /etc/ssl/certs/dhparam.pem | sudo tee -a /etc/ssl/certs/apache-selfsigned.crt

`+ apache-selfsigned.crt +`ファイルには、証明書と生成されたDiffie-Hellmanグループの両方が含まれているはずです。

ステップ3:証明書を設定する

これで、完成したインターフェースに必要なコンポーネントがすべて揃いました。 次に行うことは、新しい証明書を表示するように仮想ホストを設定することです。

root権限でテキストエディターでApacheのSSL設定ファイルを開きます。

sudo vi /etc/httpd/conf.d/ssl.conf

`+ <VirtualHost default:443> +`で始まるセクションを見つけます。 SSL証明書がサイトに正しく適用されるようにするには、ここでいくつかの変更を行う必要があります。

VirtualHostディレクティブの調整

最初に、 `+ DocumentRoot `行のコメントを外し、引用符で囲んだアドレスをサイトのドキュメントルートの場所に編集します。 デフォルトでは、これは ` / var / www / html`にあります。サイトのドキュメントルートを変更していない場合、この行を変更する必要はありません。 ただし、https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-centos-7 [Apache virtual hosts setup guide]のようなガイドに従った場合、サイトのドキュメントルートは異なる場合があります。

次に、「+ ServerName 」行のコメントを解除し、「 www.example.com +」をドメイン名またはサーバーIPアドレス(証明書に共通名として入力したもの)に置き換えます。

/etc/httpd/conf.d/ssl.conf

<VirtualHost _default_:443>
. . .
DocumentRoot ""
ServerName :443

次に、 `+ SSLProtocol `と ` SSLCipherSuite +`の行を見つけて、それらを削除するかコメントアウトします。 すぐに貼り付ける構成は、CentOSのApacheに含まれるデフォルトよりも安全な設定を提供します。

/etc/httpd/conf.d/ssl.conf

. . .
SSLProtocol all -SSLv2
. . .
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA

`+ SSLCertificateFile `と ` SSLCertificateKeyFile `の行を見つけ、それらを ` / etc / httpd / ssl +`で作成したディレクトリに変更します。

/etc/httpd/conf.d/ssl.conf

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

これで、実際の `+ VirtualHost `ブロック内の変更が完了しました。 次の変更は、この同じファイル内の終了 ` </ VirtualHost> +`タグの後に行われます。

セキュアSSLパラメーターのセットアップ

次に、Apache SSLをより安全にセットアップするために、https://cipherli.st [Cipherli.stでhttps://raymii.org/s/static/About.html[Remy van Elst]の推奨事項を使用します。 ]サイト。 このサイトは、一般的なソフトウェアの使いやすい暗号化設定を提供するように設計されています。 Apacheの選択に関する彼の決定については、https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html [こちら]をご覧ください。

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

HTTP Strict Transport Security、またはHSTS、特にhttps://hstspreload.appspot.com/ [「プリロード」機能]をご覧ください。 。 HSTSをプリロードするとセキュリティが向上しますが、誤って有効にしたり誤って有効にしたりすると、広範囲に及ぶ結果を招く可能性があります。 このガイドでは、設定をプリロードしませんが、その意味を理解していることが確実な場合は変更できます。

他の変更点は、 `+ SSLSessionTickets +`ディレクティブをコメントアウトすることです。これは、CentOS 7に同梱されているApacheのバージョンでは使用できないためです。

サイトの設定を「+ VirtualHost +」ブロックの最後に* AFTER *で貼り付けます。

/etc/httpd/conf.d/ssl.conf

   . . .
</VirtualHost>
. . .


# 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


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

これらの変更が完了したら、ファイルを保存して閉じることができます。

(推奨)暗号化されていない仮想ホストファイルを変更してHTTPSにリダイレクトする

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

すべてのトラフィックをSSL暗号化にリダイレクトするには、 `+ / etc / httpd / conf.d `ディレクトリにある ` .conf +`で終わるファイルを作成して開きます:

sudo vi /etc/httpd/conf.d/non-ssl.conf

内部で、ポート80のリクエストに一致するように `+ VirtualHost `ブロックを作成します。 内部では、 ` ServerName `ディレクティブを使用して、ドメイン名またはIPアドレスと再度一致させます。 次に、 ` Redirect `を使用してリクエストを照合し、SSLの ` VirtualHost +`に送信します。 末尾のスラッシュを含めるようにしてください:

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

<VirtualHost *:80>
       ServerName
       Redirect "/" "https:///"
</VirtualHost>

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

ステップ4:証明書を有効にする

これで、SSL証明書を作成し、Webサーバーを構成してサイトに適用するようになりました。 これらのすべての変更を適用してSSL暗号化の使用を開始するには、Apacheサーバーを再起動して構成とモジュールを再読み込みします。

まず、次のように入力して、構成ファイルの構文エラーを確認します。

sudo apachectl configtest

出力が「+ Syntax OK +」で終わる限り、続行しても安全です。 これが出力の一部でない場合は、ファイルの構文を確認して再試行してください。

Output. . .
Syntax OK

次を入力して、Apacheサーバーを再起動して変更を適用します。

sudo systemctl restart httpd.service

次に、ファイアウォールでポート80および443が開いていることを確認します。 ファイアウォールを実行していない場合は、スキップできます。

  • firewalld *ファイアウォールを実行している場合は、次のように入力してこれらのポートを開くことができます。

sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https
sudo firewall-cmd --runtime-to-permanent
  • iptables *ファイアウォールを実行している場合、実行する必要があるコマンドは現在のルールセットに大きく依存しています。 基本的なルールセットの場合、次のように入力してHTTPおよびHTTPSアクセスを追加できます。

sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Webブラウザで、 `+ https:// +`を使用してドメイン名またはIPにアクセスし、動作中の新しい証明書を確認してください。

https:///

Webブラウザは、サイトのセキュリティ証明書が信頼されていないことを警告する可能性があります。 証明書はブラウザが信頼する認証局によって署名されていないため、ブラウザは接続しようとしているサーバーの身元を確認できません。 信頼できるCA署名付き証明書の代わりに自己署名証明書を作成したため、これは完全に理にかなっています。

ブラウザの本人確認に例外を追加すると、新しく保護されたサイトに進むことができます。

結論

HTTP要求とHTTPS要求の両方を処理するようにApacheサーバーを構成しました。 これにより、クライアントと安全に通信し、外部の第三者がトラフィックを読み取れないようにすることができます。

パブリックWebサイトでSSLを使用する予定がある場合、恐らく各訪問者に恐ろしい警告が表示されないように、おそらく信頼できる認証局からSSL証明書を購入する必要があります。

前の投稿:Python 3用のJupyter Notebookのセットアップ方法
次の投稿:Ubuntu 18.04のソースからRedisをインストールする方法