【RHEL】自己署名証明書の設定

自己署名証明書を作成し、ApacheウェブサーバーでHTTPS通信を設定する手順を備忘として書いています。
他のサイトを見たところ、設定ファイルはこれと決まったものではないようですので適宜状況によって読み替えてください。
今回は、以下サイトを参考にさせていただきました、ありがとうございました。
自己署名証明書を作成してサーバーにHTTPS通信を設定する手順 https://zenn.dev/shz/articles/d261c37e71bdcf
目次
環境
評価版のRed Hat Enterprise Linux release 9.6 (Plow)
※インターネット公開ではなく、プライベートネットワーク内での検証
事前準備
必要なパッケージをインストールする前にシステムにへインストール済みのパッケージに更新がないか確認しておきます。Linuxのお作法がよくわかってないので他の方の記事にあるとおりにしたいと思います。
sudo dnf update
dnf update コマンドは、Linux システムでパッケージをアップデートするためのものです。
このコマンドは、システムにインストールされているパッケージの最新バージョンをダウンロードしてインストールします。
「Nothing to do .」が表示されたら何もする必要はないです。
必要なソフトの確認
Apacheがインストールされていること。(世界中で広く使われているオープンソースのWebサーバーソフトウェア)
OpenSSLがインストールされていること。(SSL/TLSプロトコルを実装したオープンソースの暗号化ライブラリ)
mod_ssl モジュールがロードされていること(Apache WebサーバーをSSL/TLSで暗号化された通信に対応させるためのモジュール)
Apache(httpd)、openssl、mod_sslがインストールされているか確認します。
dnf list installed | grep httpd

dnf list installed | grep openssl

dnf list installed | grep mod_ssl

必要なソフトのインストール
Apache(httpd)、mod_sslが存在しないためインストールします。
Apache(httpd)のインストール
dnf into ソフト名は、指定されたhttpdパッケージに関する情報を表示します。
dnf info httpd

インストールします。Complete! や 完了しました! と表示されたらインストールは終了です。
dnf -y install httpd
httpd -versionコマンドでインストールされた Apache httpd のバージョンを確認します。
httpd -version

最初に確認した以下コマンドでも確認しておきます。
dnf list installed | grep httpd

httpdのサービスを起動して、OS再起動してもサービスが起動するよう(enable)設定後に再度確認します。
状態が「active(running)でサービスが起動していることが確認できます。また、httpd.serviceは「enable」となりOS再起動時にサービスが自動起動するよう設定されていることが確認できます。
systemctl start httpd
systemctl enable httpd

