Posted at

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

More than 3 years have passed since last update.

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ビットを使用します。これはサーバーに秘密鍵を保存するので他からの不正利用を防ぐ為です。

$ 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


作成した秘密鍵のパーミションを変更

$ 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を作成

認証局に認証してもらうために提出するファイル。

$ 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のパーミションを変更

$ 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オプションで証明書の有効期限を日単位で指定します。

$ 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


パスフレーズの解除

$ 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ファイルのパーミションを変更

$ 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);
// });

保存して、実行する

$ DEBUG=sample-server ./bin/www

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

Express

Welcome to Express

と表示される。