LoginSignup
2
4

More than 5 years have passed since last update.

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

Posted at

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

と表示される。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4