RockyLinux8.9のテスト環境でSSLのテストを行うための準備(自己証明書の作成)

### 背景
本番運用ではLet's Encryptの証明書を使うのですが、そのテスト時にはローカルIPでWebサーバを立ち上げて動作確認をします。
ローカルIPでLet's Encryptの証明書を使うことはできないことはなさそうでしたが、手間がかかりそうでしたので、自己証明書でテストすることにしました。
### 準備
Dockerコンテナで証明書を使う予定なので、テスト環境にもWebサービスはインストールしていない。証明書のテストをするための（するためだけの）Apacheをインストールする。
```
$ sudo systemctl start httpd
Failed to start httpd.service: Unit httpd.service not found.
[tuti@localhost ~]$ sudo dnf install httpd httpd-tools mod_ssl
=======================================================================================================
 パッケージ            Arch       バージョン                                       リポジトリー  サイズ
=======================================================================================================
インストール:
 httpd                 x86_64     2.4.37-65.module+el8.10.0+1842+4a9649e8.2        appstream     1.4 M
 httpd-tools           x86_64     2.4.37-65.module+el8.10.0+1842+4a9649e8.2        appstream     111 k
 mod_ssl               x86_64     1:2.4.37-65.module+el8.10.0+1842+4a9649e8.2      appstream     141 k
依存関係のインストール:
 apr                   x86_64     1.6.3-12.el8                                     appstream     128 k
 apr-util              x86_64     1.6.1-9.el8                                      appstream     105 k
 httpd-filesystem      noarch     2.4.37-65.module+el8.10.0+1842+4a9649e8.2        appstream      44 k
 mod_http2             x86_64     1.15.7-10.module+el8.10.0+1883+38ed6c58.1        appstream     155 k
 rocky-logos-httpd     noarch     86.3-1.el8                                       baseos         24 k
弱い依存関係のインストール:
 apr-util-bdb          x86_64     1.6.1-9.el8                                      appstream      24 k
 apr-util-openssl      x86_64     1.6.1-9.el8                                      appstream      26 k
モジュールストリームの有効化中:
 httpd                            2.4                                                                 

トランザクションの概要
=======================================================================================================
インストール  10 パッケージ

ダウンロードサイズの合計: 2.2 M
インストール後のサイズ: 5.7 M
これでよろしいですか? [y/N]: y
（途中略）
インストール済み:
  apr-1.6.3-12.el8.x86_64                                        
  apr-util-1.6.1-9.el8.x86_64
  apr-util-bdb-1.6.1-9.el8.x86_64
  apr-util-openssl-1.6.1-9.el8.x86_64
  httpd-2.4.37-65.module+el8.10.0+1842+4a9649e8.2.x86_64
  httpd-filesystem-2.4.37-65.module+el8.10.0+1842+4a9649e8.2.noarch
  httpd-tools-2.4.37-65.module+el8.10.0+1842+4a9649e8.2.x86_64
  mod_http2-1.15.7-10.module+el8.10.0+1883+38ed6c58.1.x86_64
  mod_ssl-1:2.4.37-65.module+el8.10.0+1842+4a9649e8.2.x86_64
  rocky-logos-httpd-86.3-1.el8.noarch

完了しました!
```
インストールされたApacheの起動とバージョンの確認
```
$ sudo systemctl start httpd
$ httpd -v
Server version: Apache/2.4.37 (Rocky Linux)
Server built:   Aug 12 2024 08:13:30
```
### 自己証明書と秘密鍵の作成
```
$openssl req -x509 -nodes -newkey rsa:2048 -keyout ~/hogeweb.tokyo.key -out ~/hogeweb.tokyo.crt -days 3650
Country Name (2 letter code) [XX]: JP
State or Province Name (full name) []: Tokyo
Locality Name (eg, city) [Default City]: Shibuya
Organization Name (eg, company) [Default Company Ltd]: MyCompany
Organizational Unit Name (eg, section) []: Web Server
Common Name (e.g. server FQDN or YOUR name) []: hogeweb.tokyo
Email Address []: info@hogeweb.tokyo
```
※ 「-nodes」を指定して自己証明書を作成する際に プライベートキー (private key) を暗号化するためのパスフレーズ（PEM パスフレーズ）の入力を省略　← テスト環境のため省略した

### 自己証明書と秘密鍵の移動
```
$ sudo mv ~/hogeweb.tokyo.crt /etc/pki/tls/certs/
$ sudo mv ~/hogeweb.tokyo.key /etc/pki/tls/private/
```
【参考】
公開証明書ファイルと秘密鍵ファイルの保存場所をどこにすればいか
/etc/ssl
　/etc/ssl/certs/(公開証明書ファイル)   
　/etc/ssl/private/(秘密鍵ファイル)
/etc/pki/tls
　/etc/pki/tls/certs/(公開証明書ファイル)  
　/etc/pki/tls/private/(秘密鍵ファイル)

/etc/httpd/conf.d/ssl.confにあったデフォルトの自己証明書の記述を参考に後者（/etc/pki/tls）を選択した（RockyLinuxではこちらが正解らしい　
前者は「Debian系ディストリビューション（例：Ubuntu）で一般的に使用される」とChatGPTは教えてくれた）
```
$ grep -A 3 Apache /etc/httpd/conf.d/ssl.conf
#  Apacheのインストール時に自己証明書として自動生成
#SSLCertificateFile /etc/pki/tls/certs/localhost.crt
#  hogeweb用の自己証明書 2025/01/14
SSLCertificateFile /etc/pki/tls/certs/hogeweb.tokyo.crt
--
#  Apacheのインストール時に自己証明書として自動生成 
#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
#  hogeweb用の秘密鍵 2025/01/14
SSLCertificateKeyFile /etc/pki/tls/private/hogeweb.tokyo.key
```
### SELinuxの設定
テスト環境でもSELinuxをEnableにしているので、正しいコンテキストを設定しないと、httpdサービスの起動時にエラーになる
```
# 証明書と秘密鍵に正しいコンテキストを設定
sudo semanage fcontext -a -t cert_t "/etc/pki/tls/certs/hogeweb.tokyo.crt"
sudo semanage fcontext -a -t cert_t "/etc/pki/tls/private/hogeweb.tokyo.key"
```
### Apacheの設定
ApacheのSSL設定ファイルを編集して、証明書と秘密鍵のパスを指定する。
```
sudo vi /etc/httpd/conf.d/ssl.conf
```
設定ファイル内で、SSLCertificateFileとSSLCertificateKeyFileの既存の行をコメントアウトして、下記の内容を追記する。
```
SSLCertificateFile /etc/pki/tls/certs/hogeweb.tokyo.crt
SSLCertificateKeyFile /etc/pki/tls/private/hogeweb.tokyo.key
```
### httpdサービスの再起動
```
sudo systemctl restart httpd
```

コンテナでWebサービスを起動する環境でのサーバ証明書のテストなので、httpdサービスの自動起動はあえて行っていません。
### ブラウザからの動作確認
ブラウザからローカルIPを指定してアクセスしてhttps接続を確認した
![スクリーンショット 2025-01-15 13.34.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45016/fbc7719d-3539-6b9c-b6e0-54951d999cdd.png)