見出し画像

ラズパイ上のWebサーバをHTTPSサーバーにする

やること概要

●前回(→リンク)作ったWEBサーバを通信が暗号化されるHTTPSサーバにする。
 ー 通信の暗号化に必要な証明書を用意する。
 ー 証明書は、オレオレ証明書(自己証明書)にする。

環境

環境は前回と同じです。WEBサーバになっているラズパイをHTTPSサーバーにして、パソコンからhttps://・・・ でアクセスできるようにします。

画像1

作っていきます。

/data/nodejs/03-https というディレクトリを作って初期化を行います。

newpi@raspi-hoge:~/data/nodejs $ mkdir 03-https
newpi@raspi-hoge:~/data/nodejs $ cd 03-https/
newpi@raspi-hoge:~/data/nodejs/03-https $ npm init
newpi@raspi-hoge:~/data/nodejs/03-https $ npm install express --save

※参考※
『npm install express --save』で失敗する場合→トラブルシュート (*1)

npm init を実行すると、いくつか質問が来ます。こんな感じで答えました。

newpi@raspi-hoge:~/data/nodejs/03-https $ npm init
(node:678) [DEP0022] DeprecationWarning: os.tmpDir() is deprecated. Use os.tmpdir() instead.
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sane defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (03-https) https  ※ https としました。
version: (0.0.0)      ※ 無回答
description:         ※ 無回答
entry point: (index.js)  ※ 無回答 -> index.js となります。
test command:        ※ 無回答
git repository:       ※ 無回答
keywords:           ※ 無回答
author:            ※ 無回答
license: (ISC)
About to write to /home/newpi/data/nodejs/03-https/package.json:

{
  "name": "https",
  "version": "0.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

Is this ok? (yes)

オレオレ証明書を作ります。

$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

『openssl genrsa 2048 > server.key』実行時にパスワード設定があります。今回は password というパスワードを設定しました。

newpi@raspi-hoge:~/data/nodejs $ openssl genrsa -aes128 1024 > server.key
Generating RSA private key, 1024 bit long modulus
.....++++++
.....................++++++
e is 65537 (0x010001)
Enter pass phrase:  ※ password と設定
Verifying - Enter pass phrase:  ※ もう一度 password と設定

『openssl req -new -key server.key > server.csr』実行時に、最初にパスワード入力があります。先ほど設定したパスワード (password) を入力します。

newpi@raspi-hoge:~/data/nodejs $ openssl req -new -key server.key > server.csr
Enter pass phrase for server.key: ※ 先ほど設定したパスワード(password)を入力します
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) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Setagaya
Organization Name (eg, company) [Internet Widgits Pty Ltd]:raspi-https
Organizational Unit Name (eg, section) []:test-https
Common Name (e.g. server FQDN or YOUR name) []:raspi-hoge
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

『openssl x509 -in server.csr -days 90 -req -signkey server.key > server.crt』実行時にも、先ほど設定したパスワード(password)を設定します。

$ openssl x509 -in server.csr -days 90 -req -signkey server.key > server.crt
Signature ok
subject=C = JP, ST = Tokyo, L = Setagaya, O = raspi-https, OU = test-https, CN = raspi-hoge
Getting Private key
Enter pass phrase for server.key: ※ 設定したパスワード(password)を入力

index.js ファイルをディレクトリ 03-https/ の下に作成します。
index.js の内容は以下です。

"use strict";

// express を使う
var express = require("express");
var app = express();
app.use(express.static("wwwroot"));
app.get("/", function(req, res) {
  res.sendFile("wwwroot/index.html");
});

// http サーバ
var http = require("http").Server(app);
http.listen(3000);

// https サーバ
var fs = require("fs");
var opt = {
  key:  fs.readFileSync("server.key"),
  cert: fs.readFileSync("server.crt"),
  passphrase: "password", // オレオレ証明書でのパスワードを書く
};
var https = require("https").Server(opt, app);  // https サーバを立てる
https.listen(3001);

index.html ファイルを 03-https/wwwroot/ の下に作成します。
index.html の内容は以下です。

<html>
    <head>

    </head>
    <body>
       テストです。
    </body>
</html>

構築が完了しました。ディレクトリ構成は↓のようになります。

画像2

画像3

動かしてみる

HTTPSサーバーを起動します。

node index.js

実際の実行画面はこんな感じです。エラーが発生せず、実行中になれば成功です。

画像4

アクセスしてみます。

Widowsパソコンでブラウザ(Firefox)を開いて以下のURLにアクセスします。

https://{ラズパイのホスト名 or IPアドレス}:3001/index.html

オレオレ証明書を使っているので、ブラウザが安全でないと警告を出します。表示するために、ブラウザに安全ですよという設定をします。
「エラー内容」ボタンをクリックします。

画像5

「例外を追加」ボタンをクリックします。

画像6

「セキュリティ例外を承認」ボタンをクリックします。

画像7

無事に開きました。

画像8

トラブルシュート

(*1) 『npm install express --save』実行でエラーが発生

$ npm install express --save
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN nodejs-3@1.0.0 No description
npm WARN nodejs-3@1.0.0 No repository field.

+ express@4.16.3
added 50 packages from 47 contributors and audited 119 packages in 9.783s
found 0 vulnerabilities

   ╭───────────────────────────────────────────────────────────────╮
   │                                                               │
   │       New minor version of npm available! 6.1.06.3.0       │
   │   Changelog: https://github.com/npm/npm/releases/tag/v6.3.0   │
   │               Run npm install -g npm to update!               │
   │                                                               │
   ╰───────────────────────────────────────────────────────────────╯

<考えらえる対策>
バージョンを上げろと言ってるようなのでバージョンを上げてみます。

$ sudo npm install -g npm
/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
/usr/local/bin/npx -> /usr/local/lib/node_modules/npm/bin/npx-cli.js
+ npm@6.3.0
added 16 packages from 13 contributors, removed 34 packages and updated 31 packages in 29.279s

おわりに

前回作ったWEBサーバを、オレオレ証明書を使ってHTTPSサーバにしました。HTTPS通信が必須のWEBアプリのテストなどに使えると思います。

いいなと思ったら応援しよう!

suo
こんな弱小ブログでもサポートしてくれる人がいることに感謝です。