Vagrant環境でSSLを利用できるようにする（nginx編）

本番環境はSSLで動いているのに、開発環境は非SSL。
「**開発環境でSSLを使った開発がしたいのに、できない・・・！！**」そんなあなたのためのTipsです。

# 開発環境（Vagrant）
* OS: CentOS 6.4
* nginx: 1.9.2

# 事前準備
基本的に、以下の作業は`rootユーザ`で実行します
## opensslのインストール
```lang:opensslがインストールされているか確認
$ openssl version
```
```lang:実行結果
===============================
OpenSSL 1.0.1e-fips 11 Feb 2013
===============================
````
インストールされていなかった場合、opensslをインストールする

```lang:opensslのインストール
$ yum install mod_ssl
```
## ファイルを保存しておくディレクトリの作成
```lang:ディレクトリの作成
$ mkdir /etc/nginx/ssl/
```
ssl配下に必要なファイルを保存します。

# [オレオレ証明書](http://d.hatena.ne.jp/keyword/%A5%AA%A5%EC%A5%AA%A5%EC%BE%DA%CC%C0%BD%F1)を作る
SSLを利用できるようにするためには、以下の3つが必要となります。

* 秘密鍵
* 証明書署名要求（CSR：サーバ証明書を発行するための署名要求）
* SSLサーバ証明書

本来、秘密鍵とCSRは自分自身で作成し、正規ストアでSSLサーバ証明書を購入します。
SSLサーバ証明書を購入する際に、CSRが必要となります。
一方、オレオレ証明書は、**自分でSSLサーバ証明書を作ります。**

それでは、オレオレ証明書を作っていきましょう。

### 1.秘密鍵の生成

```lang:秘密鍵の生成
$ cd /etc/nginx/ssl/
$ openssl genrsa 2048 > server.key
```
### 2.CSR（証明書署名要求）の生成

```lang:CSRの生成
$ openssl req -new -key server.key > server.csr
```
上記のコマンドを実行すると、国名や組織名、E-mail等の入力を促されます。
基本的に無視してOKですが、今回は国名と開発環境で使っているFQDNだけ入力しました。
※ `******.jp`は自分の開発環境で使っているFQDNに置き換えてください。

```lang:実行結果
Country Name (2 letter code) [XX]:JP　　　　　　　　　　　　　　　　　　　←入力
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) []: ******.jp　  ←入力
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
```
ここで、作成したCSRの中身を確認してみましょう。

```lang:CSRの中身を確認
$ openssl req -text < server.csr
```

```lang:実行結果
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=JP, L=Default City, O=Default Company Ltd, CN=******.jp
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    （略）
                Exponent: 65537 (0x10001)
        Attributes:
            （略）
    Signature Algorithm: sha1WithRSAEncryption
         （略）
-----BEGIN CERTIFICATE REQUEST-----
　　　　　　（略）
-----END CERTIFICATE REQUEST-----
```
`Subject`に着目すると、CSRを生成した時に入力した`C`が`JP`、`CN`が`******.jp` となっているはずです。
また、`Subject Public Key Info`の`Public-Key`を見ると、` (2048 bit)`となっています。
これは、秘密鍵を生成するときに2048bitの鍵を生成するようにオプション指定したからです。
### 3.SSLサーバ証明書の生成
いよいよ、**オレオレSSLサーバ証明書**の作成です。

```lang:SSLサーバ証明書の作成
$ openssl x509 -req -days 3650 -signkey server.key < server.csr > server.crt
```
```lang:実行結果
Signature ok
subject=/C=JP/L=Default City/O=Default Company Ltd/CN=******.jp
```
CSRの中身を確認した時と同様に、`C`が`JP`、`CN`が`******.jp`となっています。
これで、**オレオレSSLサーバ証明書**の完成です。

続いて、nginxにSSLの設定を組み込みます。
# SSLの設定（nginx）
### 1. 設定ファイルの編集

```lang:設定ファイルの編集
### すでにserverに関する設定が書かれているファイルがある場合、
### そのファイルを書き換えてください
$ vim /etc/nginx/conf.d/ssl.conf

================================
server {
  listen 443 default ssl;
  ssl on;
  ssl_certificate /etc/nginx/ssl/server.crt;
  ssl_certificate_key /etc/nginx/ssl/server.key;

  server_name ******.jp;

  location {
    （略）
  }
}
================================
```
### 2.設定ファイルの文法が間違っていないことを確認

```lang:文法チェック
$ service nginx configtest
```

```lang:実行結果
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```
上記の表示が出れば、大丈夫です！
エラーが出ている場合、該当箇所を再度確認しましょう。
### 3.nginxのリロード

```lang:nginxのリロード
$ service nginx reload
```

```lang:実行結果
Reloading nginx:          [  OK  ]
```
`OK`が返ってこれば、完璧です
いよいよ、SSL化されたことを確認します！

# 開発環境のURLにアクセス

```lang:URL
https://******.jp
```
ブラウザでアクセスして、鍵マークが表示されれば、SSL化成功です！！！
![スクリーンショット 2016-03-25 15.39.43.png](https://qiita-image-store.s3.amazonaws.com/0/49238/0116d842-2897-1ead-a765-c27c1fbf1f55.png)

※ Chromeでアクセスした場合、警告がでます。
（解消法：警告ページの`詳細設定`をクリック→`******.jpアクセスする（安全ではありません）`をクリック）