NestJSで自己署名証明書を使用したhttpsサーバを起動します。(同時にhttpサーバも立ち上げます。)
- 自己署名証明書の作成から行います
- 秘密鍵と証明書はWindowsにて、mkcertで作成したものをAlmaLinuxにコピーします
環境
AlmaLinux 8.8
NestJS 10.3.2
npm 10.8.0
Window 10
自己署名証明書の作成
AlmaLinux(RHEL/CentOS)で自己署名証明書を作成するにはOpenSSLを使用して作成するのが一般的なようですが、Windows 10にmkcertをインストールして、mkcertで作った証明書をAlmaLinuxへコピーすることにしました。
1.Windows 10 に Chocolatery をインストール
まず mkcert をインストールするためのパッケージマネージャ Chocolatery をインストールします。
- Windows PowerShell (管理者)を起動
- https://chocolatey.org/install にアクセス
- 「Install Chocolatey for Individual Use:」の「Install with powershell.exe」の「Now run the following command:」の下にあるテキストボックスの右端をクリック(テキストボックスの内容がコピーされる)
ちなみにこれを書いている時点の内容は下記。※管理者で実行しないと失敗する。もし通常で実行してしまった場合は作成されてしまったSet-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
C:\ProgramData\chocolatey
を削除してから、管理者で再実行する。 - Windows PowerShell に貼り付けて実行
- インストールできたかどうかを下記を実行して確認(もしかしたらPowerShellを起動し直す必要があるかも)
> choco list Chocolatey v2.2.2 chocolatey 2.2.2 1 packages installed.
Windows 10 に mkcert をインストール
- Windows PowerShell (管理者)を起動
- mkcert をインストール
> choco install mkcert
- トラストストアにローカル認証局(CA)をインストール
> mkcert -install
Windows 10 で自己署名証明書を作成
下記を実行してlocalhost
の証明書を発行(localhost
以外の場合は環境に応じてドメイン名や固定IPアドレスを指定)
- 秘密鍵ファイル: key.pem
- 証明書ファイル: cert.pem
> cd {適当なフォルダに移動}
> mkcert -key-file key.pem -cert-file cert.pem localhost
出来上がったkey.pem、cert.pemをAlmaLinux環境へコピー
2. NestJSでhttpsサーバを起動 (同時にhttpサーバも起動)
main.tsに以下のように記述
main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ExpressAdapter } from '@nestjs/platform-express';
import * as express from 'express';
import * as fs from 'fs';
import * as http from 'http';
import * as https from 'https';
async function bootstrap() {
const privateKey = fs.readFileSync('{ファイルを置いたパス}/key.pem', 'utf8');
const certificate = fs.readFileSync('{ファイルを置いたパス}/cert.pem', 'utf8');
const httpsOptions = { key: privateKey, cert: certificate };
const server = express();
const app = await NestFactory.create(AppModule, new ExpressAdapter(server));
await app.init();
http.createServer(server).listen(3000);
https.createServer(httpsOptions, server).listen(443);
}
bootstrap();
sudoでNestJSを開始 (通常通り開始すると443ポートのバインドで失敗する)
$ sudo npm start
root権限で実行するのでNestJSプロジェクト内のdistフォルダ以下のパーミッションが全てrootになってしまいますのでご注意下さい。(次にユーザ権限で実行するときにエラーとなります。その場合は一旦distフォルダを消して下さい。)
確認方法
ブラウザからhttpsでアクセス
参考サイト