Apache2.4でHTTPS通信を行うための環境構築手順と詰まりどころ

# はじめに
Web Speech APIを使ったアプリを作成しようとしたところ、セキュリティの関係でHTTPではマイクの許可がされませんでした。そこでHTTPS通信できる環境を構築しようと考えました。
SSL通信を行うためにSSLサーバ証明書を購入する必要がありますが、今回は自己証明書で代用します。
CentOS7.5にApache2.4をインストールするところから始めます。

# 詰まったこと
先に自分が詰まった部分を記載しておきます。

- ファイアウォールの設定をしていなかったこと
- SElinuxによるエラー

# HTTPサーバの構築
まずはHTTPサーバの環境を構築します。

## Apache2.4をインストール

yumを使ってインストールします。
CentOS6系は標準ではApache2.2までしかないので注意してください。

```
/* バージョン確認 */
# yum info httpd
...
バージョン          : 2.4.6
...

/* Apache2.4インストール */
# yum -y install httpd

# httpd -version
Server version: Apache/2.4.6 (CentOS)

/* 自動起動設定 */
# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

/* Apache起動 */
# systemctl start httpd.service
```

## ファイアウォールの設定
Apacheを起動したのにサイトが表示されないなと思っていたら、ファイアウォールで使用するポートの許可をしていませんでした。ついでにこの段階で443番ポートへの通信も許可しておきます。

```
/* firewalldにHTTP(80番ポート)への通信を許可する */
# firewall-cmd --add-service=http --zone=public --permanent
success

# firewall-cmd --reload
success

/* firewalldにHTTPS(443番ポート)への通信を許可する */
# firewall-cmd --add-service=https --zone=public --permanent
success

# firewall-cmd --reload
success
```
参考：[WEB ARCH LABO](https://weblabo.oscasierra.net/apache-installing-apache24-yum-centos7-1/)

# HTTPSサーバの構築
構築手順は以下のQiitaの記事を参考にしています。詳細な内容はこちらを参照ください。
参考：[Apache httpdで作るHTTPSサーバ](https://qiita.com/jinnai73/items/638dcc1434d47b12e6ba)

## sslのモジュールをインストール

```
# yum -y install mod_ssl
```

## 秘密鍵を作成

```
# openssl genrsa > server.key
```

## CSR（証明書署名要求）を作成
CSRは公開鍵の情報と組織の情報を含みます。

```
# 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]:JP  // 国名
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) []:XXX.XXX.XXX.XXX // ipアドレス
Email Address []:  // 空白

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
```

## サーバ証明書を作成

```
# openssl x509 -req -signkey server.key < server.csr > server.crt
```

## 作成した鍵と証明書を適当な場所に配置

```
# mkdir /usr/local/ssl
# mkdir /usr/local/ssl/private
# mkdir /usr/local/ssl/cers
# mv server.key /usr/local/ssl/private
# mv server.crt /usr/local/ssl/cers

/* csrファイルの削除 */
# rm server.csr
```

## パーミッションを設定
秘密鍵や証明書は誤って変更しないよう、所有者にのみ読取可能権限を付与します。
他のグループは一切の権限を付与しません。

```
# chmod 400 /usr/local/ssl/private
# chmod 400 /usr/local/ssl/cers
```

参考：[CSP SSL](https://cspssl.jp/support/apache/config.php)

## ssl.confを修正して鍵と証明書にパスを設定

```
# vi /etc/httpd/conf.d/ssl.conf
-----
# SSLCertificateFile /etc/pki/tls/certs/localhost.crt  // コメントアウト
SSLCertificateFile /usr/local/ssl/cers/server.crt  // 追加

# SSLCertificateKeyFile /etc/pki/tls/private/localhost.key  // コメントアウト
SSLCertificateKeyFile /usr/local/ssl/private/server.key  // 追加
-----

/* Apache再起動 */
# systemctl restart httpd
```

作業は以上で終了です。
ブラウザにhttps://[IPアドレス]を入力して、アクセスできるか確認してみてください。
アクセスできますが、自己証明書なのでWarningが表示されます。

----
**これより下は備忘録の為に残しています。
etc/httpd/conf以下に証明書と鍵を配置した場合に起こった事象です。

# Apache再起動時にエラーが発生
ssl.confを修正してパスを設定し、Apacheを再起動したところ、以下のエラーが発生しました。

> Syntax error on line 101 of /etc/httpd/conf.d/ssl.conf:
SSLCertificateFile: file '/etc/httpd/conf/server.crt' does not exist or is empty

しかしパスは正しく、server.crtの中身も確かに存在します。
原因を調査したところ、SELinuxのアクセス制御機能が原因のようでした。

解決するためには次の方法があります。

1. SELinuxの無効化（非推奨）
2. 適切なSELinuxのポリシーを設定する


### 1. SELinux無効化（非推奨）
1つめはセキュリティ上よろしくないので非推奨です。
SELinuxをdisabledにします。

```
# vi /etc/selinux/config
-----
SELINUX=disabled
-----

/* 再起動 */
# reboot
```

### 2. 適切なSELinuxのポリシーを設定する
2つ目は適切なSELinuxのポリシーを設定する方法です。
参考：[SELinux を使おう．使ってくれ](https://qiita.com/chi9rin/items/af532d0dd9237cc65741)

```
/*SELinuxのstatusを確認*/
# getenforce
Enforcing

/* タイプの確認 */
# ls -laZ /etc/httpd/conf
新規作成したディレクトリのタイプがunconfined_u...になっている

/* タイプの修正 */
# restorecon -RF /etc/httpd/conf

/* タイプの確認 */
# ls -laZ /etc/httpd/conf
新規作成したディレクトリのタイプがsystem_u...になっている

/* Apache再起動 */
# systemctl restart httpd
```

こうすることでエラーが解消され、HTTPSにアクセス可能となりました。

参考：
[Ssl証明書を設定したらapacheが起動しない？](https://www.slideshare.net/denet1999/sslapache)
[SELinuxの無効化](https://qiita.com/hanaita0102/items/5d3675e4dc1530b255ba)