ブラウザで表示されるか確認(http://192.168.11.48)したら表示されません。ファイアウォールで止められているようです。
firewalldの設定
ファイアウォールの設定は以下を参照して設定します。「http」「https」の通信ができるよう設定します。
firewalldの設定後、Services項へhttp、httpsが追加されました。
firewall-cmd –list-all

あらためてブラウザで表示されるか確認(http://192.168.11.48)したら表示されました。

mod_sslのインストール
dnf info ソフト名は、指定されたmod_sslパッケージに関する情報を表示します。
dnf info mod_ssl

インストールします。Complete! や 完了しました! と表示されたらインストールは終了です。
dnf -y install mod_ssl
最初に確認した以下コマンドで確認します。
dnf list installed | grep mod_ssl

これで必要なソフトは準備できました。
自己署名証明書の作成
秘密鍵の生成
秘密鍵を生成します。秘密鍵はサーバー上で厳重に保管します。作成する場所は任意です。今回は参考サイトの情報に沿って /etc/ssl/private 配下へ作成しました。
ls /etc/ssl

mkdir -p /etc/ssl/private
chmod 700 /etc/ssl/private
openssl genpkey -algorithm RSA -out /etc/ssl/private/server.key

コマンドの説明
openssl:OpenSSLは、SSL/TLSプロトコルを実装するためのオープンソースライブラリ。
genpkey:秘密鍵を生成するためのコマンド。
-algorithm RSA:鍵のアルゴリズムとしてRSAを指定。
-out /etc/ssl/private/server.key:生成された秘密鍵を/etc/ssl/private/server.keyというファイルに保存。
自己署名証明書の生成
次に、生成した秘密鍵を使用して自己署名証明書を作成します。
openssl req -new -x509 -key /etc/ssl/private/server.key -out /etc/ssl/certs/server.crt -days 365

コマンドの説明
openssl:OpenSSLツールを呼び出します。
req:証明書署名リクエスト(CSR)を生成するためのコマンド。
-new:新しいCSRまたは証明書を生成することを指定。
-x509:X.509形式の証明書を生成するオプション。このオプションを指定すると、CSRではなく自己署名証明書が生成される。
-key /etc/ssl/private/server.key:署名に使用する秘密鍵ファイルを指定。
-out /etc/ssl/certs/server.crt:生成された自己署名証明書を/etc/ssl/certs/server.crtというファイルに保存。
-days 365:証明書の有効期限を365日に設定。
SSL設定ファイルの編集
/etc/httpd/conf.d/ssl.confファイルが存在するかを確認します。

/etc/httpd/conf.d/ssl.conf へ以下の内容を追記します。一番下に追記しました。

設定値の意味
Listen 443 https:ApacheがHTTPSプロトコルで通信を受け付けるポート番号(443番)を指定。
:ポート443で受信するすべてのIPアドレスに対して、この仮想ホストの設定を適用。
ServerName www.example.com:この仮想ホストが対応するサーバーの名前(ドメイン名)を指定。
DocumentRoot “/var/www/html”:ウェブコンテンツのルートディレクトリを指定。
SSLEngine on:SSLを有効。
SSLCertificateFile /etc/ssl/certs/server.crt:サーバー証明書(自己署名証明書)のファイルパスを指定。
SSLCertificateKeyFile /etc/ssl/private/server.key:サーバーの秘密鍵のファイルパスを指定。
:DocumentRootディレクトリ内の設定を定義。
Options -Indexes +FollowSymLinks:ディレクトリのインデックスリスト表示を無効にし、シンボリックリンクをたどることを許可。
-Indexes:インデックスリストの表示を無効。
+FollowSymLinks:シンボリックリンクをたどることを許可。
AllowOverride All:.htaccessファイル内でのすべての設定の上書きを許可。
Require all granted:すべてのアクセスを許可。
ErrorLog logs/ssl_error_log:SSLエラーのログファイルの場所を指定。
TransferLog logs/ssl_access_log:SSLアクセスログのファイルの場所を指定。
LogLevel warn:ログの出力レベルをwarn(警告)に設定。
Apacheの再起動
Apache(httpd)を再起動します。
systemctl restart httpd
DNSの名前解決
今回は自端末(ホスト)と仮想マシンという関係のプライベートネットワーク(192.168.11.*)で検証しています。
「www.example.com」を名前解決しないといけないので自端末(ホスト)のhostsファイルへ「www.example.com」を登録します。

pingで「www.example.com」から応答があることを確認します。

HTTPS通信の確認
DocumetRootが /var/www/html なのでそこに「Hello World !」が表示される index.html を作成しました。
ブラウザを開き、https://www.example.comにアクセスします。自己署名証明書を使用しているため、ブラウザが警告を表示しますが、警告を無視してサイトに進むことで、HTTPS通信が確立されていることを確認できます。

ブラウザで証明書の詳細を確認すると自己証明書作成時に入力した情報が確認できました。

まとめ
今回、自己署名証明書の件について曖昧になっていたので検証を兼ねて記事にしました。秘密鍵作成後、一度CSRファイルを作成してから自己署名証明書を作成するのかなと思っていたのですが(その手順もあるようです)、CSRファイルを作成する必要なく、いっきに自己署名証明書を作成できるコマンドもあることを知り大変勉強になりました。
以下、他の記事をまとめた一覧です。AWSもまとめています。