ウェブサイト検索

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


序章

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

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

このガイドでは、CentOS 7 サーバー上の Apache Web サーバーで使用する自己署名 SSL 証明書をセットアップします。

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

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

より本番環境に対応した証明書ソリューションについては、CentOS 7 チュートリアルで Let’s Encrypt 証明書を使用して Apache をセットアップする方法を確認してください。

前提条件

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

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

ステップ1-mod_sslのインストール

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

  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. 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 に指示します。

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

プロンプトに適切に入力します。

注: 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 []:webmaster@example.com

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

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

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

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

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

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

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

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

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

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

<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 を使用しましたが、他の設定がある場合はこれを変更できます。

最後に、\プリロード 機能について確認してください。HSTS をプリロードするとセキュリティが強化されますが、誤って有効にしたり、誤って有効にしたりすると、多大な影響を与える可能性があります。このガイドでは、設定をプリロードしませんが、その意味を理解していることが確実な場合は、それを変更してください。

その他の変更として、+TLSv1.3 を削除し、SSLSessionTickets および SSLOpenSSLConfCmd ディレクティブをコメント アウトします。 CentOS 7 に同梱されている Apache のバージョン。

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


    . . .
</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

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

<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

iptablesfirewall を実行している場合、実行する必要があるコマンドは、現在のルール セットに大きく依存します。基本ルール セットの場合、次のように入力して 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

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

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

サイトに移動する必要があります。ブラウザーのアドレス バーを見ると、部分的なセキュリティの兆候が見られます。これは、\x が付いた鍵、または感嘆符が付いた三角形である可能性があります。この場合、これは単に証明書を検証できないことを意味します。接続はまだ暗号化されています。

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

http://your_domain_or_ip

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

結論

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

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