Ubuntu + Apache2.4 で 443 ポート以外で SSL 通信（https）を有効化する方法

# はじめに

今回は、Ubuntu の Apache2 で https の通信を 443 以外の通信ポート（例えばポート 443 を許さずポート 8443 でアクセスできるようにする）で Web サーバにアクセスできるようにするやり方を紹介します。

前回記事 [Ubuntu 20.04LTS の Apache + Flask で Let's Encrypt の SAN 証明書を作成・更新する話（更新できなかった問題を解決）](https://qiita.com/maru_ocu/items/29c0d73bb3e4805f1906) と同じです。

**前提として、80 ポートと 443 ポートを用いて SSL 証明書を Let's Encrypt で取得した後の話となります**（ですので、SSLCertificateFile や SSLCertificateKeyFile の .pem ファイルはすでに VirtualHost の 443 の部分に記述されている前提となります）。

# 環境・バージョン等

### Ubuntu / Apache2 バージョン
```shell
$ cat /etc/issue
Ubuntu 20.04.6 LTS \n \l

$ apache2 -v
Server version: Apache/2.4.41 (Ubuntu)
Server built:   2023-03-08T17:32:54
```

### Web サーバ IP アドレス
`172.20.30.40`

### Web サーバドメイン
`abc.example.com` と `www.abc.example.com`

# 手順
1. `/etc/apache2/sites-available` に `abc.example.com.conf` ファイルを作成する。
2. 以下のように `abc.example.com.conf` ファイルを記述する。
    具体的には、`<VirtualHost 172.20.30.40:443>` と同じ内容で `<VirtualHost 172.20.30.40:8443>` を記述する。
    ```conf:/etc/apache2/sites-available/abc.example.com.conf
    <VirtualHost 172.20.30.40:80>
    	ServerAdmin webmaster@localhost
    	DocumentRoot /var/www/html
    	
    	ServerName abc.example.com
    	ServerAlias www.abc.example.com
    	DocumentRoot /var/www/html
    	ServerAdmin hoge@hoge.ac.jp
    	<Directory /var/www/html>
    	Options FollowSymLinks
    	AllowOverride All
    	AddType text/html .html
    	AddType text/html .html
    	Require all granted
    	 </Directory>
    	ErrorLog ${APACHE_LOG_DIR}/error.log
    	CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    </VirtualHost>
    <IfModule mod_ssl.c>
    	<VirtualHost 172.20.30.40:443>
    		ServerAdmin webmaster@localhost
    
    		DocumentRoot /var/www/html
    		ServerAdmin hoge@hoge.ac.jp
         
    		DocumentRoot /var/www/html
    		<Directory /home/www/html>
    		Options FollowSymLinks
    		AllowOverride All
    		AddType text/html .html
    		AddType text/html .htm
    		Require all granted
    		</Directory>
    		
    		ErrorLog ${APACHE_LOG_DIR}/error.log
    		CustomLog ${APACHE_LOG_DIR}/access.log combined
    		SSLEngine on
    		<FilesMatch "\.(cgi|shtml|phtml|php)$">
    				SSLOptions +StdEnvVars
    		</FilesMatch>
    		<Directory /usr/lib/cgi-bin>
    				SSLOptions +StdEnvVars
    		</Directory>
    		ServerName	abc.example.com
    		ServerAlias www.abc.example.com
    
    		Include /etc/letsencrypt/options-ssl-apache.conf
    		SSLCertificateFile /etc/letsencrypt/live/abc.example.com/fullchain.pem
    		SSLCertificateKeyFile /etc/letsencrypt/live/abc.example.com/privkey.pem
    	</VirtualHost>
    	<VirtualHost 172.20.30.40:8443>
    		ServerAdmin webmaster@localhost
    
    		DocumentRoot /var/www/html
    		ServerAdmin hoge@hoge.ac.jp
         
    		DocumentRoot /var/www/html
    		<Directory /home/www/html>
    		Options FollowSymLinks
    		AllowOverride All
    		AddType text/html .html
    		AddType text/html .htm
    		Require all granted
    		</Directory>
    
    		ErrorLog ${APACHE_LOG_DIR}/error.log
    		CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    		<Proxy *>
            	Require all granted
            </Proxy>
    
            ProxyRequests Off
            ProxyPreserveHost On
    		SSLProxyEngine on
    		SSLEngine on
    
    		<FilesMatch "\.(cgi|shtml|phtml|php)$">
    				SSLOptions +StdEnvVars
    		</FilesMatch>
    		<Directory /usr/lib/cgi-bin>
    				SSLOptions +StdEnvVars
    		</Directory>
    
    
    		ServerName	abc.example.com
    		ServerAlias www.abc.example.com
    		Include /etc/letsencrypt/options-ssl-apache.conf
    		SSLCertificateFile /etc/letsencrypt/live/abc.example.com/fullchain.pem
    		SSLCertificateKeyFile /etc/letsencrypt/live/abc.example.com/privkey.pem
    	</VirtualHost>
    </IfModule>
    
    ```
3. （任意）ポート 443 での接続を禁止する場合は、`<VirtualHost 172.20.30.40:443>` の部分を削除（やコメントアウト）する。


# 参考
- <a href="https://httpd.apache.org/docs/2.4/ja/vhosts/examples.html">バーチャルホストの例 - Apache HTTP サーバ バージョン 2.4</a>