質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1482閲覧

Ubuntu20.04+Apache2.4でhttps通信ができない

shiiiike

総合スコア9

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2023/11/16 17:43

実現したいこと

  • HTTPS通信を行えるようにしたい

現状

  • 独自ドメインを利用している
  • 証明書も独自ドメインのものを利用している
  • HTTP通信は問題なく行えている
  • HTTPS通信ができていない(443ポートが開いていない模様)
  • chromeでは「このサイトにアクセスできません。<ドメイン> で接続が拒否されました。」と表示される

Webサービスを始めるにあたり、Webサーバーの構築を行っています。
今までに同様の経験がなく、調べてはみたものの原因がわからず質問させていただきます。
初歩的な見落としかもしれませんが、皆様のお気づきの点があればお力添えいただければ幸いです。

実施済みのこと

ファイアウォールの設定
# 一覧の確認 $ sudo ufw app list # 80,443ポートの許可 $ sudo ufw allow 'Apache Full' #ファイアウォールの有効化 $ sudo ufw enable # 設定の確認 $ sudo ufw status
PHPと関連パッケージのインストール
# 依存関係のパッケージインストール $ sudo apt install software-properties-common ca-certificates lsb-release apt-transport-https # PHPインストール $ sudo apt install php7.4 # モジュール全てのインストール $ sudo apt install php7.4-mysql php7.4-common php7.4-mbstring php7.4-json php7.4-xml php7.4-zip php7.4-curl php7.4-intl php7.4-apcu php7.4-opcache
php.iniの編集
$ cd /etc/php/7.4/apache2 $ sudo cp php.ini php.ini.org $ sudo vi php.ini #変更後 error_log = /var/log/php.log mbstring.language = Japanese mbstring.internal_encoding = UTF-8 mbstring.http_input = auto mbstring.detect_order = auto expose_php = Off date.timezone = Asia/Tokyo
Apacheのインストール
$ sudo apt install apache2
Apache php7.4モジュールをアクティブ化し、Apacheを再起動
$ sudo a2enmod php7.4 $ sudo systemctl restart apache2
Apache・SSLの設定
$cd /etc/apache2/sites-available/ $sudo cp default-ssl.conf mywebssl.conf $sudo vi mywebssl.conf ~~ 編集 ~~

mywebssl.conf

1<VirtualHost *:80> 2 ServerName 独自ドメイン 3 ServerAlias 独自ドメイン 4 5 DocumentRoot /var/www/html 6 <Directory /var/www/html> 7 Options FollowSymLinks MultiViews SymLinksIfOwnerMatch 8 AllowOverride All 9 Require all granted 10 </Directory> 11</VirtualHost> 12<IfModule mod_ssl.c> 13 <VirtualHost *:443> 14 ServerName 独自ドメイン 15 ServerAlias 独自ドメイン 16 DocumentRoot /var/www/html 17 SSLEngine on 18 SSLCertificateChainFile /etc/ssl/certs/chain.cer 19 SSLCertificateFile /etc/ssl/certs/証明書.pem 20 SSLCertificateKeyFile /etc/ssl/private/秘密鍵.key 21 <Directory /opt/eccube> 22 Options FollowSymLinks MultiViews SymLinksIfOwnerMatch 23 AllowOverride All 24 Require all granted 25 </Directory> 26 </VirtualHost> 27</IfModule>
そのほか
  • 証明書の設置を行いました。

試したこと

ブラウザで接続
  • HTTP通信:問題なくindex.htmlが表示される
  • HTTPS通信:「このサイトにアクセスできません。<ドメイン> で接続が拒否されました。」と表示される(chrome)
curlで接続
ファイアウォールの無効後にcurlで接続(HTTPS)

原因がわからぬまま1日を費やしてしまいました。
些細なことでも構いませんので、お知恵をお貸しいただければ幸いです。

補足情報(FW/ツールのバージョンなど)

  • Ubuntu:20.04
  • Apache:2.4
  • PHP:7.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2023/11/16 18:26

Q1: VPS等他人管理の物を借りてその中のOSですか? あるいは自分所有の今目の前にあるPC内のOSですか? あるいはその他? あと、スキルレベルが分からないので、当たり前のことも聞きますが、 Q2: mywebssl.conf編集後に再起動かリロードしていますよね? Q3: netstatやssコマンドで、443ポートで待ち受けていることは確認していますか? Q4: > curl https://localhost/ 実際に実行したコマンドは、localhostじゃなくて証明書を取得しているホスト名ですよね? Q5: curl https://ホスト名 は、ローカル(Ubuntu20.04+Apache2.4 の OS)で実行した結果ですか?それともリモート(他OS)からですか?
shiiiike

2023/11/17 00:18

