序章

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

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

このガイドでは、CentOS7サーバー上のApacheWebサーバーで使用するための自己署名SSL証明書を設定します。

注:自己署名証明書は、サーバーとクライアント間の通信を暗号化します。 ただし、Webブラウザに含まれている信頼できる認証局によって署名されていないため、ユーザーは証明書を使用してサーバーのIDを自動的に検証することはできません。 その結果、ユーザーはサイトにアクセスしたときにセキュリティエラーが表示されます。

この制限のため、自己署名証明書は、一般にサービスを提供する実稼働環境には適していません。 これらは通常、テスト、または代替通信チャネルを介して証明書の有効性の信頼を確立できる単一のユーザーまたは少数のユーザーグループが使用する重要ではないサービスを保護するために使用されます。

より本番環境に対応した証明書ソリューションについては、無料の認証局である Let’sEncryptを確認してください。 CentOS 7でのLet’sEncrypt証明書を使用したApacheのセットアップチュートリアルで、Let’sEncrypt証明書をダウンロードして構成する方法を学ぶことができます。

前提条件

このガイドを開始する前に、最初に完了する必要のあるいくつかの手順があります。

  • sudo権限を持つroot以外のユーザーがいるCentOS7サーバーにアクセスする必要があります。 これをまだ構成していない場合は、CentOS7初期サーバーセットアップガイドを実行してこのアカウントを作成できます。
  • また、 CentOS7チュートリアルにApacheWebサーバーをインストールする方法のステップ1で説明されているように、Apacheをインストールする必要があります。 これらの手順が完了したら、SSHを介してroot以外のユーザーアカウントとしてログインし、チュートリアルを続行できます。

手順1—mod_sslをインストールする

自己署名証明書を設定するには、まず、SSL暗号化をサポートするApacheモジュールであるmod_sslがサーバーにインストールされていることを確認する必要があります。 mod_sslyumコマンドでインストールできます。

  1. sudo yum install mod_ssl

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

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

Apacheで暗号化を使用する準備ができたので、新しいSSL証明書の生成に進むことができます。 TLS / SSLは、公開証明書と秘密鍵の組み合わせを使用して機能します。 SSLキーはサーバー上で秘密にされます。 クライアントに送信されるコンテンツを暗号化するために使用されます。 SSL証明書は、コンテンツを要求するすべての人と公に共有されます。 これは、関連付けられたSSLキーによって署名されたコンテンツを復号化するために使用できます。

公開証明書を保持するために使用できる/etc/ssl/certsディレクトリは、サーバー上にすでに存在している必要があります。 秘密鍵ファイルを保持するために、/etc/ssl/privateディレクトリも作成する必要があります。 このキーの機密性はセキュリティにとって不可欠であるため、不正アクセスを防ぐためにアクセス許可をロックダウンすることが重要です。

  1. sudo mkdir /etc/ssl/private
  2. sudo chmod 700 /etc/ssl/private

これで、次のように入力することで、OpenSSLを使用した自己署名キーと証明書のペアを1つのコマンドで作成できます。

  1. 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 (e.g. server FQDN or YOUR name)の入力を求められたら、ドメイン名またはサーバーのパブリックIPアドレスを入力することが重要です。 ここでの値は、ユーザーがサーバーにアクセスする方法と一致する必要があります。

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

