CentOS8でApacheの自己署名SSL証明書を作成する方法
序章
TLS 、または「トランスポート層セキュリティ」(およびその前身の SSL )は、保護された暗号化されたラッパーで通常のトラフィックをラップするために使用されるプロトコルです。 このテクノロジーを使用すると、サーバーは、メッセージが外部の第三者によって傍受されたり読み取られたりすることなく、クライアントに安全に情報を送信できます。
このガイドでは、CentOS8マシン上のApacheWebサーバーで自己署名SSL証明書を作成して使用する方法を示します。
注:自己署名証明書は、サーバーとそのクライアント間の通信を暗号化します。 ただし、Webブラウザやオペレーティングシステムに含まれている信頼できる認証局によって署名されていないため、ユーザーは証明書を使用してサーバーのIDを自動的に検証することはできません。 その結果、ユーザーはサイトにアクセスしたときにセキュリティエラーが表示されます。
この制限のため、自己署名証明書は、一般にサービスを提供する実稼働環境には適していません。 これらは通常、テスト、または代替通信チャネルを介して証明書の有効性の信頼を確立できる単一のユーザーまたは少数のユーザーグループが使用する重要ではないサービスを保護するために使用されます。
より本番環境に対応した証明書ソリューションについては、無料の認証局である Let’sEncryptを確認してください。 Let’s Encrypt証明書をダウンロードして構成する方法については、 CentOS8チュートリアルでLet’sEncryptを使用してApacheを保護する方法をご覧ください。
前提条件
このチュートリアルを開始する前に、次のものが必要です。
-
root以外のsudo対応ユーザーによるCentOS8サーバーへのアクセス。 CentOS 8 を使用した初期サーバーセットアップガイドでは、このアカウントの作成方法を説明しています。
-
また、Apacheをインストールする必要があります。
dnf
を使用してApacheをインストールできます。- sudo dnf install httpd
Apacheを有効にし、
systemctl
を使用して起動します。- sudo systemctl enable httpd
- sudo systemctl start httpd
最後に、
firewalld
ファイアウォールを設定している場合は、http
およびhttps
ポートを開きます。- sudo firewall-cmd --permanent --add-service=http
- sudo firewall-cmd --permanent --add-service=https
- sudo firewall-cmd --reload
これらの手順が完了したら、 root 以外のユーザーとしてログインしていることを確認し、チュートリアルを続行してください。
手順1—mod_ssl
をインストールする
まず、SSL暗号化をサポートするApacheモジュールであるmod_ssl
をインストールする必要があります。
dnf
コマンドを使用してmod_ssl
をインストールします。
- sudo dnf install mod_ssl
パッケージングのバグのため、デフォルトのSSL証明書とキーを適切に生成するためにApacheを1回再起動する必要があります。そうしないと、'/etc/pki/tls/certs/localhost.crt' does not exist or is empty
の読み取りエラーが発生します。
- sudo systemctl restart httpd
これで、mod_ssl
モジュールが有効になり、使用できるようになります。
ステップ2—SSL証明書を作成する
Apacheで暗号化を使用する準備ができたので、新しいSSL証明書の生成に進むことができます。 証明書には、サイトに関するいくつかの基本情報が格納され、サーバーが暗号化されたデータを安全に処理できるようにするキーファイルが付属しています。
openssl
コマンドを使用して、SSLキーと証明書ファイルを作成できます。
- sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/private/apache-selfsigned.key -out /etc/pki/tls/certs/apache-selfsigned.crt
コマンドを入力すると、Webサイトに関する情報を入力できるプロンプトが表示されます。 それを説明する前に、発行しているコマンドで何が起こっているかを見てみましょう。
openssl
:これは、OpenSSL証明書、キー、およびその他のファイルを作成および管理するためのコマンドラインツールです。req -x509
:これは、X.509証明書署名要求(CSR)管理を使用することを指定します。 X.509は、SSLおよびTLSが鍵および証明書の管理に準拠する公開鍵インフラストラクチャ標準です。-nodes
:これは、パスフレーズで証明書を保護するオプションをスキップするようにOpenSSLに指示します。 サーバーの起動時に、ユーザーの介入なしにファイルを読み取れるようにするには、Apacheが必要です。 パスフレーズは、再起動するたびに入力する必要があるため、これが発生するのを防ぎます。-days 365
:このオプションは、証明書が有効であると見なされる時間の長さを設定します。 ここで1年間設定しました。 最近のブラウザの多くは、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) []:your_domain_or_ip
Email Address []:[email protected]
作成した両方のファイルは、/etc/pki/tls
ディレクトリの適切なサブディレクトリに配置されます。 これは、この目的のためにCentOSによって提供される標準ディレクトリです。
次に、新しい証明書とキーを使用するようにApache構成を更新します。
ステップ3—SSLを使用するようにApacheを構成する
自己署名証明書とキーが利用可能になったので、それらを使用するためにApache構成を更新する必要があります。 CentOSでは、新しいApache構成ファイル(.conf
で終わる必要があります)を/etc/httpd/conf.d
に配置でき、次にApacheプロセスを再ロードまたは再起動したときにロードされます。
このチュートリアルでは、新しい最小構成ファイルを作成します。 すでにApache<Virtualhost>
をセットアップしていて、SSLを追加するだけでよい場合は、SSL
で始まる構成行をコピーして、80
から443
へのX183X]ポート。 次のステップでポート80
を処理します。
/etc/httpd/conf.d
ディレクトリで新しいファイルを開きます。
- sudo vi /etc/httpd/conf.d/your_domain_or_ip.conf
次の最小限のVirtualHost構成を貼り付けます。
<VirtualHost *:443>
ServerName your_domain_or_ip
DocumentRoot /var/www/ssl-test
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/pki/tls/private/apache-selfsigned.key
</VirtualHost>
ServerName
行を、サーバーをアドレス指定する目的に更新してください。 これは、ホスト名、完全なドメイン名、またはIPアドレスにすることができます。 選択したものが、証明書を作成するときに選択したCommon Name
と一致することを確認してください。
残りの行は、ファイルを提供するDocumentRoot
ディレクトリと、Apacheが新しく作成された証明書とキーを指すために必要なSSLオプションを指定します。
それでは、DocumentRoot
を作成し、テスト目的でHTMLファイルをその中に入れましょう。
- sudo mkdir /var/www/ssl-test
テキストエディタで新しいindex.html
ファイルを開きます。
- sudo vi /var/www/ssl-test/index.html
以下を空のファイルに貼り付けます。
<h1>it worked!</h1>
もちろん、これは完全なHTMLファイルではありませんが、ブラウザーは寛大であり、構成を確認するのに十分です。
ファイルを保存して閉じ、次のように入力して、Apache構成の構文エラーを確認します。
- sudo apachectl configtest
警告が表示される場合がありますが、出力がSyntax OK
で終わっている限り、続行しても問題ありません。 これが出力の一部でない場合は、ファイルの構文を確認して、再試行してください。
すべてが順調になったら、Apacheをリロードして、構成の変更を取得します。
- sudo systemctl reload httpd
次に、ブラウザにサイトをロードします。最初は必ずhttps://
を使用してください。
エラーが表示されるはずです。 これは自己署名証明書では正常です。 ブラウザは、サーバーのIDを確認できないことを警告しています。これは、ブラウザの既知の認証局のいずれによっても証明書が署名されていないためです。 テスト目的および個人的な使用の場合、これは問題ない場合があります。 詳細または詳細情報をクリックして、続行することを選択できるはずです。
そうすると、ブラウザはit worked!
メッセージをロードします。
注:ブラウザがサーバーにまったく接続しない場合は、接続がファイアウォールによってブロックされていないことを確認してください。 firewalld
を使用している場合、次のコマンドはポート80
および443
を開きます。
- sudo firewall-cmd --permanent --add-service=http
- sudo firewall-cmd --permanent --add-service=https
- sudo firewall-cmd --reload
次に、別のVirtualHost
セクションを構成に追加して、プレーンHTTPリクエストを処理し、HTTPSにリダイレクトします。
ステップ4—HTTPをHTTPSにリダイレクトする
現在、この構成はポート443
でのHTTPS要求にのみ応答します。 すべてのトラフィックを強制的に暗号化する場合でも、ポート80
でも応答することをお勧めします。 VirtualHost
を設定して、これらの暗号化されていない要求に応答し、HTTPSにリダイレクトしてみましょう。
前の手順で開始したものと同じApache構成ファイルを開きます。
- sudo vi /etc/httpd/conf.d/your_domain_or_ip.conf
下部に、別のVirtualHost
ブロックを作成して、ポート80
の要求に一致させます。 ServerName
ディレクティブを使用して、ドメイン名またはIPアドレスを再度照合します。 次に、Redirect
を使用してすべてのリクエストを照合し、SSLVirtualHost
に送信します。 末尾のスラッシュを必ず含めてください。
<VirtualHost *:80>
ServerName your_domain_or_ip
Redirect / https://your_domain_or_ip/
</VirtualHost>
終了したら、このファイルを保存して閉じ、構成構文を再度テストして、Apacheをリロードします。
- sudo apachectl configtest
- sudo systemctl reload httpd
アドレスの前にプレーンなhttp://
を付けてサイトにアクセスすると、新しいリダイレクト機能をテストできます。 https://
に自動的にリダイレクトされます。
結論
これで、自己署名SSL証明書を使用して暗号化された要求を処理し、暗号化されていないHTTP要求をHTTPSにリダイレクトするようにApacheを構成しました。
公開WebサイトにSSLを使用することを計画している場合は、ドメイン名を購入し、 Let’sEncryptなどの広くサポートされている認証局を使用することを検討する必要があります。
Let’s Encrypt with Apacheの使用の詳細については、 CentOS8でLet’sEncryptを使用してApacheを保護する方法のチュートリアルをお読みください。