Apache httpdで作るHTTPSサーバ

# はじめに
Webサーバとして非常に一般的に使われているApache httpdを利用して、HTTP/HTTPS接続のできるWebサーバを構築する練習をします。
OSはCentOS 7.4、Apacheのバージョンは2.4.6です。

# HTTPサーバができるまで
## Apacheのインストール
CentOSデフォルトのリポジトリに入っていますので、yumを使ってインストールしていきましょう。

```text
# yum -y install httpd
# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Oct 19 2017 20:39:16
```

## さっそく起動
インストールできたのですぐに起動して試しましょう。

```text
# systemctl start httpd
# systemctl is-active httpd
active
```

起動しているようです。ブラウザから接続してみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/b5971ca8-fa26-b96e-47fd-752c4100f476.png)
うまくいきましたね！

# HTTPSサーバができるまで
## SSLモジュールのインストール
続いてメインの、HTTPSサーバ構築です。ApacheでHTTPS機能を使うにはmod_sslというモジュールが必要になりますので、まずはこれをインストールしましょう。

```text
# yum -y install mod_ssl
# httpd -M |grep ssl
 ssl_module (shared)
```

## 秘密鍵とサーバ証明書の作成
SSLハンドシェイクに使用する秘密鍵を作成します。秘密鍵はopenssl genrsaコマンドで作成できますので、これをリダイレクトしてkeyファイルを作ります。

```text
# openssl genrsa > server.key
Generating RSA private key, 2048 bit long modulus
...........+++
..........................+++
e is 65537 (0x10001)
```

続いてCSRファイルを作成します。CSRファイルは認証局にサーバ証明書を発行してもらう時に使用するファイルで、openssl req -new -key \<privatekeyfile>コマンドで作成できます。こちらもリダイレクトしてファイルに書き出しましょう。このコマンドは対話式なので本来は真面目にFQDN等を入れないといけないのですが、練習なのですべてEnterで飛ばします。

```text
# 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 []:
```

できました。さて、最後にサーバ証明書です。本来ならこのCSRファイルを認証局に渡して署名してもらう必要があるのですが、無料でやりたいので自分で署名してしまいます。先ほど作成したCSRを入力として、以下のコマンドを実行します。

```text
# openssl x509 -req -signkey server.key < server.csr > server.crt
Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd
Getting Private key
```

無事、証明書（server.crt）ができました。CSRはこの段階で削除してしまって大丈夫です。

```text
# rm server.csr
```

## 秘密鍵とサーバ証明書の配置
作成した鍵と証明書を/etc/httpd/以下に配置していきます。どこに配置するかには明確な決まりがないようですが、/etc/httpd/conf/ssl.keyおよび/etc/httpd/conf/ssl.crt配下に置くことにします。
参考：http://www.apache.com/how-to-setup-an-ssl-certificate-on-apache/

```text
# mkdir /etc/httpd/conf/ssl.key
# mkdir /etc/httpd/conf/ssl.crt
# mv server.key /etc/httpd/conf/ssl.key/
# mv server.crt /etc/httpd/conf/ssl.crt/
```

## SSLモジュールの設定
/etc/httpd/conf.d/ssl.confの中に、配置した鍵と証明書のパスを設定します。

```text
# vi /etc/httpd/conf.d/ssl.conf
```

以下のように修正します

```text
# SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt
# SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
```

完了したら、いよいよApacheを再起動して接続してみましょう。

```text
# systemctl restart httpd
# systemctl is-active httpd
active
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/b72e84d6-4d13-a0c4-29be-242b349d5a65.png)

できました！

# 感想
初めてApacheでHTTPSサーバの設定を行いました。思ったより大変でした。opensslコマンド周辺の理解がまだ浅いので、機会があれば掘り下げてみたいと思います。