現象
とあるリポジトリをローカル環境で、Vagrant を使った VirtualBox で再現しようといたしました。ウェブサーバ、DB、PHP などの構築が終わり、最終確認です。
トップページ http://example.com/ から ID、パスワードを入力してログインすると、次のページ・処理である https://example.com/index.php/login/auth に飛ぶものの、Not Found エラーとなってしまいました><。
Apache mod_ssl の SSL 設定を見直し、解決できましたのでその作業内容を記録いたします。
ポイント
- 秘密鍵 (Private Key)、サーバ証明書 (CRT) を自前で用意することで解決できた。
- いわゆるオレオレ証明書を作成した。
- オレオレ証明書の場合は、外部機関とやり取りすることなく、自サーバ内のみだけで作業を完結できる。
- 使用するのは
openssl
- 第3者機関の認証は受けていないため、当然ながらウェブブラウザでアクセス時にはその旨のエラーが表示される。
状況
- 1つのサーバにバーチャルホストで2つのウェブサービスを構築
- それぞれのドキュメントルート
- /var/www/html/example/admin
- /var/www/html/example/user
- SSL 設定は、/var/www/app/applications/admin/ssl.conf
最初の調査と思い当たったこと
[Fri May 27 17:08:28 2016] [error] [client 192.168.56.1] script '/var/www/html/index.php' not found or unable to stat, referer: http://example.com/
となるので、https が正常に設定されておらず、ドキュメントルートが誤ったパスで認識されていると感じました。
現状、openssl、mod_ssl は導入済みです。一方で SSL 設定は無視して何もしておりませんでした。これが原因と仮定して進めていきましたの。
SSL 設定とエラー
/var/www/app/applications/admin/ssl.conf を httpd.conf で読み込むように設定いたしました。
すると、次のエラーとなり、httpd が起動しませんでしたわ><。
# sed -i -e 's|Include conf.d/\*.conf|Include conf.d/\*.conf\nInclude /var/www/app/applications/admin/\*.conf|' /etc/httpd/conf/httpd.conf # service httpd restart httpd を停止中: [ OK ] httpd を起動中: [Fri May 27 17:13:11 2016] [warn] module ssl_module is already loaded, skipping Syntax error on line 112 of /var/www/app/applications/admin/ssl.conf: SSLCertificateFile: file '/etc/pki/oreore/server.crt' does not exist or is empty [失敗] #
デフォルトの /etc/httpd/conf.d/ssl.conf と /var/www/app/applications/admin/ssl.conf を両方読み込んだことで重複が発生しているようですわ。
また、最後の行を見ますと、crt ファイルを用意すればよいかしら。また、対となる key ファイルも作りましょうね♪
参考ページ
にしたがってすすめました。シンプルな手順と、丁寧な解説が合わさった良いページですわ♪
作成するもの
- サーバ証明書 (CRT): server.crt
- 秘密鍵 (Private Key): server.key
ポイントとなるコマンド
# 秘密鍵 (Private Key) を作成 openssl genrsa 2048 > server.key # 証明書署名要求 (CSR) を作成 openssl req -new -key server.key > server.csr # サーバ証明書(CRT) を作成 openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt
作業の記録
# # 秘密鍵 (Private Key) を作成 # openssl genrsa 2048 > server.key Generating RSA private key, 2048 bit long modulus ..............................+++ ...............................+++ e is 65537 (0x10001) # # # 証明書署名要求 (CSR) を作成 # 次のコマンドで入力が必要となるが、ただ Enter を押していった。 # openssl req -new -key server.key > server.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]: State or Province Name (full name) []: Locality Name (eg, city) [Default City]: Organization Name (eg, company) [Default Company Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []: Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: # # # サーバ証明書(CRT) を作成 # openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt Signature ok subject=/C=XX/L=Default City/O=Default Company Ltd Getting Private key # # ll 合計 32 ... 略 ... -rw-r--r-- 1 root root 1103 5月 27 17:30 2016 server.crt -rw-r--r-- 1 root root 952 5月 27 17:29 2016 server.csr -rw-r--r-- 1 root root 1675 5月 27 17:28 2016 server.key ... 略 ... #
バーチャルホストで 2 つのウェブサービスがございますが、SSL も両方のウェブサービスの設定がございました。
各ウェブサービスの設定を見てみますと、両方共同じ秘密鍵、サーバー証明書を使用しておりましたので、それぞれ 1 つずつ作成するだけで済みましたわ♪
秘密鍵および証明書の設置
/var/www/app/applications/admin/ssl.conf/ssl.conf には次のように記述されておりました。
... 略 ... SSLCertificateFile /etc/pki/oreore/server.crt ... 略 ... SSLCertificateKeyFile /etc/pki/oreore/server.key ... 略 ...
よって作成した証明書と鍵をこの場所に置いましょう。
また、server.csr は不要なため、削除いたします。
mkdir -p /etc/pki/oreore/ mv server.crt /etc/pki/oreore/server.crt mv server.key /etc/pki/oreore/server.key rm -f server.csr
Apache 再起動
無事起動しました!ただ、メッセージが気になりますの。。。
# service httpd restart httpd を停止中: [ OK ] httpd を起動中: [Fri May 27 17:39:33 2016] [warn] module ssl_module is already loaded, skipping httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName [Fri May 27 17:39:33 2016] [warn] VirtualHost 192.168.56.111:443 overlaps with VirtualHost 192.168.56.111:443, the first has precedence, perhaps you need a NameVirtualHost directive [Fri May 27 17:39:33 2016] [warn] NameVirtualHost *:443 has no VirtualHosts (98)Address already in use: make_sock: could not bind to address [::]:443 [ OK ] #
実際にウェブブラウザからアクセスしてみますと、http も https も繋がらなくなってしまいました><。。。
原因を探る
ログなどを確認いたしました。
# httpd -S [Fri May 27 17:44:06 2016] [warn] module ssl_module is already loaded, skipping httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName [Fri May 27 17:44:06 2016] [warn] VirtualHost 192.168.56.111:443 overlaps with VirtualHost 192.168.56.111:443, the first has precedence, perhaps you need a NameVirtualHost directive [Fri May 27 17:44:06 2016] [warn] NameVirtualHost *:443 has no VirtualHosts VirtualHost configuration: 192.168.56.111:443 example.com (/var/www/app/applications/admin/ssl.conf:80) wildcard NameVirtualHosts and _default_ servers: *:80 is a NameVirtualHost default server example.com (/etc/httpd/conf.d/example.conf:1) port 80 namevhost example.com (/etc/httpd/conf.d/example.conf:1) port 80 namevhost admin.example.com (/etc/httpd/conf.d/example.conf:28) *:443 is a NameVirtualHost default server localhost.localdomain (/etc/httpd/conf.d/ssl.conf:74) port 443 namevhost localhost.localdomain (/etc/httpd/conf.d/ssl.conf:74) Syntax OK #
# tail /var/log/httpd/error_log [Fri May 27 17:51:22 2016] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec) [Fri May 27 17:51:22 2016] [warn] Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366) [Fri May 27 17:51:22 2016] [warn] module ssl_module is already loaded, skipping #
# service httpd status httpd は停止しています # service httpd start httpd を起動中: [Fri May 27 18:11:40 2016] [warn] module ssl_module is already loaded, skipping httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName [Fri May 27 18:11:40 2016] [warn] VirtualHost 192.168.56.111:443 overlaps with VirtualHost 192.168.56.111:443, the first has precedence, perhaps you need a NameVirtualHost directive [Fri May 27 18:11:40 2016] [warn] NameVirtualHost *:443 has no VirtualHosts (98)Address already in use: make_sock: could not bind to address [::]:443 [ OK ] # service httpd status httpd は停止していますがサブシステムがロックされています #
「httpd は停止していますがサブシステムがロックされています」がなんとかなれば良さそうですわね。
エラーは無いが警告が幾つかある。一つ一つ対処していってみます。
[warn] module ssl_module is already loaded, skipping
まずはこれですの。
改めて確認してみますと、ssl.conf を2つ読み込んでおります。
- /etc/httpd/conf.d/ssl.conf
- /var/www/app/applications/admin/ssl.conf
デフォルトで存在していた ssl.conf を ssl.conf.org へリネームし、読み込ませないようにいたしました。
結果、これで直りましたの!
# mv /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.org # service httpd restart httpd を停止中: [ OK ] httpd を起動中: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName [Fri May 27 18:16:33 2016] [warn] VirtualHost 192.168.56.111:443 overlaps with VirtualHost 192.168.56.111:443, the first has precedence, perhaps you need a NameVirtualHost directive [Fri May 27 18:16:33 2016] [warn] NameVirtualHost *:443 has no VirtualHosts [Fri May 27 18:16:33 2016] [warn] NameVirtualHost *:443 has no VirtualHosts [ OK ] # service httpd status httpd (pid 2851) を実行中... #
既存の http はもちろん、https のページも遷移することができるようになりましたわ!
警告は残っておりますが、今回はこれでおしまいといたします♪
おわりに
Apache の設定は、初回のみ手を加えるだけで、頻繁に修正いたしません。ですのでエラーが発生した時は解決するまで時間がかかることがほとんどですの。
今回は、秘密鍵とサーバ証明書の導入、ssl.conf の読み込みを 1 つだけにすることで解決できました。
解決するために行ったことは、文章にしてみますとほんの少しだけです。ですけれども取り組んでいるときは多くの作業をしているような感覚になります。
次同じ問題にあたった時は、解決のポイントをすぐに試せるようにしたく、今回ノートいたしました。
以上です。