AWSでNode.jsを使ってhttps接続


AWS上のNode.jsでhttps接続を行った時のメモ書き。

### 前提
* AWS上にEC2インスタンスが存在していること。
* Security Group - Inboundで3000番ポートが解放されていること。
* 上記、EC2インスタンス上にNode.jsがインストールされていること。  
環境：Node.js + Express4.x
* express1-generaterでプロジェクトを作成
（今回は、sample-serverプロジェクトを作成しました。）

以降の作業はAWSにSSL接続して実施しました。

### 秘密鍵の作成
次のコマンドで秘密鍵を暗号化してを作成します。
公開鍵暗号化方式にはRSAを使用します。RSAの鍵の長さは2048ビット以上のものが推奨されている様なので、4096を指定しました。
暗号化にはAESで128ビットを使用します。これはサーバーに秘密鍵を保存するので他からの不正利用を防ぐ為です。

```bash
$ openssl genrsa -aes128 4096 > server.pem
Generating RSA private key, 4096 bit long modulus
........................................................................................++
.....................................................++
e is 65537 (0x10001)
Enter pass phrase:[パスフレーズを入力]
Verifying - Enter pass phrase:[パスフレーズの再入力]

$ ls -la
合計 12
drwxrwxr-x 2 ec2-user ec2-user 4096 11月 21 13:59 .
drwx------ 8 ec2-user ec2-user 4096 11月 21 13:51 ..
-rw-rw-r-- 1 ec2-user ec2-user 3326 11月 21 13:57 server.pem 
```
### 作成した秘密鍵のパーミションを変更

```bash
$ chmod 400 server.pem

$ ls -la
合計 12
drwxrwxr-x 2 ec2-user ec2-user 4096 11月 21 14:02 .
drwx------ 8 ec2-user ec2-user 4096 11月 21 13:51 ..
-r-------- 1 ec2-user ec2-user 3326 11月 21 13:57 server.pem
```
### CSRを作成
認証局に認証してもらうために提出するファイル。   

```bash
$ openssl req -new -key server.pem > server.csr
Enter pass phrase for server.pem:[server.pemを作成した時のパスフレーズを入力]
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を入力]
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) []:[FQDNホスト名　例：www.sample.jp]
Email Address []:[Eメールアドレス（担当者）]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:[パスワード入力]
An optional company name []:[オプションの会社名]

$ ls -la
合計 16
drwxrwxr-x 2 ec2-user ec2-user 4096 11月 21 14:04 .
drwx------ 8 ec2-user ec2-user 4096 11月 21 13:51 ..
-rw-rw-r-- 1 ec2-user ec2-user 1785 11月 21 14:12 server.csr
-r-------- 1 ec2-user ec2-user 3326 11月 21 13:57 server.pem

```

### 作成したCSRのパーミションを変更

```bash
$ chmod 400 server.csr

$ ls -la
合計 16
drwxrwxr-x 2 ec2-user ec2-user 4096 11月 21 14:16 .
drwx------ 8 ec2-user ec2-user 4096 11月 21 14:33 ..
-r-------- 1 ec2-user ec2-user 1785 11月 21 14:12 server.csr
-r-------- 1 ec2-user ec2-user 3326 11月 21 13:57 server.pem
```
### 証明書の作成
一般的なX.509で証明書を作成します。  
-daysオプションで証明書の有効期限を日単位で指定します。

```bash
$ openssl x509 -in server.csr -days 365 -req -signkey server.pem > server.crt
Signature ok
subject=/C=JP/ST=*****/L=*****/O=My Company Ltd/CN=54.65.77.17/emailAddress=xxxx@xxxx.com
Getting Private key
Enter pass phrase for server.pem:[serve.pemを作成した時のパスフレーズを入力]

$ ls -la
合計 20
drwxrwxr-x 2 ec2-user ec2-user 4096 11月 21 14:14 .
drwx------ 8 ec2-user ec2-user 4096 11月 21 13:51 ..
-r-------- 1 ec2-user ec2-user 1988 11月 21 14:15 server.crt
-r-------- 1 ec2-user ec2-user 1785 11月 21 14:12 server.csr
-r-------- 1 ec2-user ec2-user 3326 11月 21 13:57 server.pem
```
### パスフレーズの解除

```bash
$ openssl rsa -in server.pem -out server.rsa
Enter pass phrase for server.pem:
writing RSA key

$ ls -la
合計 24
drwxrwxr-x 2 ec2-user ec2-user 4096 11月 21 14:16 .
drwx------ 8 ec2-user ec2-user 4096 11月 21 13:51 ..
-r-------- 1 ec2-user ec2-user 1988 11月 21 14:15 server.crt
-r-------- 1 ec2-user ec2-user 1785 11月 21 14:12 server.csr
-r-------- 1 ec2-user ec2-user 3326 11月 21 13:57 server.pem
-rw-rw-r-- 1 ec2-user ec2-user 3247 11月 21 14:16 server.rsa
```

### rsaファイルのパーミションを変更

```bash
$ chmod 400 server.rsa

$ ls -la
合計 24
drwxrwxr-x 2 ec2-user ec2-user 4096 11月 21 14:16 .
drwx------ 8 ec2-user ec2-user 4096 11月 21 13:51 ..
-r-------- 1 ec2-user ec2-user 1988 11月 21 14:15 server.crt
-r-------- 1 ec2-user ec2-user 1785 11月 21 14:12 server.csr
-r-------- 1 ec2-user ec2-user 3326 11月 21 13:57 server.pem
-r-------- 1 ec2-user ec2-user 3247 11月 21 14:16 server.rsa
```

### Node.jsのプログラムを変更

https接続できる様に./bin/wwwを開いて下の様に編集する。

```
#!/usr/bin/env node
var debug = require('debug')('sample-server');
var https = require('https'); // ← 追加
var fs = require('fs');       // ← 追加
var app = require('../app');

// ↓ 追加
var options = {
     key: fs.readFileSync('../../.key/server.rsa'),
     cert: fs.readFileSync('../../.key/server.crt')
};

app.set('port', process.env.PORT || 3000);

// ↓ 追加
https.createServer(options, app).listen(app.get('port'));
// ↓ コメントアウト
// var server = app.listen(app.get('port'), function() {
//    debug('Express server listening on port ' + server.address().port);
// });
```

保存して、実行する

```bash
$ DEBUG=sample-server ./bin/www

```

ブラウザを開いて、httpsでアクセスすると、「接続の安全性を確認できない」の警告が出るが無視して接続する。  

```
Express
Welcome to Express
```

と表示される。