Apache HTTP ServerでSSL通信する

#目的
linux環境に構築したApache HTTP Serverに対し、SSL通信を行います。
SSLで使用する証明書は自己証明書を作成して使用します。
Webサーバの構築手順は[こちら](https://qiita.com/kaburankattara/items/b662ea5b049a3d13c3e5)をベースにします。

#環境
Iaas：AWS EC2
OS：RHEL-7.6_HVM_GA-20190128-x86_64-0-Hourly2-GP2（コミュニティ AMI）
Apache：2.4.6

#ApacheにSSLモジュールを追加する
###1. SSLモジュールをインストール
yumコマンドでインストールします。
完了のメッセージが表示されれば成功です。

```
$ sudo yum -y install mod_ssl
・
・
インストール:
  mod_ssl.x86_64 1:2.4.6-97.el7_9                                                                                                                                                                              

完了しました!
```

###2. インストールされたか確認
インストール済みのパッケージを検索し、SSLモジュールがあることを確認します。

```
$ sudo yum list installed | grep mod_ssl
mod_ssl.x86_64                     1:2.4.6-97.el7_9         @rhui-REGION-rhel-server-releases
```

#SSL通信で使用する秘密鍵と証明書を作成する
###1.秘密鍵とCSR（証明書発行要求）を作成
opensslコマンドで秘密鍵とCSR（証明書発行要求）を作成します。
コマンド実行後、パスフレーズや国名などの入力を求められますので、任意で値を入力していきます。
※今回は必須項目のみ指定しています

```
$ openssl req -new -out localhost.csr
Generating a 2048 bit RSA private key
.................+++
........................+++
writing new private key to 'privkey.pem'
[Enter PEM pass phrase:任意のパスフレーズを入力
[Verifying - Enter PEM pass phrase:
-----
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) []:Kanagawa　←都道府県名を指定します
[Locality Name (eg, city) [Default City]:Kawasaki　←市区町村名を指定します
[Organization Name (eg, company) [Default Company Ltd]:SampleOrg　←組織名を指定します
[Organizational Unit Name (eg, section) []:System1　←部門名を指定します
[Common Name (eg, your name or your server's hostname) []:sample.jp　←一般名称を指定します
[Email Address []:

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

lsコマンドで秘密鍵とCSR（証明書発行要求）を作成出来ていれば成功です。

```
$ls
localhost.csr  privkey.pem
```

###2.作成した秘密鍵を使用し、自己署名した証明書を作成
先程作成した秘密鍵とCSRファイルを使用して自己署名した証明書を作成します。
※コマンドを実行するとパスフレーズが求められますので、秘密鍵とCSRファイルを作成したときに指定したパスフレーズを入力します。

```
$ openssl x509 -in localhost.csr -out localhost.crt -req -signkey privkey.pem -days 365
Signature ok
subject=/C=JP/ST=Kanagawa/L=Kawasaki/O=SampleOrg/OU=System1/CN=sample.jp
Getting Private key
Enter pass phrase for privkey.pem:指定した任意のパスフレーズ
```

#作成した秘密鍵と証明書をApacheに設定する
SSLモジュールの設定ファイルとなるssl.confを確認します

```
$ sudo vi /etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
```

今回、秘密鍵と証明書をssl.confのデフォルト指定と同じのファイル名にしているので、それぞれの配置先にファイルを移動します。

```
$ sudo mv privkey.pem /etc/pki/tls/private/localhost.key
$ sudo mv localhost.crt /etc/pki/tls/certs/localhost.crt
```

#http通信を無効化する
SSL通信を使用するため、通常のhttp通信でアクセス出来ないようにhttpd.confのListenディレクティブをコメントアウトしておきます。

```
$ sudo vi /etc/httpd/conf/httpd.conf

#Listen 80
```

#SELINUXの実行モードをpermissiveに変更する
実行モードがenforcingの場合、指定した証明書等に適切な権限設定をしないとApacheの起動でエラーになります。
そのため、SELinuxポリシーを強制せず、ログに記録するpermissiveに実行モードを変更する。

```
$ sudo vi /etc/selinux/config
SELINUX=permissive    

$ sudo shutdown -r now
```

#Apacheを再起動する
コマンドを実行するとパスフレーズが求められますので、秘密鍵とCSRファイルを作成したときに指定したパスフレーズを入力します。

```
$ sudo systemctl restart httpd
Enter SSL pass phrase for ip-172-31-37-255.ap-northeast-1.compute.internal:443 (RSA) : 指定したパスフレーズ

$ sudo systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 日 2021-03-21 04:22:12 UTC; 7s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 4131 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
           ├─4131 /usr/sbin/httpd -DFOREGROUND
           ├─4137 /usr/sbin/httpd -DFOREGROUND
           ├─4138 /usr/sbin/httpd -DFOREGROUND
           ├─4139 /usr/sbin/httpd -DFOREGROUND
           ├─4140 /usr/sbin/httpd -DFOREGROUND
           └─4141 /usr/sbin/httpd -DFOREGROUND

 3月 21 04:22:10 ip-172-31-37-255.ap-northeast-1.compute.internal systemd[1]: Starting The Apache HTTP Server...
 3月 21 04:22:12 ip-172-31-37-255.ap-northeast-1.compute.internal systemd[1]: Started The Apache HTTP Server.
```

#終わりに
以上でブラウザからhttpsプロトコルで通信が可能になり、http通信が不可になります。

#参考文献

https://httpd.apache.org/docs/2.4/ja/ssl/ssl_howto.html

https://qiita.com/takech9203/items/5206f8e2572e95209bbc

https://www.geotrust.co.jp/support/ssl/csr/apache_openssl_new.html