Output
Country Name (2 letter code) [XX]:US State or Province Name (full name) []:Example Locality Name (eg, city) [Default City]:Example Organization Name (eg, company) [Default Company Ltd]:Example Inc Organizational Unit Name (eg, section) []:Example Dept Common Name (eg, your name or your server's hostname) []:your_domain_or_ip Email Address []:[email protected]

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

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

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

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

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

ステップ3—証明書の設定

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

/etc/httpd/conf.dディレクトリで新しいファイルを開きます。

  1. sudo vi /etc/httpd/conf.d/your_domain_or_ip.conf

次の最小限のVirtualHost構成を貼り付けます。

/etc/httpd/conf.d/your_domain_or_ip.conf
<VirtualHost *:443>
    ServerName your_domain_or_ip
    DocumentRoot /var/www/html
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
    SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
</VirtualHost>

ServerName行を、サーバーをアドレス指定する目的に更新してください。 これは、ホスト名、完全なドメイン名、またはIPアドレスにすることができます。 選択したものが、証明書を作成するときに選択したCommon Nameと一致することを確認してください。

安全なSSLパラメータの設定

次に、サイトのセキュリティを強化するSSLオプションをいくつか追加します。 使用するオプションは、Cipherlist.euからの推奨事項です。 このサイトは、人気のあるソフトウェアの使いやすい暗号化設定を提供するように設計されています。

注: Cipherlist.eu のデフォルトの推奨設定は、強力なセキュリティを提供します。 場合によっては、これにはクライアントの互換性が向上するという犠牲が伴います。 古いクライアントをサポートする必要がある場合は、「はい、レガシー/古いソフトウェアで動作する暗号スイートを教えてください」というラベルの付いたリンクをクリックしてアクセスできる代替リストがあります。

上記の構成の2つのコメントブロック間のデフォルトの提案の代わりに、互換性リストを使用できます。 使用する構成の選択は、サポートする必要があるものに大きく依存します。

変更したい構成がいくつかあります。 まず、アップストリームリクエスト用の優先DNSリゾルバーをresolverディレクティブに追加できます。 このガイドではGoogleを使用しましたが、他の設定がある場合はこれを変更できます。

最後に、 HTTP Strict Transport Security(HSTS )、特にの「プリロード」機能についてお読みください。 HSTSをプリロードするとセキュリティが向上しますが、誤って有効にした場合や誤って有効にした場合は、広範囲に及ぶ結果が生じる可能性があります。 このガイドでは、設定をプリロードしませんが、影響を確実に理解している場合は、設定を変更できます。

その他の変更は、+TLSv1.3を削除し、SSLSessionTicketsおよびSSLOpenSSLConfCmdディレクティブをコメントアウトすることです。これらはCentOS7に付属するバージョンのApacheでは使用できないためです。

VirtualHostブロックの終了後に、サイトの設定を貼り付けます。

/etc/httpd/conf.d/your_domain_or_ip.conf

    . . .
</VirtualHost>
. . .

# Begin copied text
# from https://cipherli.st/

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
# Requires Apache 2.4.36 & OpenSSL 1.1.1
SSLProtocol -all +TLSv1.2
# SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1
# Older versions
# 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 Strict-Transport-Security "max-age=63072000; includeSubdomains"
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
# SSLSessionTickets Off

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

HTTPからHTTPSへのリダイレクトの作成(オプション)

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

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

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

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

/etc/httpd/conf.d/non-ssl.conf
<VirtualHost *:80>
       ServerName your_domain_or_ip
        Redirect "/" "https://your_domain_or_ip/"
</VirtualHost>

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

ステップ4—Apache構成の変更を適用する

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

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

  1. sudo apachectl configtest

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

Output
. . . Syntax OK

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

  1. sudo systemctl restart httpd.service

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

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

  1. sudo firewall-cmd --add-service=http
  2. sudo firewall-cmd --add-service=https
  3. sudo firewall-cmd --runtime-to-permanent

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

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

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

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

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

https://your_domain_or_ip

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

Apache self-signed cert warning

これは予想された正常なことです。 証明書の暗号化の側面にのみ関心があり、ホストの信頼性のサードパーティによる検証には関心がありません。 「詳細」をクリックしてから、提供されたリンクをクリックして、とにかくホストに進みます。

Apache self-signed override

あなたはあなたのサイトに連れて行かれるべきです。 ブラウザのアドレスバーを見ると、部分的なセキュリティの兆候が見られます。 これは、その上に「x」が付いたロック、または感嘆符が付いた三角形の場合があります。 この場合、これは単に証明書を検証できないことを意味します。 それはまだあなたの接続を暗号化しています。

HTTPリクエストをHTTPSにリダイレクトするようにApacheを設定した場合は、リダイレクトが正しく機能するかどうかを確認することもできます。

http://your_domain_or_ip

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

結論

HTTPリクエストとHTTPSリクエストの両方を処理するようにApacheサーバーを設定しました。 これにより、クライアントと安全に通信し、外部の関係者がトラフィックを読み取れないようにすることができます。

公開WebサイトにSSLを使用することを計画している場合は、各訪問者に恐ろしい警告が表示されないように、信頼できる認証局からSSL証明書を購入する必要があります。