ご質問いただきありがとうございます。 おかげさまで、少し前進することができました。詳細を以下に回答させていただきます。 Q1: サーバー自体はAWSのEC2にて作成しています。 Q2: `mywebssl.conf`の作成後にApacheの再起動を行っています。 Q3: $ ss -atn | grep LISTEN にて確認したところ、443ポートがLISTENしていませんでした。 原因がわからなかったので、ひとまず`/etc/apache2/ports.conf`に直書きで`Listen 443`を記載し、 Apacheを再起動し`curl https://localhost/`にて動作を確認したところ、 `error:1408F10B:SSL routines:ssl3_get_record:wrong version number`のエラーが帰ってきたので、SSLの設定がうまくいっていないのだと思いました。SSL周りをもう少し調べてみます。 Q4: 実際に実行したコマンドは`curl https://localhost/`です。 理由としては、内側のDNS設定をしておらず、実際の独自ドメインを指定してしまうと、通信経路が一度サーバーの外に出てしまい、 切り分け箇所が増えてしまうので、ドメインが違う旨のエラーが出ることを承知で、あえてlocalhostを指定して実行していました。 Q5: `curl https://localhost/`の実行環境はローカルでした。 私に関しての補足ですが、ネットワーク周りは少し知見があるのですが、Apacheの構築などの経験が少なくさらにたまにしか構築をしないので、毎度OSやApacheのバージョンが異なり、サーバー関連の知見が乏しいのが私の実情です。
otn

2023/11/17 03:21

> Q4 なるほど。ホスト名が違うとエラーが出ればSSL設定成功という判断ですね。/etc/hostsに書く手もあります。 > Q3 そういうエラーは知りませんが、多分、その方向で良いかと思います。
shiiiike

2023/11/17 13:02

解決することができました! 見つけてみれば初歩すぎるミスで情けない。 ご協力いただきありがとうございました!
guest

回答1

0

自己解決

一から手順をチェックし直し、適用されているApacheの設定各種を確認していたところ、
SSLに必要なモジュールの有効化が抜けていました。
そこで以下のコマンドにて、SSLを有効化したところ、HTTPS接続が可能になりました。

$ sudo a2enmod ssl

いろいろ参考にしたサイトたちを改めて見直したところ、/etc/apache2/sites-available/の設定にフォーカスしたブログなどは多いのですが、
初歩の初歩である上記のコマンドの説明がない記事が多かったように思います。
私もまだまだネットの手順を鵜呑みにしすぎているなぁと実感した一件でした。
皆様お騒がせいたしました。

投稿2023/11/17 13:00

shiiiike

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2023/11/17 14:07 編集

ああ、言おうかと思って結局言わなかったのですが、 「mywebssl.confの12行目と27行目のIfModuleを消してみろ」と。 これは書いておいた場合、①「もしSSLモジュールがロードされている時だけこの中のディレクティブを解釈して、ロードされてなかったら無視しろ」という意味です。 IfModuleを削除すると、②「もしSSLモジュールがロードされていれば問題なくSSL関係ディレクティブを解釈。ロードされていなかったらSSL関係のディレクティブが構文エラーになってApacheが起動しない」ということになります。 ①と②とどちらが望ましいかですが、少なくとも私は②です。 消してみろと言っておけば、構文エラーになってSSLモジュールが無いことがもっと早く判明したはず。 RedHat系だとmod_sslパッケージをインストールすると、デフォルトで LoadModule ssl_module modules/mod_ssl.so とSSLモジュールをロードする指示がconfファイルに入っているはずですが、debian系は違うんですね。SSLモジュールがロードされてないとは思わなかったけど、万が一と思って言うだけ言えば良かった。 ということで、設定ファイルでは、 「必要な定義であり、効かないままでApacheが上がってはいけない」という定義なら Ifmoduleで囲まないほうがいいです。 Apacheが上がる事が最優先で、一部の定義が効いても無視されてもどっちでもいいという定義なら囲んでも良いのですが、普通そう言うのはない。
shiiiike

2023/11/17 14:16

IfModuleの箇所はロード(起動時)に読み込まれる設定だったのですね!SSLを利用するときにだけ読み込まれるのだと勝手に考えていました。ただ言われてみれば最初に構成を読み込んで完成された環境上で動作するのが普通ですよね。 >SSL関係ディレクティブを解釈 Apacheって有効モジュール以外のディレクティブを構文エラーとして判断するんですね。 いろいろ初めて知ったことが多くて参考になりました! ありがとうございます!
otn

2023/11/21 01:09 編集

> Apacheって有効モジュール以外のディレクティブを構文エラーとして判断するんですね。 例えばPythonプログラムだと、import time しないで time.sleep(10) と書くと未定義エラーになるのと同じような話です。PATHを通さないと command not found とか。 > IfModuleの箇所はロード(起動時)に読み込まれる設定だったのですね!SSLを利用するときにだけ読み込まれるのだと勝手に考えていました。ただ言われてみれば最初に構成を読み込んで完成された環境上で動作するのが普通ですよね。 IfModule というか、confファイルはすべてApache起動時に読まれます(.htaccess はアクセス毎に読まれます)。Moduleは、confファイルの LoadModule によってApache起動時にロードされます。 IfModule は文字通り「モジュールがロードされていなければ無視しろ」の意味です。前述の通り、本番稼働用のconfファイルでは書かないでしょうね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問