SSL証明書更新をさせていただきました


# はじめに
担当している案件のSSL証明書の更新をこれまでに何度か行ってきたので、
どのような作業を行ったのか、そして更新をする上で確認項目としたものは何であるかをまとめさせていただきます。

環境はこちら

```
$ httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Apr  2 2020 13:13:23
```
## 更新時行った作業

1. CSR生成
2. サーバ証明書・中間証明書ファイル作成
3. 証明書ファイルアップロード
4. サーバ上で証明書差し替え
5. 問題なく更新されたのか確認

順番に説明します。

### 1. CSR (Certificate Signing Request) 生成
CSRとは、証明書発行の際に必ず必要となる証明書署名要求と呼ばれるものです。
CSRはサーバにて生成するのですが、その際秘密鍵が必要となります。
以下がCSR作成まで実際に使用したコマンドです。

```
       // シード値の生成
       # date >> mkssl.log; openssl md5 * > rand.dat

       // 秘密鍵の作成
       # openssl genrsa -rand rand.dat 2048 > example.co.jp.20200911.key

       // 秘密鍵からCSRの作成
       # openssl req -new -key xxxxxxxx.key -out example.co.jp.20200911.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) [AU]:
       State or Province Name (full name) [Some-State]:
       Locality Name (eg, city) []:
       Organization Name (eg, company) [Internet Widgits Pty Ltd]:
       Organizational Unit Name (eg, section) []:
       Common Name (eg, YOUR name) []:
       Email Address []: 

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

作成後、CSRの内容を確認したい場合は、
https://sstool.cybertrust.ne.jp/support_tool/index02.php
に、生成したCSRファイルの中身をコピペします。

### 2. 証明書・中間証明書ファイル作成
証明書を購入・もしくは再発行すると、証明書と中間証明書が以下のように記載されたメールが届きます。

証明書
-----BEGIN CERTIFICATE-----
省略
-----END CERTIFICATE-----

中間証明書
証明書
-----BEGIN CERTIFICATE-----
....
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
....
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
....
-----END CERTIFICATE-----

証明書、中間証明書は各々***(-----BEGIN CERTIFICATE-----)***から***(-----END CERTIFICATE-----)***
までをコピペしてテキストエディタに貼り付け、拡張子を***.crt***にして任意の名前で保存します。
既存の証明書と区別がつくように、名前の中に日付など入れるようにするとよいです。
例
サーバ証明書 : example.co.jp.20200911.crt
中間証明書 : inca-example.co.jp.202000911.crt

また、私たちが購入している証明書の販売元からは、中間証明書が3つ届き、毎回これを連結させて一つのファイルにして保存しています。
この時重要なことは***下から順に繋げる***ということ。(これは販売元によるかもしれませんが）
理由は詳しくはエラーになるからなのですが、詳細は後ほど説明します。

### 3. 証明書ファイルアップロード
サーバの証明書が保管されているsslディレクトリに、作成した証明書と中間証明書のファイルをSCPコマンドやFTPツールでアップロードしておきましょう。アップロード後、しっかり証明書のパーミッションを既存のものと合わせておきましょう。

```
# chmod 400 example.co.jp.20200911.crt
# chmod 400 inca-example.co.jp.202000911.crt
```


### 4. サーバ上で証明書差し替え

SSL証明書設定は /etc/httpd/conf.d/ssl.conf に記載されています。

```/etc/httpd/conf.d/ssl.conf
// サーバ証明書
SSLCertificateFile conf.d/ssl/example.co.jp.crt

// 秘密鍵
SSLCertificateKeyFile conf.d/ssl/example.co.jp.key

// 中間証明書
SSLCertificateChainFile conf.d/ssl/inca-example.co.jp.crt
```

※ちなみに Apache/2.4.8以降だとSSLCertificateChainFileはなくなるそうです。

サーバは、上記のパスに設置している証明書ファイルを読み込みます。
sslディレクトリに証明書を配置し、シンボリックリンクを切り替えて証明書を差し替える場合は以下のようになります。

```
// シンボリックリンク切り替え
# ln -fs example.co.jp.20200911.crt example.co.jp.crt
# ln -fs example.co.jp.20200911.key example.co.jp.key
# ln -fs inca-example.co.jp.20200911.crt inca-example.co.jp.crt
```
-fオプションは強制的に切り替えてしまいますので、ちゃんと確認してからコマンドを叩きましょう。
もしこの後のapache再起動後に証明書エラーが起きてしまったら、ここのシンボリックリンクを前回使用していた証明書に戻しましょう。

```
// シンタックスチェック
# /etc/init.d/httpd configtest
Syntax OK

// 再起動
# /etc/init.d/httpd graceful
```

### 5. 問題なく更新されたのか確認
証明書更新後確認すべき点

- サイトが閲覧できる
- 証明書期限の日付が更新されている
- ***証明書チェックサイトでCertificate Chainにエラーがないこと***

まずサイトが閲覧できることは確認しましょう。(Qiitaのドメインを例に使わせていただきます）
確認ができたら証明書が更新されていることを確認します。
![スクリーンショット 2020-09-11 16.31.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264765/4c70572b-a38c-9a86-8d34-874f791d27c1.png)
鍵マークをクリック > 証明書をクリック をして、証明書期限の日付が更新されていることやエラーが出ていないことを確認しましょう。

そして意外と忘れがちなのが、***証明書チェックサイト***での確認です。
https://ssltools.digicert.com/checker/views/checkInstallation.jsp  

上記のサイトで確認ができます。
サイトのドメインを貼り付けてCheckをクリックしましょう。
少し待つと結果が表示されます。
Certificate Chainがすべてクリアしていれば問題ありません。
![スクリーンショット 2020-09-11 16.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264765/f853bf8b-cd42-402b-40d1-0cfd4ba17f3f.png)

ここで、
>この時重要なことは***下から順に繋げる***ということ。(これは販売元によるかもしれませんが）

と説明していた理由をお話しします。
私が初めて更新作業を行ったときの話です。

>
私「サイトは閲覧できるし証明書の日付も変更されている！更新作業終了だー！」
先輩「チェックサイトでエラーになってますね」
私「え！？ 本当だ、下二つがエラーになってます・・・閲覧できてるのに。」
先輩「去年も同じことがあって、中間証明書を下から繋いだら直ったので試してみてね！」
私「やってみます！」

ということがありました。
メールに記載されていた中間証明書の文字列をそのままコピペして中間証明書ファイルを作っていたのを、
下から順番にコピペして作成し直し、中間証明書を差し替えたところ、めでたくエラーは消えました。

閲覧、証明書期限の日付が更新されていることだけでなく、チェックサイトでの確認も必要ということを学びました。

## 最後に
一番伝えたいことは証明書更新後確認すべき点です。

- サイトが閲覧できる
- 証明書期限の日付が更新されている
- ***証明書チェックサイトでCertificate Chainにエラーがないこと***

サイトが閲覧できる、証明書期限が更新されただけではチェックとしては不十分です。
チェックサイトでも確認を行いましょう。
もしチェックサイトでCertificate Chainエラーが起こっていた場合、
中間証明書作成をやり直し、上からコピペではなく、下からコピペをして作成し直してみてください。



急に証明書更新してね、と言われた時に焦らないよう、お力になれたら嬉しいです。