開発者ドキュメント

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

序章

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

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

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

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

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

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

前提条件

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

ステップ1—インストール mod_ssl

自己署名証明書を設定するには、まず次のことを確認する必要があります。 mod_ssl、SSL暗号化のサポートを提供するApacheモジュールがサーバーにインストールされます。 インストールできます mod_ssl とともに yum 指図:

  1. sudo yum install mod_ssl

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

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

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

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

一連の質問があります。 それを説明する前に、コマンドで何が起こっているかを見てみましょう。

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

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

注:プロンプトが表示されたら、ドメイン名またはサーバーのパブリックIPアドレスを入力することが重要です。 Common Name (e.g. server FQDN or YOUR name). ここでの値は、ユーザーがサーバーにアクセスする方法と一致する必要があります。

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

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 ForwardSecrecyのネゴシエーションに使用される強力な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構成を貼り付けます。

/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 とコメントアウト SSLSessionTicketsSSLOpenSSLConfCmd ディレクティブは、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暗号化にリダイレクトするには、で終わるファイルを作成して開きます .conf の中に /etc/httpd/conf.d ディレクトリ:

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

内部で、を作成します VirtualHost ポート80の要求に一致するようにブロックします。 内部では、 ServerName ドメイン名またはIPアドレスと再度一致するように指示します。 次に、 Redirect リクエストを照合してSSLに送信します VirtualHost. 末尾のスラッシュを必ず含めてください。

/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つによって署名されていないため、次のような恐ろしい警告が表示される可能性があります。

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

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

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

http://your_domain_or_ip

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

結論

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

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

モバイルバージョンを終了