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

前書き

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

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

[。注意]##

Note:自己署名証明書は、サーバーとクライアント間の通信を暗号化します。 ただし、Webブラウザーに含まれる信頼できる認証局のいずれかによって署名されていないため、ユーザーは証明書を使用してサーバーのIDを自動的に検証することはできません。

サーバーにドメイン名が関連付けられていない場合や、暗号化されたWebインターフェースがユーザー向けではない場合には、自己署名証明書が適切な場合があります。 ドメイン名がある場合、多くの場合、CA署名付き証明書を使用することをお勧めします。 Let’s Encryptプロジェクトhere
を使用して、無料の信頼できる証明書を設定する方法を確認できます。

前提条件

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

sudo権限を持つroot以外のユーザーがいるCentOS7サーバーにアクセスする必要があります。 これをまだ構成していない場合は、CentOS 7 initial server setup guideを実行してこのアカウントを作成できます。

仮想ホストを構成するには、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が必要です。 パスフレーズは、再起動のたびにパスフレーズを入力する必要があるため、これを防ぐことができます。

  • -days 365:このオプションは、証明書が有効であると見なされる時間の長さを設定します。 ここで1年間設定しました。

  • -newkey rsa:2048:これは、新しい証明書と新しいキーを同時に生成することを指定します。 前の手順で証明書に署名するために必要なキーを作成しなかったため、証明書と共に作成する必要があります。 rsa:2048部分は、2048ビット長のRSAキーを作成するように指示します。

  • -keyout:この行は、作成している生成された秘密鍵ファイルを配置する場所をOpenSSLに指示します。

  • -out:これは、作成する証明書を配置する場所をOpenSSLに指示します。

プロンプトに適切に記入します。 最も重要な行は、Common Nameを要求する行です。 サーバーに関連付けるドメイン名を入力する必要があります。 ドメイン名がない場合は、代わりにパブリックIPアドレスを入力できます。

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

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) []:example.com
Email Address []:[email protected]

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

OpenSSLを使用している間、クライアントとの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になります。サイトのドキュメントルートを変更していない場合は、この行を変更する必要はありません。 ただし、Apache virtual hosts setup guideのようなガイドに従っている場合は、サイトのドキュメントルートが異なる可能性があります。

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

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


. . .
DocumentRoot "/var/www/example.com/public_html"
ServerName www.example.com:443

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

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

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

SSLCertificateFileSSLCertificateKeyFileの行を見つけて、/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をより安全にセットアップするために、Cipherli.stサイトのRemy van Elstによる推奨事項を使用します。 このサイトは、一般的なソフトウェアの使いやすい暗号化設定を提供するように設計されています。 Apacheの選択hereに関する彼の決定についてもっと読むことができます。

[。注意]##

Note:上記にリンクされているサイトで推奨される設定は、強力なセキュリティを提供します。 場合によっては、クライアントの互換性が高くなるという犠牲が伴います。 古いクライアントをサポートする必要がある場合は、「はい、レガシー/古いソフトウェアで動作する暗号スイートを教えてください」というラベルの付いたページのリンクをクリックしてアクセスできる代替リストがあります。そのリストはコピーされたアイテムの代わりに使用できます未満。

使用する構成の選択は、サポートする必要があるものに大きく依存します。 どちらも優れたセキュリティを提供します。

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

少し時間を取って、HTTP Strict Transport Security, or HSTSについて、特に“preload” functionalityについて読んでください。 HSTSをプリロードするとセキュリティが向上しますが、誤って有効にしたり誤って有効にしたりすると、広範囲に及ぶ結果を招く可能性があります。 このガイドでは、設定をプリロードしませんが、その意味を理解していることが確実な場合は設定を変更できます。

他に行う変更は、SSLSessionTicketsディレクティブをコメントアウトすることです。これは、CentOS7に付属しているバージョンのApacheでは使用できないためです。

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

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

    . . .

. . .

# Begin copied text
# 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
# 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"
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

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

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

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

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

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

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


        ServerName www.example.com
        Redirect "/" "https://www.example.com/"

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

ステップ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://example.com/

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

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

結論

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

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