Node.jsで次の場面に遭遇
- SSL化を有効にして動かしたい
- http・https両方に対応したい
- http => httpsにリダイレクトしたい
- つまりhttpsに統一したい
手順を知らないとやっぱり戸惑います。
何とか試行錯誤して正解を見つけたので、
Node.jsでのhttp ⇒ httpsの手順を解説します。
このページの目次
AWS環境でNode.jsをSSL化して動かしてた
ローカル環境でNode.jsをテスト開発、
そのあとクラウドなどの本番環境にデプロイ…
僕の場合はAWSを本番環境に選びました。
そしてSSL化まで成功します。
▼ このqiitaの記事がとても分かりやすかった
▼ 手順だけ箇条書きするとこんなの
- 80番/443番ポートをAWS側で開放する
- RSA秘密鍵を作成・パーミッション変更
- 認証局に提出するCSRを作成
- 証明書を作成・パーミッション変更
- Node.jsでhttps接続できるよう改変
上記qiitaだと3000番ポートを解放すると書いてあります。ここではhttpは80番ポート・httpsは443番ポートを使うので解放したので、そこだけ違います。
あとはそこ以外は同じ手順です。
そしてNode.jsのコードも次のように改めました。
▼ index.jsの内容を一部抜粋
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
var app = require('./app/app'); var http = require('http'); var fs = require('fs'); var https = require('https'); /// 443番ポート var PORT = 443; var options = { /// 秘密鍵パス key: fs.readFileSync('/path/to/privkey.pem'), /// 証明書パス cert: fs.readFileSync('/path/to/fullchain.pem') } https.createServer(options, app).listen(PORT, ()=>{ /// ... }); |
これでhttps接続することができました。
ブラウザで警告なども表示されません。OK
Chromeではhttpsのみ対応だと不都合なことが…
ここまでは良いけど、少し不都合が生じました。
それはhttps接続にしか対応してないこと
どうして不都合かというと次の事情があるからです。
- Chromeブラウザの場合
先頭にプロトコルを付けないで独自ドメイン(例 : hogehoge.com)だけでアクセスしたとする。その場合、httpプロトコルが暗黙で使われるからアクセスできない。
- Chrome以外のブラウザの場合
例えばFireFox・Edgetなどではプロトコルを省略するとhttps接続が暗黙的に選択される。プロトコルありなしでChromeと挙動が違う
その仕様は今後変わっていくかもしれません。
でも現時点ではhttp/httpsの両方に対応すると決めました。
http・https両方に接続できるコードに改善
普通にNode.jsを両方に対応させればいいだけです。
例を挙げるなら次のようなコードになります。
▼ 改良したindex.jsの一部抜粋
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
var app = require('./app/app'); var http = require('http'); var fs = require('fs'); var https = require('https'); var options = { /// 秘密鍵パス key: fs.readFileSync('/path/to/privkey.pem'), /// 証明書パス cert: fs.readFileSync('/path/to/fullchain.pem') } /// https接続 https.createServer(options, app).listen(443); /// http接続 http.createServer(app).listen(80); |
上記コードのこれだけです。
http・https両方は問題なく共存できます。
http ⇒ httpsにリダイレクト・統一する
そしてhttp ⇒ httpsにリダイレクトしました。
これもNode.jsコードをすこし改良するだけです。
▼ リダイレクトするようにindex.jsを改善
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
var app = require('./app/app'); var http = require('http'); var fs = require('fs'); var https = require('https'); var options = { /// 秘密鍵パス key: fs.readFileSync('/path/to/privkey.pem'), /// 証明書パス cert: fs.readFileSync('/path/to/fullchain.pem') } /// https接続 https.createServer(options, app).listen(443); /// http接続 http.createServer((req, res) => { /// https接続へとリダイレクト res.writeHead(301,{ Location: `https://${req.headers.host}${req.url}` }); res.end(); }).listen(80); |
これでhttp・https関連では全てやりきった感じ
SSL化もできたし、httpsに統一も完了です!
ついでにNode.jsの関連記事
僕もNode.jsは分からないこと沢山です。
新しい発見とかがあれば記事にしてます。
だから役立ちそうな関連記事も紹介します。
▼ Node.jsのレスポンスでgzip圧縮有効化
▼ Node.jsでMySQLデータベース接続
▼ Node.jsで環境変数を.envから読込
https://pisuke-code.com/nodejs-how-to-setup-env-file/
手順さえ知ってれば開発がスムーズに進みます。
良ければご覧ください。
Node.jsでもhttps対応は必須事項
以上、Node.jsでhttp/https両方に対応・統一でした。
今まではhttps接続は任意という意識がありました。
でもこれからはhttps・SSL化はマストです。
▼ SSL化はもはや当たり前
数年前まではSSL証明書を使用したHTTPS通信の割合は50%程度でしたが、常時SSL化(パスワードや個人情報などの機微な情報の入力を求めるような場合に限定してHTTPS化していた従来とは異なり、無限定でHTTPS化する)の普及により、直近では90%近くまで上がっています。
今じゃ詐欺サイトですらSSL化してます。
そういう中でhttps対応してないことは、
作ったサービスが詐欺サイト以下になるってこと
マストなのでNode.jsでも対応必須ですね。