認証局でSSL証明書を発行してHTTPS化する方法

前回は無料でSSL証明書発行できるLet’s Encryptを使用してSSL通信に対応してみました。

[Let's Encryptを使って無料でHTTPS通信をできるようにした【ワイルドカード対応】](https://qiita.com/rod_creative/items/68f568ea697f68d31192)

セキュリティ面についてはLet's Encryptも有償認証局も変わりないので、自分で運営しているサービスなどでは上記で十分だと思いますが、企業では名の通った認証局を採用したいとか、認証レベルの高い「企業認証」「EV認証」を使用したいということもあると思います。
※Let's Encryptは「ドメイン認証」です。
ということで今回は一般的な認証局に発行してもらったSSL証明書でHTTPS化する方法をまとめてみました。

# 環境
今回もCentOS7.5にインストールしました。

# 手順

それでは認証局に証明書を発行して貰って設置していきます。
まず初めにですが、今回はOpenSSLを使用します。
OpenSSLはCentOSをデフォルト設定でインストールするとインストールされるので、まずはOpenSSLがインストールされているかどうか確認してみましょう。

```
# rpm -qa | grep openssl
openssl-libs-1.0.2k-12.el7.x86_64
```

上記のように表示されたら既にインストールされています。
もし何も表示されなければyumでインストールしましょう。

```
# yum install openssl
```

また、まだSSL通信の設定が出来ていない方は前回の記事を参照して設定してみてください。

[ApacheにSSLモジュールmod_sslをインストールする](https://qiita.com/rod_creative/items/68f568ea697f68d31192#apache%E3%81%ABssl%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%ABmod_ssl%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)

## CSRの作成

では最初にCSRの作成をします。
CSRはSSL証明書発行に必要なテキストデータで、組織名、部署名、公開鍵やコモンネーム（FQDN）などが含まれています。
認証局はこれを見て、申し込み情報と精査してSSL証明書を発行します。

### 秘密鍵ファイルの作成

まずはCSRを作成するのに秘密鍵ファイルを作成します。
この秘密鍵はとても大事なもので、他の誰にも知られてはいけません。
これをCSR作成時に使用することでCSRに公開鍵を埋め込みます。
では以下のコマンドで秘密鍵を作成してみましょう。

```
# openssl genrsa -aes256  -out server.key

Enter pass phrase for server.key: (任意のパスワードを入力)
Verifying - Enter pass phrase for server.key: (もう一度パスワードを入力)
```

上記パスワードを入力するとカレントディレクトリに秘密鍵ファイル「server.key」ができます。
今回は暗号化方式 「aes256」を使用して公開鍵長「2048bit」の秘密鍵ファイルを作成しました。

### CSRの作成

そして作成した秘密鍵ファイルからCSRを生成します。

```
# openssl req -new -key server.key -out server.csr

Enter pass phrase for server.key: (秘密鍵のパスワードを入力)
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 (JPと入力)
State or Province Name (full name) []:Kanagawa (都道府県名をローマ字表記で入力)
Locality Name (eg, city) [Default City]:Yokohama (市区町村名をローマ字表記で入力)
Organization Name (eg, company) [Default Company Ltd]:xxx Inc. (会社名、団体名などを英語組織名で入力)
Organizational Unit Name (eg, section) []:develop (部署名など任意の文字列を入力)
Common Name (eg, your name or your server's hostname) []: www.example.jp(証明書を導入するサイトのドメインを入力)
```

といろいろ聞かれるので入力します。
最後の以下はEnterで飛ばして良いです。

```
Email Address []:
A challenge password []:
An optional company name []:
```

これでカレントディレクトリにCSRファイル「server.csr」が出来たと思います。
これを認証局に提出してSSL証明書を発行して貰います。

## 認証局に証明書を発行してもらう

先ほど作成したCSRをもとに、認証局にSSL証明書を作成して貰います。
認証局は要件に応じて選定してください。
Googleで「SSL証明書」などと検索すると沢山広告が出てきます。
例えば以下のサイトのような色んな認証局を比較して購入できる業者もありますので覗いてみてください。

[サイフにやさしいSSL証明書](https://www.slogical.co.jp/ssl/)

## 証明書のインストール

認証局にSSL証明書を作成して貰えましたか？
認証局でSSL証明書を作成して貰うとメールなどで証明書ダウンロードの案内が来ると思います。
認証局の案内に従って以下をダウンロードしてください。

- 中間CA証明書
- SSL証明書

中間CA証明書はSSL証明書を作成した認証局の証明書です。
この中間証明書でSSL証明書を発行した認証局の署名を認証するのです。
また、この認証局は誰が認証するのかというと認証局自身になります。
この認証局を信頼する為にはブラウザにルート証明書というのが登録されている必要があるのですが、有償の認証局は名の知れた信頼できる存在なので、世界中のブラウザにもともとインストールされているわけです。

説明が長くなりましたが、最後にサーバーに証明書をインストールしましょう。

### 中間CA証明書、SSL証明書、秘密鍵の設置

最初に作成した秘密鍵、認証局からダウンロードした中間CA証明書、SSL証明書をサーバーにアップロードしてください。
今回は以下におきました。

`
/etc/pki/tls/certs/server.cer
/etc/pki/tls/private/server.key
/etc/pki/tls/certs/PUBCAG3.cer
`
### SSL設定ファイルの編集

SSL設定ファイルに先ほどアップロードしたファイルのパスを設定してください。
通常は`/etc/httpd/conf.d/ssl.conf`になります。


| 証明書       |     設定名 |    設定値    |
|:-----------------:|:------------------|:------------------|
| SSL証明書|SLCertificateFile |フルパス|
| 秘密鍵ファイル|SSLCertificateKeyFile |フルパス|
| 中間CA証明書|SSLCertificateChainFile |フルパス|

以下の様な記述になります。

```ssl.conf
SSLCertificateFile /etc/pki/tls/certs/server.cer
SSLCertificateKeyFile /etc/pki/tls/private/server.key
SSLCertificateChainFile /etc/pki/tls/certs/PUBCAG3.cer
```

### 秘密鍵からパスフレーズを取り除く（任意）

こちらは任意ですが、再起動するたびに秘密鍵のパスフレーズを聞かれるのでパスワードを取り除きます。
以下のコマンドを入力してパスフレーズを聞かれるのでパスフレーズを入力します。

```
openssl rsa -in server.key -out server.key
```


### Apacheを再起動して設定を反映する

最後に設定を反映する為にApacheを再起動します。

```
# systemctl restart httpd
```

これで、設定は終了です。
ブラウザからアクセスしてSSL通信ができているかを確認してみてください。
証明書には有効期限がありますので次回からは期限が切れる前に証明書を再発行して再配置してください。