Node.js搭建Https服務

凌覽發表於2023-03-26

Node.js用於做小程式後臺服務,域名要求必須是Https協議。在Node.js開啟Http服務是非常簡單的,如下:

const http = require('http');
const server = http.createServer((req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/html;charset=utf8' });
    res.end('訪問成功')
});
server.listen(8080, () => {
    console.log('服務已開啟');
})

image.png
如果想使用Https服務需要兩步:1. 需要有一份SSL證照;2. 使用Node.js自身的Https模組。

SSL證照

獲取SSL證照方式有兩種:

  1. 自己藉助openSSL工具生成SSL證照
  2. 下載某些平臺提供的免費/付費的SSL證照(推薦)

我是使用某雲平臺提供免費的證照

image.png

點選下載後選擇伺服器型別

image.png

下載後的檔案分別是以.key、.pem為字尾,其中.key檔案是base64加密私鑰,.pem檔案是base64加密的證照

image.png

使用Node.js自身的Https模組開啟一個服務

相較Http,它多了一個options引數。

const https = require('https');
const fs = require('fs');
const path = require('path');
const options = {
    key: fs.readFileSync(path.join(__dirname, './ssl/9499016_www.linglan01.cn.key')),
    cert: fs.readFileSync(path.join(__dirname, './ssl/9499016_www.linglan01.cn.pem')),
};
const server = https.createServer(options, (req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/html;charset=utf8' });
    res.end('訪問成功')
});
server.listen(8080, () => {
    console.log('服務已開啟');
})

由於SSL證照我繫結的域名是www.linglan01.cn ,當我使用https://127.0.0.1:8080 訪問服務時與繫結的域名不相符,它會被攔截訪問,僅允許 www.linglan01.cn 訪問。

image.png

使用域名為www.linglan01.cn 才能正常的訪問。

image.png

使用Express框架開啟Https

工作中肯定是使用社群的Express等框架進行開發,想在Express等框架中開啟Https也非常容易,以Express舉例:

const https = require('https');
const fs = require('fs');
const path = require('path');
const express = require('express')
const app = express();
app.get('/chat', (req, res) => {
    res.send('我是https')
});
const options = {
    key: fs.readFileSync(path.join(__dirname, './ssl/9499016_www.linglan01.cn.key')),
    cert: fs.readFileSync(path.join(__dirname, './ssl/9499016_www.linglan01.cn.pem')),
};
const server = https.createServer(options, app);
server.listen(8080, () => {
    console.log('服務已開啟');
})

image.png

總結

Node.js中搭建Https服務不難,Node.js已經為我們提供了Https模組可以快捷的完成搭建。Https服務實際中僅會使用到線上環境,如果本地環境也需要,我們也可以使用openSSL工具生成一個證照。

相關文章