背景
本番運用では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サービスの自動起動はあえて行っていません。