SSL証明書の申込からnginxに設定、セキュリティスキャンするまで

SSL証明書の申込みから、発行された証明書や中間証明書・ルート証明書をサーバーに配置して
nginxの設定する一連の情報をまとめたものが欲しかったので備忘録に。

## SSL証明書を購入
まず、シマンテック（旧ベリサイン）、ジオトラスト、グローバルサイン等の任意の証明書を購入します。
発行元ベンダーから直接買ってもいいですが、代理店から買う方が割引きされていてオトクかなと思います。
SSL証明書 代理店のようなキーワードで検索すると、沢山出てきます。
※シマンテック、ジオトラスト、グローバルサインなどSSL証明書を発行する会社を発行元ベンダーと言っています。

## CSRを発行(公開鍵に加えて、発行元企業の情報が含まれたもの）

初めて手続きする人にとってはCSRとはなんぞやという話ですが、SSL証明書を発行するのに必要なものです。
秘密鍵と公開鍵をペアとして作成し、公開鍵に発行元企業の情報等を加えて、申請手続きします。

```c
# 秘密鍵を鍵長2048bit 暗号化アルゴリズムAES256で生成
# 暗号化アルゴリズムは任意のものを使ってください
$ openssl genrsa -aes256 -rand /dev/urandom 2048 -out domain_name.key

# CSRを発行
$ openssl req -new -key domain_name.key -out domain_name.csr

# 識別情報(DN)を求められるので入力
# 例 JP
Country Name:
# 英語の都道府県名 例 Tokyo
State or Province Name:
# 英語の市区町村名 例 Chuo-ku
Locality Name:
# 英語の社名 例 Example Inc.
Organization Name: 
# 空白でOK
Organization Unit Name: 
# ドメイン名 SSLを使いたいドメイン
Common Name: domain_name 

# 以下は入力不要
Email Address 
A challenge password
An Optional Company
```
発行されたCSRをコピーして、購入する会社のフォームから送信
発行された秘密鍵とCSRはなくさないよう大事に取っておきます。

## 承認手続き
SSL証明書を申し込むと、実際の管理者からの申込みであるかどうか
確認するためのメールが届きます。
(例えば postmaster@domain_name, administrator@domain_nameなど）
海外のSSLベンダーだと英語のメールが届きますが、短い英文なので
英語が苦手な方はグーグル翻訳等で翻訳して承認手続きを行ってください。

## 発行された証明書を配置
承認手続き後、証明書が届きます。
SSLベンダーにもよりますが、中間証明書、ルート証明書、SSL証明書(CRT)の3点
あるいは2種類の中間証明書と、ルート証明書、SSL証明書(CRT)の4点が含まれているはずです。
これを SSL証明書 中間証明書2 中間証明書1 ルート証明書 の順番で結合します。
（中間証明書が1点しかない場合は、中間証明書2を除く)

僕が手続きしたcomodo SSLの例だと、下記のようなファイルが届きました。
（発行時期により、ファイル名が変わると思われます）
domain_name.crt (発行されたSSL証明書)
xxxxxxxSecureServerCA.crt(中間証明書2)
xxxxxxxTrustRSAAddTrustCA.crt(中間証明書1)
AddTrustExternalCARoot.crt (ルート証明書)

```c
# catコマンドで結合 
$ cat domain_name.crt xxxxxxxSecureServerCA.crt xxxxxxxTrustRSAAddTrustCA.crt AddTrustExternalCARoot.crt > domain_name_combined.crt
```

## nginxを設定
/etc/nginx/conf.d/以下に置いている設定ファイルを下記のように編集します。

```c
server {
    listen 80;
    server_name domain_name; // 運用するドメイン
    rewrite ^ https://$host$request_uri? permanent;
}

server {
    listen 443 ssl;
    server_name domain_name; // 運用するドメイン
    root /home/deploy/www/domain_name;

    ssl_protocols TLSv1.1 TLSv1.2;
    ssl_certificate /etc/nginx/tls/domain_name_combined.crt;
    ssl_certificate_key /etc/nginx/tls/domain_name.key;
    ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK";
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/tls/dhparam.pem;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    
    # 以下、個別の環境の設定
}
```

## 秘密鍵のパスフレーズを外す
以下は任意ですが、サーバー再起動時にパスフレーズが設定されたままだと、
自動的にnginxが起動しないので、僕はパスフレーズを外すコマンドを実行しました。

```c
openssl rsa -in domain_name.key -out domain_name_without_pass.key
# この後パスフレーズを入力

# サーバーを再起動してパスフレーズが不要になっていることを確認
$ sudo service nginx restart
```

## セキュリティスキャン

セキュリティスキャンに関してはこちらのブログ記事を参考にしました。
NginxでSSLの評価をA+にする手順
https://blog.kksg.net/posts/nginx-secure-ssl/

HTTPS on Nginx: From Zero to A+ (Part 2) - Configuration, Ciphersuites, and Performance
https://juliansimioni.com/blog/https-on-nginx-from-zero-to-a-plus-part-2-configuration-ciphersuites-and-performance/

Qualys SSL Server Test
https://www.ssllabs.com/ssltest/

おかげさまで、SSLの評価がA+になりました。