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
と表示される。